Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 46 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Batch Burn | 9015267 | 2 hrs ago | IN | 0 APE | 0.00121757 | ||||
Batch Burn | 9013829 | 3 hrs ago | IN | 0 APE | 0.00121757 | ||||
Batch Burn | 9012378 | 4 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 9007909 | 6 hrs ago | IN | 0 APE | 0.00100668 | ||||
Batch Burn | 9006730 | 6 hrs ago | IN | 0 APE | 0.00100663 | ||||
Batch Burn | 9006141 | 7 hrs ago | IN | 0 APE | 0.00143606 | ||||
Batch Burn | 9005902 | 7 hrs ago | IN | 0 APE | 0.0012176 | ||||
Batch Burn | 9005239 | 7 hrs ago | IN | 0 APE | 0.00100668 | ||||
Set Approval For... | 9005156 | 7 hrs ago | IN | 0 APE | 0.00117611 | ||||
Batch Burn | 9002035 | 9 hrs ago | IN | 0 APE | 0.00143609 | ||||
Batch Burn | 9001961 | 9 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8998837 | 11 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8998235 | 11 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8997859 | 11 hrs ago | IN | 0 APE | 0.0012179 | ||||
Batch Burn | 8997620 | 11 hrs ago | IN | 0 APE | 0.00143634 | ||||
Batch Burn | 8997531 | 11 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8997274 | 11 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8996441 | 12 hrs ago | IN | 0 APE | 0.00143609 | ||||
Batch Burn | 8996284 | 12 hrs ago | IN | 0 APE | 0.00143606 | ||||
Set Approval For... | 8996223 | 12 hrs ago | IN | 0 APE | 0.00117611 | ||||
Batch Burn | 8995226 | 13 hrs ago | IN | 0 APE | 0.00143609 | ||||
Batch Burn | 8994760 | 13 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8993986 | 13 hrs ago | IN | 0 APE | 0.00100635 | ||||
Batch Burn | 8992949 | 14 hrs ago | IN | 0 APE | 0.00100665 | ||||
Batch Burn | 8992889 | 14 hrs ago | IN | 0 APE | 0.00100665 |
Loading...
Loading
Contract Name:
LootChests
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import "@limitbreak/creator-token-standards/src/access/OwnableBasic.sol"; import "@limitbreak/creator-token-standards/src/erc1155c/ERC1155C.sol"; import "@limitbreak/creator-token-standards/src/programmable-royalties/BasicRoyalties.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./Recoverable.sol"; contract LootChests is OwnableBasic, ERC1155C, BasicRoyalties, Recoverable { using Strings for uint256; string public name; string public symbol; error AirdropFailed_RecipientAmountsMismatch(); error AirdropFailed_RecipientListEmpty(); error AirdropFailed_TooLarge(); error ExceedsMaxSupply(); error InvalidAmount(); error BurnNotEnabled(); event Burned(address indexed account, uint256 tokenId, uint256 amount); event BurnedBatch(address indexed account, uint256[] tokenId, uint256[] amount); mapping(uint256 => uint256) public maxTokenSupply; mapping(uint256 => uint256) private _totalSupply; bool public isBurnEnabled = false; constructor( address royaltyReceiver_, uint96 royaltyFeeNumerator_, string memory uri_, string memory name_, string memory symbol_ ) ERC1155OpenZeppelin(uri_) BasicRoyalties(royaltyReceiver_, royaltyFeeNumerator_) { name = name_; symbol = symbol_; _transferOwnership(royaltyReceiver_); } function setToken(uint256 tokenId, uint256 maxSupply) external onlyOwner { if (totalSupply(tokenId) == 0 || (maxTokenSupply[tokenId] > maxSupply && maxSupply >= totalSupply(tokenId))) { maxTokenSupply[tokenId] = maxSupply; } } function setUri(string calldata uri_) external onlyOwner { _setURI(uri_); } function setBurnable(bool isBurnable) external onlyOwner { isBurnEnabled = isBurnable; } function airdrop(uint256 tokenId, address[] calldata recipients, uint256[] calldata amounts) external onlyOwner { if (recipients.length > 100) revert AirdropFailed_TooLarge(); if (recipients.length == 0) revert AirdropFailed_RecipientListEmpty(); if (recipients.length != amounts.length) revert AirdropFailed_RecipientAmountsMismatch(); for (uint256 i = 0; i < recipients.length; i++) { if (amounts[i] == 0) revert InvalidAmount(); if (totalSupply(tokenId) + amounts[i] > maxTokenSupply[tokenId]) revert ExceedsMaxSupply(); _mint(recipients[i], tokenId, amounts[i], ""); _totalSupply[tokenId] += amounts[i]; } } function mint(uint256 tokenId, uint256 amount) external onlyOwner { if (amount == 0) revert InvalidAmount(); if (totalSupply(tokenId) + amount > maxTokenSupply[tokenId]) revert ExceedsMaxSupply(); _mint(_msgSender(), tokenId, amount, ""); _totalSupply[tokenId] += amount; } function burn(uint256 tokenId, uint256 amount) external { if (!isBurnEnabled) revert BurnNotEnabled(); if (amount == 0) revert InvalidAmount(); _burn(_msgSender(), tokenId, amount); _totalSupply[tokenId] -= amount; emit Burned(_msgSender(), tokenId, amount); } function batchBurn(uint256[] calldata tokenIds, uint256[] calldata amounts) external { if (!isBurnEnabled) revert BurnNotEnabled(); if (tokenIds.length == 0 || tokenIds.length != amounts.length) revert InvalidAmount(); _burnBatch(_msgSender(), tokenIds, amounts); for (uint256 i = 0; i < tokenIds.length; i++) { _totalSupply[tokenIds[i]] -= amounts[i]; } emit BurnedBatch(_msgSender(), tokenIds, amounts); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155C, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function totalSupply(uint256 tokenId_) public view returns (uint256) { return _totalSupply[tokenId_]; } function uri(uint256 tokenId_) public view override returns (string memory) { return string( abi.encodePacked( super.uri(tokenId_), tokenId_.toString(), ".json" ) ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./OwnablePermissions.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; abstract contract OwnableBasic is OwnablePermissions, Ownable { function _requireCallerIsContractOwner() internal view virtual override { _checkOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/utils/Context.sol"; abstract contract OwnablePermissions is Context { function _requireCallerIsContractOwner() internal view virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../utils/AutomaticValidatorTransferApproval.sol"; import "../utils/CreatorTokenBase.sol"; import "../token/erc1155/ERC1155OpenZeppelin.sol"; import {TOKEN_TYPE_ERC1155} from "@limitbreak/permit-c/src/Constants.sol"; /** * @title ERC1155C * @author Limit Break, Inc. * @notice Extends OpenZeppelin's ERC1155 implementation with Creator Token functionality, which * allows the contract owner to update the transfer validation logic by managing a security policy in * an external transfer validation security policy registry. See {CreatorTokenTransferValidator}. */ abstract contract ERC1155C is ERC1155OpenZeppelin, CreatorTokenBase, AutomaticValidatorTransferApproval { /** * @notice Overrides behavior of isApprovedFor all such that if an operator is not explicitly approved * for all, the contract owner can optionally auto-approve the 721-C transfer validator for transfers. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool isApproved) { isApproved = super.isApprovedForAll(owner, operator); if (!isApproved) { if (autoApproveTransfersFromValidator) { isApproved = operator == address(getTransferValidator()); } } } /** * @notice Indicates whether the contract implements the specified interface. * @dev Overrides supportsInterface in ERC165. * @param interfaceId The interface id * @return true if the contract implements the specified interface, false otherwise */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(ICreatorToken).interfaceId || interfaceId == type(ICreatorTokenLegacy).interfaceId || super.supportsInterface(interfaceId); } /** * @notice Returns the function selector for the transfer validator's validation function to be called * @notice for transaction simulation. */ function getTransferValidationFunction() external pure returns (bytes4 functionSignature, bool isViewFunction) { functionSignature = bytes4(keccak256("validateTransfer(address,address,address,uint256,uint256)")); isViewFunction = false; } /// @dev Ties the open-zeppelin _beforeTokenTransfer hook to more granular transfer validation logic function _beforeTokenTransfer( address /*operator*/, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory /*data*/ ) internal virtual override { uint256 idsArrayLength = ids.length; for (uint256 i = 0; i < idsArrayLength;) { _validateBeforeTransfer(from, to, ids[i], amounts[i]); unchecked { ++i; } } } /// @dev Ties the open-zeppelin _afterTokenTransfer hook to more granular transfer validation logic function _afterTokenTransfer( address /*operator*/, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory /*data*/ ) internal virtual override { uint256 idsArrayLength = ids.length; for (uint256 i = 0; i < idsArrayLength;) { _validateAfterTransfer(from, to, ids[i], amounts[i]); unchecked { ++i; } } } function _tokenType() internal pure override returns(uint16) { return uint16(TOKEN_TYPE_ERC1155); } } /** * @title ERC1155CInitializable * @author Limit Break, Inc. * @notice Initializable implementation of ERC1155C to allow for EIP-1167 proxy clones. */ abstract contract ERC1155CInitializable is ERC1155OpenZeppelinInitializable, CreatorTokenBase, AutomaticValidatorTransferApproval { function initializeERC1155(string memory uri_) public override { super.initializeERC1155(uri_); _emitDefaultTransferValidator(); _registerTokenType(getTransferValidator()); } /** * @notice Overrides behavior of isApprovedFor all such that if an operator is not explicitly approved * for all, the contract owner can optionally auto-approve the 721-C transfer validator for transfers. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool isApproved) { isApproved = super.isApprovedForAll(owner, operator); if (!isApproved) { if (autoApproveTransfersFromValidator) { isApproved = operator == address(getTransferValidator()); } } } /** * @notice Indicates whether the contract implements the specified interface. * @dev Overrides supportsInterface in ERC165. * @param interfaceId The interface id * @return true if the contract implements the specified interface, false otherwise */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(ICreatorToken).interfaceId || interfaceId == type(ICreatorTokenLegacy).interfaceId || super.supportsInterface(interfaceId); } /** * @notice Returns the function selector for the transfer validator's validation function to be called * @notice for transaction simulation. */ function getTransferValidationFunction() external pure returns (bytes4 functionSignature, bool isViewFunction) { functionSignature = bytes4(keccak256("validateTransfer(address,address,address,uint256,uint256)")); isViewFunction = false; } /// @dev Ties the open-zeppelin _beforeTokenTransfer hook to more granular transfer validation logic function _beforeTokenTransfer( address /*operator*/, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory /*data*/ ) internal virtual override { uint256 idsArrayLength = ids.length; for (uint256 i = 0; i < idsArrayLength;) { _validateBeforeTransfer(from, to, ids[i], amounts[i]); unchecked { ++i; } } } /// @dev Ties the open-zeppelin _afterTokenTransfer hook to more granular transfer validation logic function _afterTokenTransfer( address /*operator*/, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory /*data*/ ) internal virtual override { uint256 idsArrayLength = ids.length; for (uint256 i = 0; i < idsArrayLength;) { _validateAfterTransfer(from, to, ids[i], amounts[i]); unchecked { ++i; } } } function _tokenType() internal pure override returns(uint16) { return uint16(TOKEN_TYPE_ERC1155); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface ICreatorToken { event TransferValidatorUpdated(address oldValidator, address newValidator); function getTransferValidator() external view returns (address validator); function setTransferValidator(address validator) external; function getTransferValidationFunction() external view returns (bytes4 functionSignature, bool isViewFunction); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface ICreatorTokenLegacy { 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.4; interface ITransferValidator { function applyCollectionTransferPolicy(address caller, address from, address to) external view; function validateTransfer(address caller, address from, address to) external view; function validateTransfer(address caller, address from, address to, uint256 tokenId) external view; function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount) external; function beforeAuthorizedTransfer(address operator, address token, uint256 tokenId) external; function afterAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransfer(address operator, address token) external; function afterAuthorizedTransfer(address token) external; function beforeAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 amount) external; function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface ITransferValidatorSetTokenType { function setTokenTypeOfCollection(address collection, uint16 tokenType) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/common/ERC2981.sol"; /** * @title BasicRoyaltiesBase * @author Limit Break, Inc. * @dev Base functionality of an NFT mix-in contract implementing the most basic form of programmable royalties. */ abstract contract BasicRoyaltiesBase is ERC2981 { event DefaultRoyaltySet(address indexed receiver, uint96 feeNumerator); event TokenRoyaltySet(uint256 indexed tokenId, address indexed receiver, uint96 feeNumerator); function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual override { super._setDefaultRoyalty(receiver, feeNumerator); emit DefaultRoyaltySet(receiver, feeNumerator); } function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual override { super._setTokenRoyalty(tokenId, receiver, feeNumerator); emit TokenRoyaltySet(tokenId, receiver, feeNumerator); } } /** * @title BasicRoyalties * @author Limit Break, Inc. * @notice Constructable BasicRoyalties Contract implementation. */ abstract contract BasicRoyalties is BasicRoyaltiesBase { constructor(address receiver, uint96 feeNumerator) { _setDefaultRoyalty(receiver, feeNumerator); } } /** * @title BasicRoyaltiesInitializable * @author Limit Break, Inc. * @notice Initializable BasicRoyalties Contract implementation to allow for EIP-1167 clones. */ abstract contract BasicRoyaltiesInitializable is BasicRoyaltiesBase {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../../access/OwnablePermissions.sol"; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; abstract contract ERC1155OpenZeppelinBase is ERC1155 { } abstract contract ERC1155OpenZeppelin is ERC1155OpenZeppelinBase { constructor(string memory uri_) ERC1155(uri_) {} } abstract contract ERC1155OpenZeppelinInitializable is OwnablePermissions, ERC1155OpenZeppelinBase { error ERC1155OpenZeppelinInitializable__AlreadyInitializedERC1155(); bool private _erc1155Initialized; function initializeERC1155(string memory uri_) public virtual { _requireCallerIsContractOwner(); if(_erc1155Initialized) { revert ERC1155OpenZeppelinInitializable__AlreadyInitializedERC1155(); } _erc1155Initialized = true; _setURI(uri_); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../access/OwnablePermissions.sol"; /** * @title AutomaticValidatorTransferApproval * @author Limit Break, Inc. * @notice Base contract mix-in that provides boilerplate code giving the contract owner the * option to automatically approve a 721-C transfer validator implementation for transfers. */ abstract contract AutomaticValidatorTransferApproval is OwnablePermissions { /// @dev Emitted when the automatic approval flag is modified by the creator. event AutomaticApprovalOfTransferValidatorSet(bool autoApproved); /// @dev If true, the collection's transfer validator is automatically approved to transfer holder's tokens. bool public autoApproveTransfersFromValidator; /** * @notice Sets if the transfer validator is automatically approved as an operator for all token owners. * * @dev Throws when the caller is not the contract owner. * * @param autoApprove If true, the collection's transfer validator will be automatically approved to * transfer holder's tokens. */ function setAutomaticApprovalOfTransfersFromValidator(bool autoApprove) external { _requireCallerIsContractOwner(); autoApproveTransfersFromValidator = autoApprove; emit AutomaticApprovalOfTransferValidatorSet(autoApprove); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../access/OwnablePermissions.sol"; import "../interfaces/ICreatorToken.sol"; import "../interfaces/ICreatorTokenLegacy.sol"; import "../interfaces/ITransferValidator.sol"; import "./TransferValidation.sol"; import "../interfaces/ITransferValidatorSetTokenType.sol"; /** * @title CreatorTokenBase * @author Limit Break, Inc. * @notice CreatorTokenBaseV3 is an abstract contract that provides basic functionality for managing token * transfer policies through an implementation of ICreatorTokenTransferValidator/ICreatorTokenTransferValidatorV2/ICreatorTokenTransferValidatorV3. * This contract is intended to be used as a base for creator-specific token contracts, enabling customizable transfer * restrictions and security policies. * * <h4>Features:</h4> * <ul>Ownable: This contract can have an owner who can set and update the transfer validator.</ul> * <ul>TransferValidation: Implements the basic token transfer validation interface.</ul> * * <h4>Benefits:</h4> * <ul>Provides a flexible and modular way to implement custom token transfer restrictions and security policies.</ul> * <ul>Allows creators to enforce policies such as account and codehash blacklists, whitelists, and graylists.</ul> * <ul>Can be easily integrated into other token contracts as a base contract.</ul> * * <h4>Intended Usage:</h4> * <ul>Use as a base contract for creator token implementations that require advanced transfer restrictions and * security policies.</ul> * <ul>Set and update the ICreatorTokenTransferValidator implementation contract to enforce desired policies for the * creator token.</ul> * * <h4>Compatibility:</h4> * <ul>Backward and Forward Compatible - V1/V2/V3 Creator Token Base will work with V1/V2/V3 Transfer Validators.</ul> */ abstract contract CreatorTokenBase is OwnablePermissions, TransferValidation, ICreatorToken { /// @dev Thrown when setting a transfer validator address that has no deployed code. error CreatorTokenBase__InvalidTransferValidatorContract(); /// @dev The default transfer validator that will be used if no transfer validator has been set by the creator. address public constant DEFAULT_TRANSFER_VALIDATOR = address(0x721C002B0059009a671D00aD1700c9748146cd1B); /// @dev Used to determine if the default transfer validator is applied. /// @dev Set to true when the creator sets a transfer validator address. bool private isValidatorInitialized; /// @dev Address of the transfer validator to apply to transactions. address private transferValidator; constructor() { _emitDefaultTransferValidator(); _registerTokenType(DEFAULT_TRANSFER_VALIDATOR); } /** * @notice Sets the transfer validator for the token contract. * * @dev Throws when provided validator contract is not the zero address and does not have code. * @dev Throws when the caller is not the contract owner. * * @dev <h4>Postconditions:</h4> * 1. The transferValidator address is updated. * 2. The `TransferValidatorUpdated` event is emitted. * * @param transferValidator_ The address of the transfer validator contract. */ function setTransferValidator(address transferValidator_) public { _requireCallerIsContractOwner(); bool isValidTransferValidator = transferValidator_.code.length > 0; if(transferValidator_ != address(0) && !isValidTransferValidator) { revert CreatorTokenBase__InvalidTransferValidatorContract(); } emit TransferValidatorUpdated(address(getTransferValidator()), transferValidator_); isValidatorInitialized = true; transferValidator = transferValidator_; _registerTokenType(transferValidator_); } /** * @notice Returns the transfer validator contract address for this token contract. */ function getTransferValidator() public view override returns (address validator) { validator = transferValidator; if (validator == address(0)) { if (!isValidatorInitialized) { validator = DEFAULT_TRANSFER_VALIDATOR; } } } /** * @dev Pre-validates a token transfer, reverting if the transfer is not allowed by this token's security policy. * Inheriting contracts are responsible for overriding the _beforeTokenTransfer function, or its equivalent * and calling _validateBeforeTransfer so that checks can be properly applied during token transfers. * * @dev Be aware that if the msg.sender is the transfer validator, the transfer is automatically permitted, as the * transfer validator is expected to pre-validate the transfer. * * @dev Throws when the transfer doesn't comply with the collection's transfer policy, if the transferValidator is * set to a non-zero address. * * @param caller The address of the caller. * @param from The address of the sender. * @param to The address of the receiver. * @param tokenId The token id being transferred. */ function _preValidateTransfer( address caller, address from, address to, uint256 tokenId, uint256 /*value*/) internal virtual override { address validator = getTransferValidator(); if (validator != address(0)) { if (msg.sender == validator) { return; } ITransferValidator(validator).validateTransfer(caller, from, to, tokenId); } } /** * @dev Pre-validates a token transfer, reverting if the transfer is not allowed by this token's security policy. * Inheriting contracts are responsible for overriding the _beforeTokenTransfer function, or its equivalent * and calling _validateBeforeTransfer so that checks can be properly applied during token transfers. * * @dev Be aware that if the msg.sender is the transfer validator, the transfer is automatically permitted, as the * transfer validator is expected to pre-validate the transfer. * * @dev Used for ERC20 and ERC1155 token transfers which have an amount value to validate in the transfer validator. * @dev The `tokenId` for ERC20 tokens should be set to `0`. * * @dev Throws when the transfer doesn't comply with the collection's transfer policy, if the transferValidator is * set to a non-zero address. * * @param caller The address of the caller. * @param from The address of the sender. * @param to The address of the receiver. * @param tokenId The token id being transferred. * @param amount The amount of token being transferred. */ function _preValidateTransfer( address caller, address from, address to, uint256 tokenId, uint256 amount, uint256 /*value*/) internal virtual override { address validator = getTransferValidator(); if (validator != address(0)) { if (msg.sender == validator) { return; } ITransferValidator(validator).validateTransfer(caller, from, to, tokenId, amount); } } function _tokenType() internal virtual pure returns(uint16); function _registerTokenType(address validator) internal { if (validator != address(0)) { uint256 validatorCodeSize; assembly { validatorCodeSize := extcodesize(validator) } if(validatorCodeSize > 0) { try ITransferValidatorSetTokenType(validator).setTokenTypeOfCollection(address(this), _tokenType()) { } catch { } } } } /** * @dev Used during contract deployment for constructable and cloneable creator tokens * @dev to emit the `TransferValidatorUpdated` event signaling the validator for the contract * @dev is the default transfer validator. */ function _emitDefaultTransferValidator() internal { emit TransferValidatorUpdated(address(0), DEFAULT_TRANSFER_VALIDATOR); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/utils/Context.sol"; /** * @title TransferValidation * @author Limit Break, Inc. * @notice A mix-in that can be combined with ERC-721 contracts to provide more granular hooks. * Openzeppelin's ERC721 contract only provides hooks for before and after transfer. This allows * developers to validate or customize transfers within the context of a mint, a burn, or a transfer. */ abstract contract TransferValidation is Context { /// @dev Thrown when the from and to address are both the zero address. error ShouldNotMintToBurnAddress(); /*************************************************************************/ /* Transfers Without Amounts */ /*************************************************************************/ /// @dev Inheriting contracts should call this function in the _beforeTokenTransfer function to get more granular hooks. function _validateBeforeTransfer(address from, address to, uint256 tokenId) internal virtual { bool fromZeroAddress = from == address(0); bool toZeroAddress = to == address(0); if(fromZeroAddress && toZeroAddress) { revert ShouldNotMintToBurnAddress(); } else if(fromZeroAddress) { _preValidateMint(_msgSender(), to, tokenId, msg.value); } else if(toZeroAddress) { _preValidateBurn(_msgSender(), from, tokenId, msg.value); } else { _preValidateTransfer(_msgSender(), from, to, tokenId, msg.value); } } /// @dev Inheriting contracts should call this function in the _afterTokenTransfer function to get more granular hooks. function _validateAfterTransfer(address from, address to, uint256 tokenId) internal virtual { bool fromZeroAddress = from == address(0); bool toZeroAddress = to == address(0); if(fromZeroAddress && toZeroAddress) { revert ShouldNotMintToBurnAddress(); } else if(fromZeroAddress) { _postValidateMint(_msgSender(), to, tokenId, msg.value); } else if(toZeroAddress) { _postValidateBurn(_msgSender(), from, tokenId, msg.value); } else { _postValidateTransfer(_msgSender(), from, to, tokenId, msg.value); } } /// @dev Optional validation hook that fires before a mint function _preValidateMint(address caller, address to, uint256 tokenId, uint256 value) internal virtual {} /// @dev Optional validation hook that fires after a mint function _postValidateMint(address caller, address to, uint256 tokenId, uint256 value) internal virtual {} /// @dev Optional validation hook that fires before a burn function _preValidateBurn(address caller, address from, uint256 tokenId, uint256 value) internal virtual {} /// @dev Optional validation hook that fires after a burn function _postValidateBurn(address caller, address from, uint256 tokenId, uint256 value) internal virtual {} /// @dev Optional validation hook that fires before a transfer function _preValidateTransfer(address caller, address from, address to, uint256 tokenId, uint256 value) internal virtual {} /// @dev Optional validation hook that fires after a transfer function _postValidateTransfer(address caller, address from, address to, uint256 tokenId, uint256 value) internal virtual {} /*************************************************************************/ /* Transfers With Amounts */ /*************************************************************************/ /// @dev Inheriting contracts should call this function in the _beforeTokenTransfer function to get more granular hooks. function _validateBeforeTransfer(address from, address to, uint256 tokenId, uint256 amount) internal virtual { bool fromZeroAddress = from == address(0); bool toZeroAddress = to == address(0); if(fromZeroAddress && toZeroAddress) { revert ShouldNotMintToBurnAddress(); } else if(fromZeroAddress) { _preValidateMint(_msgSender(), to, tokenId, amount, msg.value); } else if(toZeroAddress) { _preValidateBurn(_msgSender(), from, tokenId, amount, msg.value); } else { _preValidateTransfer(_msgSender(), from, to, tokenId, amount, msg.value); } } /// @dev Inheriting contracts should call this function in the _afterTokenTransfer function to get more granular hooks. function _validateAfterTransfer(address from, address to, uint256 tokenId, uint256 amount) internal virtual { bool fromZeroAddress = from == address(0); bool toZeroAddress = to == address(0); if(fromZeroAddress && toZeroAddress) { revert ShouldNotMintToBurnAddress(); } else if(fromZeroAddress) { _postValidateMint(_msgSender(), to, tokenId, amount, msg.value); } else if(toZeroAddress) { _postValidateBurn(_msgSender(), from, tokenId, amount, msg.value); } else { _postValidateTransfer(_msgSender(), from, to, tokenId, amount, msg.value); } } /// @dev Optional validation hook that fires before a mint function _preValidateMint(address caller, address to, uint256 tokenId, uint256 amount, uint256 value) internal virtual {} /// @dev Optional validation hook that fires after a mint function _postValidateMint(address caller, address to, uint256 tokenId, uint256 amount, uint256 value) internal virtual {} /// @dev Optional validation hook that fires before a burn function _preValidateBurn(address caller, address from, uint256 tokenId, uint256 amount, uint256 value) internal virtual {} /// @dev Optional validation hook that fires after a burn function _postValidateBurn(address caller, address from, uint256 tokenId, uint256 amount, uint256 value) internal virtual {} /// @dev Optional validation hook that fires before a transfer function _preValidateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount, uint256 value) internal virtual {} /// @dev Optional validation hook that fires after a transfer function _postValidateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount, uint256 value) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Constant bytes32 value of 0x000...000 bytes32 constant ZERO_BYTES32 = bytes32(0); /// @dev Constant value of 0 uint256 constant ZERO = 0; /// @dev Constant value of 1 uint256 constant ONE = 1; /// @dev Constant value representing an open order in storage uint8 constant ORDER_STATE_OPEN = 0; /// @dev Constant value representing a filled order in storage uint8 constant ORDER_STATE_FILLED = 1; /// @dev Constant value representing a cancelled order in storage uint8 constant ORDER_STATE_CANCELLED = 2; /// @dev Constant value representing the ERC721 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC721 = 721; /// @dev Constant value representing the ERC1155 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC1155 = 1155; /// @dev Constant value representing the ERC20 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC20 = 20; /// @dev Constant value to mask the upper bits of a signature that uses a packed `vs` value to extract `s` bytes32 constant UPPER_BIT_MASK = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @dev EIP-712 typehash used for validating signature based stored approvals bytes32 constant UPDATE_APPROVAL_TYPEHASH = keccak256("UpdateApprovalBySignature(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 approvalExpiration,uint256 sigDeadline,uint256 masterNonce)"); /// @dev EIP-712 typehash used for validating a single use permit without additional data bytes32 constant SINGLE_USE_PERMIT_TYPEHASH = keccak256("PermitTransferFrom(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 expiration,uint256 masterNonce)"); /// @dev EIP-712 typehash used for validating a single use permit with additional data string constant SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB = "PermitTransferFromWithAdditionalData(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 expiration,uint256 masterNonce,"; /// @dev EIP-712 typehash used for validating an order permit that updates storage as it fills string constant PERMIT_ORDER_ADVANCED_TYPEHASH_STUB = "PermitOrderWithAdditionalData(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 salt,address operator,uint256 expiration,uint256 masterNonce,"; /// @dev Pausable flag for stored approval transfers of ERC721 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721 = 1 << 0; /// @dev Pausable flag for stored approval transfers of ERC1155 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155 = 1 << 1; /// @dev Pausable flag for stored approval transfers of ERC20 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20 = 1 << 2; /// @dev Pausable flag for single use permit transfers of ERC721 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721 = 1 << 3; /// @dev Pausable flag for single use permit transfers of ERC1155 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155 = 1 << 4; /// @dev Pausable flag for single use permit transfers of ERC20 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20 = 1 << 5; /// @dev Pausable flag for order fill transfers of ERC1155 assets uint256 constant PAUSABLE_ORDER_TRANSFER_FROM_ERC1155 = 1 << 6; /// @dev Pausable flag for order fill transfers of ERC20 assets uint256 constant PAUSABLE_ORDER_TRANSFER_FROM_ERC20 = 1 << 7;
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) pragma solidity ^0.8.0; import "../token/ERC1155/IERC1155.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "../../interfaces/IERC2981.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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 `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @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 will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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://diligence.consensys.net/posts/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.5.11/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 isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "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 // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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 // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import "@openzeppelin/contracts/interfaces/IERC20.sol"; import "@openzeppelin/contracts/interfaces/IERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC1155.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; abstract contract Recoverable is Ownable { event RecoveredERC20(address indexed token, uint256 amount); event RecoveredERC721(address indexed token, uint256 indexed tokenId); event RecoveredERC1155(address indexed token, uint256 indexed tokenId, uint256 amount); error InvalidTokenAddress(); error NothingToRecover(); function recoverERC1155(address tokenAddress, uint256 tokenId) external onlyOwner { if (tokenAddress == address(0)) revert InvalidTokenAddress(); IERC1155 token = IERC1155(tokenAddress); uint256 balance = token.balanceOf(address(this), tokenId); if (balance == 0) revert NothingToRecover(); token.safeTransferFrom(address(this), owner(), tokenId, balance, ""); emit RecoveredERC1155(tokenAddress, tokenId, balance); } function recoverERC20(address tokenAddress) external onlyOwner { if (tokenAddress == address(0)) revert InvalidTokenAddress(); IERC20 token = IERC20(tokenAddress); uint256 balance = token.balanceOf(address(this)); if (balance == 0) revert NothingToRecover(); token.transfer(owner(), balance); emit RecoveredERC20(tokenAddress, balance); } function recoverERC721(address tokenAddress, uint256 tokenId) external onlyOwner { if (tokenAddress == address(0)) revert InvalidTokenAddress(); IERC721 token = IERC721(tokenAddress); address ownerOfToken = token.ownerOf(tokenId); if (ownerOfToken != address(this)) revert NothingToRecover(); token.safeTransferFrom(address(this), owner(), tokenId); emit RecoveredERC721(tokenAddress, tokenId); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"royaltyReceiver_","type":"address"},{"internalType":"uint96","name":"royaltyFeeNumerator_","type":"uint96"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AirdropFailed_RecipientAmountsMismatch","type":"error"},{"inputs":[],"name":"AirdropFailed_RecipientListEmpty","type":"error"},{"inputs":[],"name":"AirdropFailed_TooLarge","type":"error"},{"inputs":[],"name":"BurnNotEnabled","type":"error"},{"inputs":[],"name":"CreatorTokenBase__InvalidTransferValidatorContract","type":"error"},{"inputs":[],"name":"ExceedsMaxSupply","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidTokenAddress","type":"error"},{"inputs":[],"name":"NothingToRecover","type":"error"},{"inputs":[],"name":"ShouldNotMintToBurnAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"autoApproved","type":"bool"}],"name":"AutomaticApprovalOfTransferValidatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"BurnedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"DefaultRoyaltySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoveredERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoveredERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"RecoveredERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"TokenRoyaltySet","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":"values","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":"value","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"},{"inputs":[],"name":"DEFAULT_TRANSFER_VALIDATOR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoApproveTransfersFromValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","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":"validator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isApproved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","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":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"autoApprove","type":"bool"}],"name":"setAutomaticApprovalOfTransfersFromValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBurnable","type":"bool"}],"name":"setBurnable","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":"maxSupply","type":"uint256"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"transferValidator_","type":"address"}],"name":"setTransferValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setUri","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600b805460ff191690553480156200001b57600080fd5b5060405162003b0a38038062003b0a8339810160408190526200003e9162000421565b848484806200004d81620000c7565b506200005b905033620000d9565b620000656200012b565b6200008473721c002b0059009a671d00ad1700c9748146cd1b6200017a565b62000090828262000200565b5060079050620000a1838262000583565b506008620000b0828262000583565b50620000bc85620000d9565b50505050506200064f565b6002620000d5828262000583565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516000815273721c002b0059009a671d00ad1700c9748146cd1b60208201527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac910160405180910390a1565b6001600160a01b03811615620001fd57803b8015620000d5576040805163fb2de5d760e01b8152306004820152610483602482015290516001600160a01b0384169163fb2de5d791604480830192600092919082900301818387803b158015620001e357600080fd5b505af1925050508015620001f5575060015b15620000d557505b50565b6200020c828262000257565b6040516001600160601b03821681526001600160a01b038316907f8a8bae378cb731c5c40b632330c6836c2f916f48edb967699c86736f9a6a76ef9060200160405180910390a25050565b6127106001600160601b0382161115620002cb5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003235760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620002c2565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600555565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200038457600080fd5b81516001600160401b0380821115620003a157620003a16200035c565b604051601f8301601f19908116603f01168101908282118183101715620003cc57620003cc6200035c565b81604052838152602092508683858801011115620003e957600080fd5b600091505b838210156200040d5785820183015181830184015290820190620003ee565b600093810190920192909252949350505050565b600080600080600060a086880312156200043a57600080fd5b85516001600160a01b03811681146200045257600080fd5b60208701519095506001600160601b03811681146200047057600080fd5b60408701519094506001600160401b03808211156200048e57600080fd5b6200049c89838a0162000372565b94506060880151915080821115620004b357600080fd5b620004c189838a0162000372565b93506080880151915080821115620004d857600080fd5b50620004e78882890162000372565b9150509295509295909350565b600181811c908216806200050957607f821691505b6020821081036200052a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200057e57600081815260208120601f850160051c81016020861015620005595750805b601f850160051c820191505b818110156200057a5782815560010162000565565b5050505b505050565b81516001600160401b038111156200059f576200059f6200035c565b620005b781620005b08454620004f4565b8462000530565b602080601f831160018114620005ef5760008415620005d65750858301515b600019600386901b1c1916600185901b1785556200057a565b600085815260208120601f198616915b828110156200062057888601518255948401946001909101908401620005ff565b50858210156200063f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6134ab806200065f6000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c80636221d13c1161011a5780639e8c708e116100ad578063bd85b0391161007c578063bd85b03914610491578063d5516e7f146104b1578063e985e9c5146104c4578063f242432a146104d7578063f2fde38b146104ea57600080fd5b80639e8c708e14610445578063a22cb46514610458578063a9fc664e1461046b578063b390c0ab1461047e57600080fd5b80638da5cb5b116100e95780638da5cb5b1461040657806395d89b41146104175780639b642de11461041f5780639e05d2401461043257600080fd5b80636221d13c146103c4578063715018a6146103d857806380929e5b146103e0578063819d4cc6146103f357600080fd5b80630e89341c1161019d5780632eb2c2d61161016c5780632eb2c2d61461034b57806336f5cba51461035e5780634e1273f41461037e5780635aed66dd1461039e5780635c654ad9146103b157600080fd5b80630e89341c146102e05780631b2ef1ca146102f357806320ec271b146103065780632a55205a1461031957600080fd5b806306fdde03116101d957806306fdde031461029b57806307ebec27146102b0578063098144d4146102bd5780630d705df6146102c557600080fd5b8062fdd58e1461020a578063014635461461023057806301ffc9a71461026357806304634d8d14610286575b600080fd5b61021d61021836600461271e565b6104fd565b6040519081526020015b60405180910390f35b61024b73721c002b0059009a671d00ad1700c9748146cd1b81565b6040516001600160a01b039091168152602001610227565b610276610271366004612760565b610596565b6040519015158152602001610227565b610299610294366004612784565b6105a1565b005b6102a36105b7565b6040516102279190612819565b600b546102769060ff1681565b61024b610645565b60408051631854b24160e01b81526000602082015201610227565b6102a36102ee36600461282c565b610681565b610299610301366004612845565b6106bc565b6102996103143660046128ab565b61076c565b61032c610327366004612845565b6108ec565b604080516001600160a01b039093168352602083019190915201610227565b610299610359366004612a5f565b61099a565b61021d61036c36600461282c565b60096020526000908152604090205481565b61039161038c366004612b0c565b6109e6565b6040516102279190612c13565b6102996103ac366004612845565b610b0f565b6102996103bf36600461271e565b610b6f565b60045461027690600160a01b900460ff1681565b610299610d1a565b6102996103ee366004612c34565b610d2e565b61029961040136600461271e565b610d49565b6003546001600160a01b031661024b565b6102a3610ed6565b61029961042d366004612c51565b610ee3565b610299610440366004612c34565b610f2a565b610299610453366004612cc2565b610f8a565b610299610466366004612cdf565b611124565b610299610479366004612cc2565b61112f565b61029961048c366004612845565b6111f4565b61021d61049f36600461282c565b6000908152600a602052604090205490565b6102996104bf366004612d0d565b6112a6565b6102766104d2366004612d86565b611471565b6102996104e5366004612db4565b6114d5565b6102996104f8366004612cc2565b61151a565b60006001600160a01b03831661056d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061059082611593565b6105a96115b8565b6105b38282611612565b5050565b600780546105c490612e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546105f090612e1c565b801561063d5780601f106106125761010080835404028352916020019161063d565b820191906000526020600020905b81548152906001019060200180831161062057829003601f168201915b505050505081565b6004546001600160a01b03168061067e57600354600160a01b900460ff1661067e575073721c002b0059009a671d00ad1700c9748146cd1b5b90565b606061068c82611660565b610695836116f4565b6040516020016106a6929190612e56565b6040516020818303038152906040529050919050565b6106c46115b8565b806000036106e55760405163162908e360e11b815260040160405180910390fd5b600082815260096020908152604080832054600a9092529091205461070b908390612eab565b111561072a5760405163c30436e960e01b815260040160405180910390fd5b61074533838360405180602001604052806000815250611786565b6000828152600a602052604081208054839290610763908490612eab565b90915550505050565b600b5460ff1661078f57604051632b7e2ae360e01b815260040160405180910390fd5b82158061079c5750828114155b156107ba5760405163162908e360e11b815260040160405180910390fd5b61082833858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208089028281018201909352888252909350889250879182918501908490808284376000920191909152506118b892505050565b60005b8381101561089e5782828281811061084557610845612ebe565b90506020020135600a600087878581811061086257610862612ebe565b90506020020135815260200190815260200160002060008282546108869190612ed4565b9091555081905061089681612ee7565b91505061082b565b50336001600160a01b03167f5c9b7f613a622104f08e605548b653df10c7e4f860716265d9e3f69dbfb64b26858585856040516108de9493929190612f32565b60405180910390a250505050565b60008281526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109615750604080518082019091526005546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610980906001600160601b031687612f64565b61098a9190612f7b565b91519350909150505b9250929050565b6001600160a01b0385163314806109b657506109b68533611471565b6109d25760405162461bcd60e51b815260040161056490612f9d565b6109df8585858585611a64565b5050505050565b60608151835114610a4b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610564565b600083516001600160401b03811115610a6657610a66612916565b604051908082528060200260200182016040528015610a8f578160200160208202803683370190505b50905060005b8451811015610b0757610ada858281518110610ab357610ab3612ebe565b6020026020010151858381518110610acd57610acd612ebe565b60200260200101516104fd565b828281518110610aec57610aec612ebe565b6020908102919091010152610b0081612ee7565b9050610a95565b509392505050565b610b176115b8565b6000828152600a60205260409020541580610b58575060008281526009602052604090205481108015610b5857506000828152600a60205260409020548110155b156105b35760009182526009602052604090912055565b610b776115b8565b6001600160a01b038216610b9e57604051630f58058360e11b815260040160405180910390fd5b604051627eeac760e11b81523060048201526024810182905282906000906001600160a01b0383169062fdd58e90604401602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190612feb565b905080600003610c335760405163157474a960e31b815260040160405180910390fd5b816001600160a01b031663f242432a30610c556003546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018690526064810184905260a06084820152600060a482015260c401600060405180830381600087803b158015610cb957600080fd5b505af1158015610ccd573d6000803e3d6000fd5b5050505082846001600160a01b03167e04b148840595eb234e6148251c2c9c78d692171f32febbd992963e0c13855383604051610d0c91815260200190565b60405180910390a350505050565b610d226115b8565b610d2c6000611c14565b565b610d366115b8565b600b805460ff1916911515919091179055565b610d516115b8565b6001600160a01b038216610d7857604051630f58058360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905282906000906001600160a01b03831690636352211e90602401602060405180830381865afa158015610dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de69190613004565b90506001600160a01b0381163014610e115760405163157474a960e31b815260040160405180910390fd5b816001600160a01b03166342842e0e30610e336003546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101869052606401600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b50506040518592506001600160a01b03871691507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e890600090a350505050565b600880546105c490612e1c565b610eeb6115b8565b6105b382828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6692505050565b610f32611c72565b60048054821515600160a01b0260ff60a01b199091161790556040517f6787c7f9a80aa0f5ceddab2c54f1f5169c0b88e75dd5e19d5e858a64144c7dbc90610f7f90831515815260200190565b60405180910390a150565b610f926115b8565b6001600160a01b038116610fb957604051630f58058360e11b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190612feb565b9050806000036110495760405163157474a960e31b815260040160405180910390fd5b816001600160a01b031663a9059cbb61106a6003546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156110b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110db9190613021565b50826001600160a01b03167f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b18260405161111791815260200190565b60405180910390a2505050565b6105b3338383611c7a565b611137611c72565b6001600160a01b038116803b15159015801590611152575080155b15611170576040516332483afb60e01b815260040160405180910390fd5b7fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac611199610645565b604080516001600160a01b03928316815291851660208301520160405180910390a16003805460ff60a01b1916600160a01b179055600480546001600160a01b0384166001600160a01b03199091161790556105b382611d5a565b600b5460ff1661121757604051632b7e2ae360e01b815260040160405180910390fd5b806000036112385760405163162908e360e11b815260040160405180910390fd5b611243338383611dda565b6000828152600a602052604081208054839290611261908490612ed4565b9091555050604080518381526020810183905233917f23ff0e75edf108e3d0392d92e13e8c8a868ef19001bd49f9e94876dc46dff87f91015b60405180910390a25050565b6112ae6115b8565b60648311156112d057604051634bb6586b60e01b815260040160405180910390fd5b60008390036112f25760405163248d08ff60e21b815260040160405180910390fd5b82811461131257604051636b378ec560e01b815260040160405180910390fd5b60005b838110156114695782828281811061132f5761132f612ebe565b905060200201356000036113565760405163162908e360e11b815260040160405180910390fd5b60008681526009602052604090205483838381811061137757611377612ebe565b90506020020135611394886000908152600a602052604090205490565b61139e9190612eab565b11156113bd5760405163c30436e960e01b815260040160405180910390fd5b6114168585838181106113d2576113d2612ebe565b90506020020160208101906113e79190612cc2565b878585858181106113fa576113fa612ebe565b9050602002013560405180602001604052806000815250611786565b82828281811061142857611428612ebe565b90506020020135600a600088815260200190815260200160002060008282546114519190612eab565b9091555081905061146181612ee7565b915050611315565b505050505050565b6001600160a01b0382811660009081526001602090815260408083209385168352929052205460ff168061059057600454600160a01b900460ff1615610590576114b9610645565b6001600160a01b0316826001600160a01b031614905092915050565b6001600160a01b0385163314806114f157506114f18533611471565b61150d5760405162461bcd60e51b815260040161056490612f9d565b6109df8585858585611efc565b6115226115b8565b6001600160a01b0381166115875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610564565b61159081611c14565b50565b60006001600160e01b0319821663152a902d60e11b1480610590575061059082612042565b6003546001600160a01b03163314610d2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610564565b61161c8282612082565b6040516001600160601b03821681526001600160a01b038316907f8a8bae378cb731c5c40b632330c6836c2f916f48edb967699c86736f9a6a76ef9060200161129a565b60606002805461166f90612e1c565b80601f016020809104026020016040519081016040528092919081815260200182805461169b90612e1c565b80156116e85780601f106116bd576101008083540402835291602001916116e8565b820191906000526020600020905b8154815290600101906020018083116116cb57829003601f168201915b50505050509050919050565b606060006117018361217f565b60010190506000816001600160401b0381111561172057611720612916565b6040519080825280601f01601f19166020018201604052801561174a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461175457509392505050565b6001600160a01b0384166117e65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610564565b3360006117f285612257565b905060006117ff85612257565b9050611810836000898585896122a2565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611840908490612eab565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118a0836000898585896122ff565b6118af83600089898989612352565b50505050505050565b6001600160a01b0383166118de5760405162461bcd60e51b81526004016105649061303e565b80518251146118ff5760405162461bcd60e51b815260040161056490613081565b6000339050611922818560008686604051806020016040528060008152506122a2565b60005b83518110156119e757600084828151811061194257611942612ebe565b60200260200101519050600084838151811061196057611960612ebe565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156119b05760405162461bcd60e51b8152600401610564906130c9565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806119df81612ee7565b915050611925565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611a3892919061310d565b60405180910390a4611a5e818560008686604051806020016040528060008152506122ff565b50505050565b8151835114611a855760405162461bcd60e51b815260040161056490613081565b6001600160a01b038416611aab5760405162461bcd60e51b81526004016105649061313b565b33611aba8187878787876122a2565b60005b8451811015611ba0576000858281518110611ada57611ada612ebe565b602002602001015190506000858381518110611af857611af8612ebe565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611b485760405162461bcd60e51b815260040161056490613180565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611b85908490612eab565b9250508190555050505080611b9990612ee7565b9050611abd565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bf092919061310d565b60405180910390a4611c068187878787876122ff565b6114698187878787876124ad565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60026105b38282613215565b610d2c6115b8565b816001600160a01b0316836001600160a01b031603611ced5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610564565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0381161561159057803b80156105b3576040805163fb2de5d760e01b8152306004820152610483602482015290516001600160a01b0384169163fb2de5d791604480830192600092919082900301818387803b158015611dc057600080fd5b505af1925050508015611dd1575060015b156105b3575050565b6001600160a01b038316611e005760405162461bcd60e51b81526004016105649061303e565b336000611e0c84612257565b90506000611e1984612257565b9050611e39838760008585604051806020016040528060008152506122a2565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015611e7a5760405162461bcd60e51b8152600401610564906130c9565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118af848860008686604051806020016040528060008152506122ff565b6001600160a01b038416611f225760405162461bcd60e51b81526004016105649061313b565b336000611f2e85612257565b90506000611f3b85612257565b9050611f4b8389898585896122a2565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611f8c5760405162461bcd60e51b815260040161056490613180565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611fc9908490612eab565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612029848a8a86868a6122ff565b612037848a8a8a8a8a612352565b505050505050505050565b60006001600160e01b03198216632b435fdb60e21b148061207357506001600160e01b0319821663503e914d60e11b145b80610590575061059082612568565b6127106001600160601b03821611156120f05760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610564565b6001600160a01b0382166121465760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610564565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600555565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106121be5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106121ea576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061220857662386f26fc10000830492506010015b6305f5e1008310612220576305f5e100830492506008015b612710831061223457612710830492506004015b60648310612246576064830492506002015b600a83106105905760010192915050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061229157612291612ebe565b602090810291909101015292915050565b825160005b818110156122f5576122ed87878784815181106122c6576122c6612ebe565b60200260200101518785815181106122e0576122e0612ebe565b60200260200101516125b8565b6001016122a7565b5050505050505050565b825160005b818110156122f55761234a878787848151811061232357612323612ebe565b602002602001015187858151811061233d5761233d612ebe565b602002602001015161260f565b600101612304565b6001600160a01b0384163b156114695760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061239690899089908890889088906004016132d4565b6020604051808303816000875af19250505080156123d1575060408051601f3d908101601f191682019092526123ce9181019061330e565b60015b61247d576123dd61332b565b806308c379a00361241657506123f1613346565b806123fc5750612418565b8060405162461bcd60e51b81526004016105649190612819565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610564565b6001600160e01b0319811663f23a6e6160e01b146118af5760405162461bcd60e51b8152600401610564906133cf565b6001600160a01b0384163b156114695760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906124f19089908990889088908890600401613417565b6020604051808303816000875af192505050801561252c575060408051601f3d908101601f191682019092526125299181019061330e565b60015b612538576123dd61332b565b6001600160e01b0319811663bc197c8160e01b146118af5760405162461bcd60e51b8152600401610564906133cf565b60006001600160e01b03198216636cdb3d1360e11b148061259957506001600160e01b031982166303a24d0760e21b145b8061059057506301ffc9a760e01b6001600160e01b0319831614610590565b6001600160a01b0384811615908416158180156125d25750805b156125f057604051635cbd944160e01b815260040160405180910390fd5b81156125fc575b611469565b806125f757611469338787878734612656565b6001600160a01b0384811615908416158180156126295750805b1561264757604051635cbd944160e01b815260040160405180910390fd5b816125f757806125f757611469565b6000612660610645565b90506001600160a01b038116156118af576001600160a01b03811633036126875750611469565b604051631854b24160e01b81526001600160a01b038881166004830152878116602483015286811660448301526064820186905260848201859052821690631854b2419060a401600060405180830381600087803b1580156126e857600080fd5b505af11580156126fc573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b038116811461159057600080fd5b6000806040838503121561273157600080fd5b823561273c81612709565b946020939093013593505050565b6001600160e01b03198116811461159057600080fd5b60006020828403121561277257600080fd5b813561277d8161274a565b9392505050565b6000806040838503121561279757600080fd5b82356127a281612709565b915060208301356001600160601b03811681146127be57600080fd5b809150509250929050565b60005b838110156127e45781810151838201526020016127cc565b50506000910152565b600081518084526128058160208601602086016127c9565b601f01601f19169290920160200192915050565b60208152600061277d60208301846127ed565b60006020828403121561283e57600080fd5b5035919050565b6000806040838503121561285857600080fd5b50508035926020909101359150565b60008083601f84011261287957600080fd5b5081356001600160401b0381111561289057600080fd5b6020830191508360208260051b850101111561099357600080fd5b600080600080604085870312156128c157600080fd5b84356001600160401b03808211156128d857600080fd5b6128e488838901612867565b909650945060208701359150808211156128fd57600080fd5b5061290a87828801612867565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561295157612951612916565b6040525050565b60006001600160401b0382111561297157612971612916565b5060051b60200190565b600082601f83011261298c57600080fd5b8135602061299982612958565b6040516129a6828261292c565b83815260059390931b85018201928281019150868411156129c657600080fd5b8286015b848110156129e157803583529183019183016129ca565b509695505050505050565b600082601f8301126129fd57600080fd5b81356001600160401b03811115612a1657612a16612916565b604051612a2d601f8301601f19166020018261292c565b818152846020838601011115612a4257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215612a7757600080fd5b8535612a8281612709565b94506020860135612a9281612709565b935060408601356001600160401b0380821115612aae57600080fd5b612aba89838a0161297b565b94506060880135915080821115612ad057600080fd5b612adc89838a0161297b565b93506080880135915080821115612af257600080fd5b50612aff888289016129ec565b9150509295509295909350565b60008060408385031215612b1f57600080fd5b82356001600160401b0380821115612b3657600080fd5b818501915085601f830112612b4a57600080fd5b81356020612b5782612958565b604051612b64828261292c565b83815260059390931b8501820192828101915089841115612b8457600080fd5b948201945b83861015612bab578535612b9c81612709565b82529482019490820190612b89565b96505086013592505080821115612bc157600080fd5b50612bce8582860161297b565b9150509250929050565b600081518084526020808501945080840160005b83811015612c0857815187529582019590820190600101612bec565b509495945050505050565b60208152600061277d6020830184612bd8565b801515811461159057600080fd5b600060208284031215612c4657600080fd5b813561277d81612c26565b60008060208385031215612c6457600080fd5b82356001600160401b0380821115612c7b57600080fd5b818501915085601f830112612c8f57600080fd5b813581811115612c9e57600080fd5b866020828501011115612cb057600080fd5b60209290920196919550909350505050565b600060208284031215612cd457600080fd5b813561277d81612709565b60008060408385031215612cf257600080fd5b8235612cfd81612709565b915060208301356127be81612c26565b600080600080600060608688031215612d2557600080fd5b8535945060208601356001600160401b0380821115612d4357600080fd5b612d4f89838a01612867565b90965094506040880135915080821115612d6857600080fd5b50612d7588828901612867565b969995985093965092949392505050565b60008060408385031215612d9957600080fd5b8235612da481612709565b915060208301356127be81612709565b600080600080600060a08688031215612dcc57600080fd5b8535612dd781612709565b94506020860135612de781612709565b9350604086013592506060860135915060808601356001600160401b03811115612e1057600080fd5b612aff888289016129ec565b600181811c90821680612e3057607f821691505b602082108103612e5057634e487b7160e01b600052602260045260246000fd5b50919050565b60008351612e688184602088016127c9565b835190830190612e7c8183602088016127c9565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561059057610590612e95565b634e487b7160e01b600052603260045260246000fd5b8181038181111561059057610590612e95565b600060018201612ef957612ef9612e95565b5060010190565b81835260006001600160fb1b03831115612f1957600080fd5b8260051b80836020870137939093016020019392505050565b604081526000612f46604083018688612f00565b8281036020840152612f59818587612f00565b979650505050505050565b808202811582820484141761059057610590612e95565b600082612f9857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b600060208284031215612ffd57600080fd5b5051919050565b60006020828403121561301657600080fd5b815161277d81612709565b60006020828403121561303357600080fd5b815161277d81612c26565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006131206040830185612bd8565b82810360208401526131328185612bd8565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b601f82111561321057600081815260208120601f850160051c810160208610156131f15750805b601f850160051c820191505b81811015611469578281556001016131fd565b505050565b81516001600160401b0381111561322e5761322e612916565b6132428161323c8454612e1c565b846131ca565b602080601f831160018114613277576000841561325f5750858301515b600019600386901b1c1916600185901b178555611469565b600085815260208120601f198616915b828110156132a657888601518255948401946001909101908401613287565b50858210156132c45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612f59908301846127ed565b60006020828403121561332057600080fd5b815161277d8161274a565b600060033d111561067e5760046000803e5060005160e01c90565b600060443d10156133545790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561338357505050505090565b828501915081518181111561339b5750505050505090565b843d87010160208285010111156133b55750505050505090565b6133c46020828601018761292c565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061344390830186612bd8565b82810360608401526134558186612bd8565b9050828103608084015261346981856127ed565b9897505050505050505056fea26469706673582212206f1a3a9b8876fd0e29e7cfe5b4fd40a810422553d075407fb2294873e419221364736f6c634300081500330000000000000000000000001cb86e9240e615ed631ccc6e15c073980bc33b5f00000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6170692e626f726564383130322e636f6d2f6c6f6f742d6368657374732f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4c6f6f744368657374730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024c43000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102055760003560e01c80636221d13c1161011a5780639e8c708e116100ad578063bd85b0391161007c578063bd85b03914610491578063d5516e7f146104b1578063e985e9c5146104c4578063f242432a146104d7578063f2fde38b146104ea57600080fd5b80639e8c708e14610445578063a22cb46514610458578063a9fc664e1461046b578063b390c0ab1461047e57600080fd5b80638da5cb5b116100e95780638da5cb5b1461040657806395d89b41146104175780639b642de11461041f5780639e05d2401461043257600080fd5b80636221d13c146103c4578063715018a6146103d857806380929e5b146103e0578063819d4cc6146103f357600080fd5b80630e89341c1161019d5780632eb2c2d61161016c5780632eb2c2d61461034b57806336f5cba51461035e5780634e1273f41461037e5780635aed66dd1461039e5780635c654ad9146103b157600080fd5b80630e89341c146102e05780631b2ef1ca146102f357806320ec271b146103065780632a55205a1461031957600080fd5b806306fdde03116101d957806306fdde031461029b57806307ebec27146102b0578063098144d4146102bd5780630d705df6146102c557600080fd5b8062fdd58e1461020a578063014635461461023057806301ffc9a71461026357806304634d8d14610286575b600080fd5b61021d61021836600461271e565b6104fd565b6040519081526020015b60405180910390f35b61024b73721c002b0059009a671d00ad1700c9748146cd1b81565b6040516001600160a01b039091168152602001610227565b610276610271366004612760565b610596565b6040519015158152602001610227565b610299610294366004612784565b6105a1565b005b6102a36105b7565b6040516102279190612819565b600b546102769060ff1681565b61024b610645565b60408051631854b24160e01b81526000602082015201610227565b6102a36102ee36600461282c565b610681565b610299610301366004612845565b6106bc565b6102996103143660046128ab565b61076c565b61032c610327366004612845565b6108ec565b604080516001600160a01b039093168352602083019190915201610227565b610299610359366004612a5f565b61099a565b61021d61036c36600461282c565b60096020526000908152604090205481565b61039161038c366004612b0c565b6109e6565b6040516102279190612c13565b6102996103ac366004612845565b610b0f565b6102996103bf36600461271e565b610b6f565b60045461027690600160a01b900460ff1681565b610299610d1a565b6102996103ee366004612c34565b610d2e565b61029961040136600461271e565b610d49565b6003546001600160a01b031661024b565b6102a3610ed6565b61029961042d366004612c51565b610ee3565b610299610440366004612c34565b610f2a565b610299610453366004612cc2565b610f8a565b610299610466366004612cdf565b611124565b610299610479366004612cc2565b61112f565b61029961048c366004612845565b6111f4565b61021d61049f36600461282c565b6000908152600a602052604090205490565b6102996104bf366004612d0d565b6112a6565b6102766104d2366004612d86565b611471565b6102996104e5366004612db4565b6114d5565b6102996104f8366004612cc2565b61151a565b60006001600160a01b03831661056d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061059082611593565b6105a96115b8565b6105b38282611612565b5050565b600780546105c490612e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546105f090612e1c565b801561063d5780601f106106125761010080835404028352916020019161063d565b820191906000526020600020905b81548152906001019060200180831161062057829003601f168201915b505050505081565b6004546001600160a01b03168061067e57600354600160a01b900460ff1661067e575073721c002b0059009a671d00ad1700c9748146cd1b5b90565b606061068c82611660565b610695836116f4565b6040516020016106a6929190612e56565b6040516020818303038152906040529050919050565b6106c46115b8565b806000036106e55760405163162908e360e11b815260040160405180910390fd5b600082815260096020908152604080832054600a9092529091205461070b908390612eab565b111561072a5760405163c30436e960e01b815260040160405180910390fd5b61074533838360405180602001604052806000815250611786565b6000828152600a602052604081208054839290610763908490612eab565b90915550505050565b600b5460ff1661078f57604051632b7e2ae360e01b815260040160405180910390fd5b82158061079c5750828114155b156107ba5760405163162908e360e11b815260040160405180910390fd5b61082833858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208089028281018201909352888252909350889250879182918501908490808284376000920191909152506118b892505050565b60005b8381101561089e5782828281811061084557610845612ebe565b90506020020135600a600087878581811061086257610862612ebe565b90506020020135815260200190815260200160002060008282546108869190612ed4565b9091555081905061089681612ee7565b91505061082b565b50336001600160a01b03167f5c9b7f613a622104f08e605548b653df10c7e4f860716265d9e3f69dbfb64b26858585856040516108de9493929190612f32565b60405180910390a250505050565b60008281526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109615750604080518082019091526005546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610980906001600160601b031687612f64565b61098a9190612f7b565b91519350909150505b9250929050565b6001600160a01b0385163314806109b657506109b68533611471565b6109d25760405162461bcd60e51b815260040161056490612f9d565b6109df8585858585611a64565b5050505050565b60608151835114610a4b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610564565b600083516001600160401b03811115610a6657610a66612916565b604051908082528060200260200182016040528015610a8f578160200160208202803683370190505b50905060005b8451811015610b0757610ada858281518110610ab357610ab3612ebe565b6020026020010151858381518110610acd57610acd612ebe565b60200260200101516104fd565b828281518110610aec57610aec612ebe565b6020908102919091010152610b0081612ee7565b9050610a95565b509392505050565b610b176115b8565b6000828152600a60205260409020541580610b58575060008281526009602052604090205481108015610b5857506000828152600a60205260409020548110155b156105b35760009182526009602052604090912055565b610b776115b8565b6001600160a01b038216610b9e57604051630f58058360e11b815260040160405180910390fd5b604051627eeac760e11b81523060048201526024810182905282906000906001600160a01b0383169062fdd58e90604401602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190612feb565b905080600003610c335760405163157474a960e31b815260040160405180910390fd5b816001600160a01b031663f242432a30610c556003546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018690526064810184905260a06084820152600060a482015260c401600060405180830381600087803b158015610cb957600080fd5b505af1158015610ccd573d6000803e3d6000fd5b5050505082846001600160a01b03167e04b148840595eb234e6148251c2c9c78d692171f32febbd992963e0c13855383604051610d0c91815260200190565b60405180910390a350505050565b610d226115b8565b610d2c6000611c14565b565b610d366115b8565b600b805460ff1916911515919091179055565b610d516115b8565b6001600160a01b038216610d7857604051630f58058360e11b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905282906000906001600160a01b03831690636352211e90602401602060405180830381865afa158015610dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de69190613004565b90506001600160a01b0381163014610e115760405163157474a960e31b815260040160405180910390fd5b816001600160a01b03166342842e0e30610e336003546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101869052606401600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b50506040518592506001600160a01b03871691507f57519b6a0997d7d44511836bcee0a36871aa79d445816f6c464abb0cd9d3f3e890600090a350505050565b600880546105c490612e1c565b610eeb6115b8565b6105b382828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c6692505050565b610f32611c72565b60048054821515600160a01b0260ff60a01b199091161790556040517f6787c7f9a80aa0f5ceddab2c54f1f5169c0b88e75dd5e19d5e858a64144c7dbc90610f7f90831515815260200190565b60405180910390a150565b610f926115b8565b6001600160a01b038116610fb957604051630f58058360e11b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190612feb565b9050806000036110495760405163157474a960e31b815260040160405180910390fd5b816001600160a01b031663a9059cbb61106a6003546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156110b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110db9190613021565b50826001600160a01b03167f55350610fe57096d8c0ffa30beede987326bccfcb0b4415804164d0dd50ce8b18260405161111791815260200190565b60405180910390a2505050565b6105b3338383611c7a565b611137611c72565b6001600160a01b038116803b15159015801590611152575080155b15611170576040516332483afb60e01b815260040160405180910390fd5b7fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac611199610645565b604080516001600160a01b03928316815291851660208301520160405180910390a16003805460ff60a01b1916600160a01b179055600480546001600160a01b0384166001600160a01b03199091161790556105b382611d5a565b600b5460ff1661121757604051632b7e2ae360e01b815260040160405180910390fd5b806000036112385760405163162908e360e11b815260040160405180910390fd5b611243338383611dda565b6000828152600a602052604081208054839290611261908490612ed4565b9091555050604080518381526020810183905233917f23ff0e75edf108e3d0392d92e13e8c8a868ef19001bd49f9e94876dc46dff87f91015b60405180910390a25050565b6112ae6115b8565b60648311156112d057604051634bb6586b60e01b815260040160405180910390fd5b60008390036112f25760405163248d08ff60e21b815260040160405180910390fd5b82811461131257604051636b378ec560e01b815260040160405180910390fd5b60005b838110156114695782828281811061132f5761132f612ebe565b905060200201356000036113565760405163162908e360e11b815260040160405180910390fd5b60008681526009602052604090205483838381811061137757611377612ebe565b90506020020135611394886000908152600a602052604090205490565b61139e9190612eab565b11156113bd5760405163c30436e960e01b815260040160405180910390fd5b6114168585838181106113d2576113d2612ebe565b90506020020160208101906113e79190612cc2565b878585858181106113fa576113fa612ebe565b9050602002013560405180602001604052806000815250611786565b82828281811061142857611428612ebe565b90506020020135600a600088815260200190815260200160002060008282546114519190612eab565b9091555081905061146181612ee7565b915050611315565b505050505050565b6001600160a01b0382811660009081526001602090815260408083209385168352929052205460ff168061059057600454600160a01b900460ff1615610590576114b9610645565b6001600160a01b0316826001600160a01b031614905092915050565b6001600160a01b0385163314806114f157506114f18533611471565b61150d5760405162461bcd60e51b815260040161056490612f9d565b6109df8585858585611efc565b6115226115b8565b6001600160a01b0381166115875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610564565b61159081611c14565b50565b60006001600160e01b0319821663152a902d60e11b1480610590575061059082612042565b6003546001600160a01b03163314610d2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610564565b61161c8282612082565b6040516001600160601b03821681526001600160a01b038316907f8a8bae378cb731c5c40b632330c6836c2f916f48edb967699c86736f9a6a76ef9060200161129a565b60606002805461166f90612e1c565b80601f016020809104026020016040519081016040528092919081815260200182805461169b90612e1c565b80156116e85780601f106116bd576101008083540402835291602001916116e8565b820191906000526020600020905b8154815290600101906020018083116116cb57829003601f168201915b50505050509050919050565b606060006117018361217f565b60010190506000816001600160401b0381111561172057611720612916565b6040519080825280601f01601f19166020018201604052801561174a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461175457509392505050565b6001600160a01b0384166117e65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610564565b3360006117f285612257565b905060006117ff85612257565b9050611810836000898585896122a2565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611840908490612eab565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118a0836000898585896122ff565b6118af83600089898989612352565b50505050505050565b6001600160a01b0383166118de5760405162461bcd60e51b81526004016105649061303e565b80518251146118ff5760405162461bcd60e51b815260040161056490613081565b6000339050611922818560008686604051806020016040528060008152506122a2565b60005b83518110156119e757600084828151811061194257611942612ebe565b60200260200101519050600084838151811061196057611960612ebe565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156119b05760405162461bcd60e51b8152600401610564906130c9565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806119df81612ee7565b915050611925565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611a3892919061310d565b60405180910390a4611a5e818560008686604051806020016040528060008152506122ff565b50505050565b8151835114611a855760405162461bcd60e51b815260040161056490613081565b6001600160a01b038416611aab5760405162461bcd60e51b81526004016105649061313b565b33611aba8187878787876122a2565b60005b8451811015611ba0576000858281518110611ada57611ada612ebe565b602002602001015190506000858381518110611af857611af8612ebe565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611b485760405162461bcd60e51b815260040161056490613180565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611b85908490612eab565b9250508190555050505080611b9990612ee7565b9050611abd565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bf092919061310d565b60405180910390a4611c068187878787876122ff565b6114698187878787876124ad565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60026105b38282613215565b610d2c6115b8565b816001600160a01b0316836001600160a01b031603611ced5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610564565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0381161561159057803b80156105b3576040805163fb2de5d760e01b8152306004820152610483602482015290516001600160a01b0384169163fb2de5d791604480830192600092919082900301818387803b158015611dc057600080fd5b505af1925050508015611dd1575060015b156105b3575050565b6001600160a01b038316611e005760405162461bcd60e51b81526004016105649061303e565b336000611e0c84612257565b90506000611e1984612257565b9050611e39838760008585604051806020016040528060008152506122a2565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015611e7a5760405162461bcd60e51b8152600401610564906130c9565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118af848860008686604051806020016040528060008152506122ff565b6001600160a01b038416611f225760405162461bcd60e51b81526004016105649061313b565b336000611f2e85612257565b90506000611f3b85612257565b9050611f4b8389898585896122a2565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611f8c5760405162461bcd60e51b815260040161056490613180565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611fc9908490612eab565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612029848a8a86868a6122ff565b612037848a8a8a8a8a612352565b505050505050505050565b60006001600160e01b03198216632b435fdb60e21b148061207357506001600160e01b0319821663503e914d60e11b145b80610590575061059082612568565b6127106001600160601b03821611156120f05760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610564565b6001600160a01b0382166121465760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610564565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600555565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106121be5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106121ea576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061220857662386f26fc10000830492506010015b6305f5e1008310612220576305f5e100830492506008015b612710831061223457612710830492506004015b60648310612246576064830492506002015b600a83106105905760010192915050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061229157612291612ebe565b602090810291909101015292915050565b825160005b818110156122f5576122ed87878784815181106122c6576122c6612ebe565b60200260200101518785815181106122e0576122e0612ebe565b60200260200101516125b8565b6001016122a7565b5050505050505050565b825160005b818110156122f55761234a878787848151811061232357612323612ebe565b602002602001015187858151811061233d5761233d612ebe565b602002602001015161260f565b600101612304565b6001600160a01b0384163b156114695760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061239690899089908890889088906004016132d4565b6020604051808303816000875af19250505080156123d1575060408051601f3d908101601f191682019092526123ce9181019061330e565b60015b61247d576123dd61332b565b806308c379a00361241657506123f1613346565b806123fc5750612418565b8060405162461bcd60e51b81526004016105649190612819565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610564565b6001600160e01b0319811663f23a6e6160e01b146118af5760405162461bcd60e51b8152600401610564906133cf565b6001600160a01b0384163b156114695760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906124f19089908990889088908890600401613417565b6020604051808303816000875af192505050801561252c575060408051601f3d908101601f191682019092526125299181019061330e565b60015b612538576123dd61332b565b6001600160e01b0319811663bc197c8160e01b146118af5760405162461bcd60e51b8152600401610564906133cf565b60006001600160e01b03198216636cdb3d1360e11b148061259957506001600160e01b031982166303a24d0760e21b145b8061059057506301ffc9a760e01b6001600160e01b0319831614610590565b6001600160a01b0384811615908416158180156125d25750805b156125f057604051635cbd944160e01b815260040160405180910390fd5b81156125fc575b611469565b806125f757611469338787878734612656565b6001600160a01b0384811615908416158180156126295750805b1561264757604051635cbd944160e01b815260040160405180910390fd5b816125f757806125f757611469565b6000612660610645565b90506001600160a01b038116156118af576001600160a01b03811633036126875750611469565b604051631854b24160e01b81526001600160a01b038881166004830152878116602483015286811660448301526064820186905260848201859052821690631854b2419060a401600060405180830381600087803b1580156126e857600080fd5b505af11580156126fc573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b038116811461159057600080fd5b6000806040838503121561273157600080fd5b823561273c81612709565b946020939093013593505050565b6001600160e01b03198116811461159057600080fd5b60006020828403121561277257600080fd5b813561277d8161274a565b9392505050565b6000806040838503121561279757600080fd5b82356127a281612709565b915060208301356001600160601b03811681146127be57600080fd5b809150509250929050565b60005b838110156127e45781810151838201526020016127cc565b50506000910152565b600081518084526128058160208601602086016127c9565b601f01601f19169290920160200192915050565b60208152600061277d60208301846127ed565b60006020828403121561283e57600080fd5b5035919050565b6000806040838503121561285857600080fd5b50508035926020909101359150565b60008083601f84011261287957600080fd5b5081356001600160401b0381111561289057600080fd5b6020830191508360208260051b850101111561099357600080fd5b600080600080604085870312156128c157600080fd5b84356001600160401b03808211156128d857600080fd5b6128e488838901612867565b909650945060208701359150808211156128fd57600080fd5b5061290a87828801612867565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561295157612951612916565b6040525050565b60006001600160401b0382111561297157612971612916565b5060051b60200190565b600082601f83011261298c57600080fd5b8135602061299982612958565b6040516129a6828261292c565b83815260059390931b85018201928281019150868411156129c657600080fd5b8286015b848110156129e157803583529183019183016129ca565b509695505050505050565b600082601f8301126129fd57600080fd5b81356001600160401b03811115612a1657612a16612916565b604051612a2d601f8301601f19166020018261292c565b818152846020838601011115612a4257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215612a7757600080fd5b8535612a8281612709565b94506020860135612a9281612709565b935060408601356001600160401b0380821115612aae57600080fd5b612aba89838a0161297b565b94506060880135915080821115612ad057600080fd5b612adc89838a0161297b565b93506080880135915080821115612af257600080fd5b50612aff888289016129ec565b9150509295509295909350565b60008060408385031215612b1f57600080fd5b82356001600160401b0380821115612b3657600080fd5b818501915085601f830112612b4a57600080fd5b81356020612b5782612958565b604051612b64828261292c565b83815260059390931b8501820192828101915089841115612b8457600080fd5b948201945b83861015612bab578535612b9c81612709565b82529482019490820190612b89565b96505086013592505080821115612bc157600080fd5b50612bce8582860161297b565b9150509250929050565b600081518084526020808501945080840160005b83811015612c0857815187529582019590820190600101612bec565b509495945050505050565b60208152600061277d6020830184612bd8565b801515811461159057600080fd5b600060208284031215612c4657600080fd5b813561277d81612c26565b60008060208385031215612c6457600080fd5b82356001600160401b0380821115612c7b57600080fd5b818501915085601f830112612c8f57600080fd5b813581811115612c9e57600080fd5b866020828501011115612cb057600080fd5b60209290920196919550909350505050565b600060208284031215612cd457600080fd5b813561277d81612709565b60008060408385031215612cf257600080fd5b8235612cfd81612709565b915060208301356127be81612c26565b600080600080600060608688031215612d2557600080fd5b8535945060208601356001600160401b0380821115612d4357600080fd5b612d4f89838a01612867565b90965094506040880135915080821115612d6857600080fd5b50612d7588828901612867565b969995985093965092949392505050565b60008060408385031215612d9957600080fd5b8235612da481612709565b915060208301356127be81612709565b600080600080600060a08688031215612dcc57600080fd5b8535612dd781612709565b94506020860135612de781612709565b9350604086013592506060860135915060808601356001600160401b03811115612e1057600080fd5b612aff888289016129ec565b600181811c90821680612e3057607f821691505b602082108103612e5057634e487b7160e01b600052602260045260246000fd5b50919050565b60008351612e688184602088016127c9565b835190830190612e7c8183602088016127c9565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561059057610590612e95565b634e487b7160e01b600052603260045260246000fd5b8181038181111561059057610590612e95565b600060018201612ef957612ef9612e95565b5060010190565b81835260006001600160fb1b03831115612f1957600080fd5b8260051b80836020870137939093016020019392505050565b604081526000612f46604083018688612f00565b8281036020840152612f59818587612f00565b979650505050505050565b808202811582820484141761059057610590612e95565b600082612f9857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b600060208284031215612ffd57600080fd5b5051919050565b60006020828403121561301657600080fd5b815161277d81612709565b60006020828403121561303357600080fd5b815161277d81612c26565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006131206040830185612bd8565b82810360208401526131328185612bd8565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b601f82111561321057600081815260208120601f850160051c810160208610156131f15750805b601f850160051c820191505b81811015611469578281556001016131fd565b505050565b81516001600160401b0381111561322e5761322e612916565b6132428161323c8454612e1c565b846131ca565b602080601f831160018114613277576000841561325f5750858301515b600019600386901b1c1916600185901b178555611469565b600085815260208120601f198616915b828110156132a657888601518255948401946001909101908401613287565b50858210156132c45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612f59908301846127ed565b60006020828403121561332057600080fd5b815161277d8161274a565b600060033d111561067e5760046000803e5060005160e01c90565b600060443d10156133545790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561338357505050505090565b828501915081518181111561339b5750505050505090565b843d87010160208285010111156133b55750505050505090565b6133c46020828601018761292c565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061344390830186612bd8565b82810360608401526134558186612bd8565b9050828103608084015261346981856127ed565b9897505050505050505056fea26469706673582212206f1a3a9b8876fd0e29e7cfe5b4fd40a810422553d075407fb2294873e419221364736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001cb86e9240e615ed631ccc6e15c073980bc33b5f00000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6170692e626f726564383130322e636f6d2f6c6f6f742d6368657374732f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4c6f6f744368657374730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024c43000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : royaltyReceiver_ (address): 0x1cB86E9240e615ed631CcC6e15C073980Bc33b5f
Arg [1] : royaltyFeeNumerator_ (uint96): 420
Arg [2] : uri_ (string): https://api.bored8102.com/loot-chests/
Arg [3] : name_ (string): LootChests
Arg [4] : symbol_ (string): LC
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000001cb86e9240e615ed631ccc6e15c073980bc33b5f
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a4
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [6] : 68747470733a2f2f6170692e626f726564383130322e636f6d2f6c6f6f742d63
Arg [7] : 68657374732f0000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [9] : 4c6f6f7443686573747300000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 4c43000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
378:4058:32:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2185:227:18;;;;;;:::i;:::-;;:::i;:::-;;;616:25:33;;;604:2;589:18;2185:227:18;;;;;;;;2205:104:10;;2266:42;2205:104;;;;;-1:-1:-1;;;;;816:32:33;;;798:51;;786:2;771:18;2205:104:10;652:203:33;3716:170:32;;;;;;:::i;:::-;;:::i;:::-;;;1411:14:33;;1404:22;1386:41;;1374:2;1359:18;3716:170:32;1246:187:33;3892:144:32;;;;;;:::i;:::-;;:::i;:::-;;491:18;;;:::i;:::-;;;;;;;:::i;1034:33::-;;;;;;;;;3958:290:10;;;:::i;2111:258:2:-;;;;-1:-1:-1;;;2800:52:33;;2175:24:2;2883:2:33;2868:18;;2861:50;2773:18;2111:258:2;2634:283:33;4163:271:32;;;;;;:::i;:::-;;:::i;2612:309::-;;;;;;:::i;:::-;;:::i;3238:472::-;;;;;;:::i;:::-;;:::i;1671:432:24:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4702:32:33;;;4684:51;;4766:2;4751:18;;4744:34;;;;4657:18;1671:432:24;4510:274:33;4064:426:18;;;;;;:::i;:::-;;:::i;924:49:32:-;;;;;;:::i;:::-;;;;;;;;;;;;;;2569:508:18;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1439:258:32:-;;;;;;:::i;:::-;;:::i;628:471:31:-;;;;;;:::i;:::-;;:::i;724:45:9:-;;;;;-1:-1:-1;;;724:45:9;;;;;;1831:101:13;;;:::i;1796:100:32:-;;;;;;:::i;:::-;;:::i;1503:450:31:-;;;;;;:::i;:::-;;:::i;1201:85:13:-;1273:6;;-1:-1:-1;;;;;1273:6:13;1201:85;;515:20:32;;;:::i;1703:87::-;;;;;;:::i;:::-;;:::i;1139:253:9:-;;;;;;:::i;:::-;;:::i;1105:392:31:-;;;;;;:::i;:::-;;:::i;3145:153:18:-;;;;;;:::i;:::-;;:::i;3268:580:10:-;;;;;;:::i;:::-;;:::i;2927:305:32:-;;;;;;:::i;:::-;;:::i;4042:115::-;;;;;;:::i;:::-;4102:7;4128:22;;;:12;:22;;;;;;;4042:115;1902:704;;;;;;:::i;:::-;;:::i;1005:362:2:-;;;;;;:::i;:::-;;:::i;3598:394:18:-;;;;;;:::i;:::-;;:::i;2081:198:13:-;;;;;;:::i;:::-;;:::i;2185:227:18:-;2271:7;-1:-1:-1;;;;;2298:21:18;;2290:76;;;;-1:-1:-1;;;2290:76:18;;13501:2:33;2290:76:18;;;13483:21:33;13540:2;13520:18;;;13513:30;13579:34;13559:18;;;13552:62;-1:-1:-1;;;13630:18:33;;;13623:40;13680:19;;2290:76:18;;;;;;;;;-1:-1:-1;2383:9:18;:13;;;;;;;;;;;-1:-1:-1;;;;;2383:22:18;;;;;;;;;;2185:227;;;;;:::o;3716:170:32:-;3820:4;3843:36;3867:11;3843:23;:36::i;3892:144::-;1094:13:13;:11;:13::i;:::-;3987:42:32::1;4006:8;4016:12;3987:18;:42::i;:::-;3892:144:::0;;:::o;491:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3958:290:10:-;4061:17;;-1:-1:-1;;;;;4061:17:10;;4089:153;;4137:22;;-1:-1:-1;;;4137:22:10;;;;4132:100;;-1:-1:-1;2266:42:10;4132:100;3958:290;:::o;4163:271:32:-;4224:13;4322:19;4332:8;4322:9;:19::i;:::-;4359;:8;:17;:19::i;:::-;4288:129;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4249:178;;4163:271;;;:::o;2612:309::-;1094:13:13;:11;:13::i;:::-;2692:6:32::1;2702:1;2692:11:::0;2688:39:::1;;2712:15;;-1:-1:-1::0;;;2712:15:32::1;;;;;;;;;;;2688:39;2773:23;::::0;;;:14:::1;:23;::::0;;;;;;;;4128:12;:22;;;;;;;2741:29:::1;::::0;2764:6;;2741:29:::1;:::i;:::-;:55;2737:86;;;2805:18;;-1:-1:-1::0;;;2805:18:32::1;;;;;;;;;;;2737:86;2833:40;719:10:26::0;2853:7:32::1;2862:6;2833:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;2883:21;::::0;;;:12:::1;:21;::::0;;;;:31;;2908:6;;2883:21;:31:::1;::::0;2908:6;;2883:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;2612:309:32:o;3238:472::-;3338:13;;;;3333:43;;3360:16;;-1:-1:-1;;;3360:16:32;;;;;;;;;;;3333:43;3390:20;;;:57;;-1:-1:-1;3414:33:32;;;;3390:57;3386:85;;;3456:15;;-1:-1:-1;;;3456:15:32;;;;;;;;;;;3386:85;3482:43;719:10:26;3507:8:32;;3482:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3482:43:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3517:7:32;;-1:-1:-1;3517:7:32;;;;3482:43;;;3517:7;;3482:43;3517:7;3482:43;;;;;;;;;-1:-1:-1;3482:10:32;;-1:-1:-1;;;3482:43:32:i;:::-;3540:9;3535:110;3555:19;;;3535:110;;;3624:7;;3632:1;3624:10;;;;;;;:::i;:::-;;;;;;;3595:12;:25;3608:8;;3617:1;3608:11;;;;;;;:::i;:::-;;;;;;;3595:25;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;3576:3:32;;-1:-1:-1;3576:3:32;;;:::i;:::-;;;;3535:110;;;-1:-1:-1;719:10:26;-1:-1:-1;;;;;3659:44:32;;3685:8;;3695:7;;3659:44;;;;;;;;;:::i;:::-;;;;;;;;3238:472;;;;:::o;1671:432:24:-;1768:7;1825:27;;;:17;:27;;;;;;;;1796:56;;;;;;;;;-1:-1:-1;;;;;1796:56:24;;;;;-1:-1:-1;;;1796:56:24;;;-1:-1:-1;;;;;1796:56:24;;;;;;;;1768:7;;1863:90;;-1:-1:-1;1913:29:24;;;;;;;;;1923:19;1913:29;-1:-1:-1;;;;;1913:29:24;;;;-1:-1:-1;;;1913:29:24;;-1:-1:-1;;;;;1913:29:24;;;;;1863:90;2001:23;;;;1963:21;;2461:5;;1988:36;;-1:-1:-1;;;;;1988:36:24;:10;:36;:::i;:::-;1987:58;;;;:::i;:::-;2064:16;;;-1:-1:-1;1963:82:24;;-1:-1:-1;;1671:432:24;;;;;;:::o;4064:426:18:-;-1:-1:-1;;;;;4289:20:18;;719:10:26;4289:20:18;;:60;;-1:-1:-1;4313:36:18;4330:4;719:10:26;1005:362:2;:::i;4313:36:18:-;4268:153;;;;-1:-1:-1;;;4268:153:18;;;;;;;:::i;:::-;4431:52;4454:4;4460:2;4464:3;4469:7;4478:4;4431:22;:52::i;:::-;4064:426;;;;;:::o;2569:508::-;2720:16;2779:3;:10;2760:8;:15;:29;2752:83;;;;-1:-1:-1;;;2752:83:18;;17414:2:33;2752:83:18;;;17396:21:33;17453:2;17433:18;;;17426:30;17492:34;17472:18;;;17465:62;-1:-1:-1;;;17543:18:33;;;17536:39;17592:19;;2752:83:18;17212:405:33;2752:83:18;2846:30;2893:8;:15;-1:-1:-1;;;;;2879:30:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2879:30:18;;2846:63;;2925:9;2920:120;2944:8;:15;2940:1;:19;2920:120;;;2999:30;3009:8;3018:1;3009:11;;;;;;;;:::i;:::-;;;;;;;3022:3;3026:1;3022:6;;;;;;;;:::i;:::-;;;;;;;2999:9;:30::i;:::-;2980:13;2994:1;2980:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2961:3;;;:::i;:::-;;;2920:120;;;-1:-1:-1;3057:13:18;2569:508;-1:-1:-1;;;2569:508:18:o;1439:258:32:-;1094:13:13;:11;:13::i;:::-;4102:7:32;4128:22;;;:12;:22;;;;;;1526:25;;:103:::1;;-1:-1:-1::0;1556:23:32::1;::::0;;;:14:::1;:23;::::0;;;;;:35;-1:-1:-1;1556:72:32;::::1;;;-1:-1:-1::0;4102:7:32;4128:22;;;:12;:22;;;;;;1595:9:::1;:33;;1556:72;1522:169;;;1645:23;::::0;;;:14:::1;:23;::::0;;;;;:35;1439:258::o;628:471:31:-;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;724:26:31;::::1;720:60;;759:21;;-1:-1:-1::0;;;759:21:31::1;;;;;;;;;;;720:60;858:39;::::0;-1:-1:-1;;;858:39:31;;882:4:::1;858:39;::::0;::::1;4684:51:33::0;4751:18;;;4744:34;;;817:12:31;;791:14:::1;::::0;-1:-1:-1;;;;;858:15:31;::::1;::::0;::::1;::::0;4657:18:33;;858:39:31::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;840:57;;911:7;922:1;911:12:::0;907:43:::1;;932:18;;-1:-1:-1::0;;;932:18:31::1;;;;;;;;;;;907:43;961:5;-1:-1:-1::0;;;;;961:22:31::1;;992:4;999:7;1273:6:13::0;;-1:-1:-1;;;;;1273:6:13;;1201:85;999:7:31::1;961:68;::::0;-1:-1:-1;;;;;;961:68:31::1;::::0;;;;;;-1:-1:-1;;;;;18162:15:33;;;961:68:31::1;::::0;::::1;18144:34:33::0;18214:15;;18194:18;;;18187:43;18246:18;;;18239:34;;;18289:18;;;18282:34;;;18124:3;18332:19;;;18325:32;-1:-1:-1;18373:19:33;;;18366:30;18413:19;;961:68:31::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1075:7;1061:12;-1:-1:-1::0;;;;;1044:48:31::1;;1084:7;1044:48;;;;616:25:33::0;;604:2;589:18;;470:177;1044:48:31::1;;;;;;;;710:389;;628:471:::0;;:::o;1831:101:13:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1796:100:32:-;1094:13:13;:11;:13::i;:::-;1863::32::1;:26:::0;;-1:-1:-1;;1863:26:32::1;::::0;::::1;;::::0;;;::::1;::::0;;1796:100::o;1503:450:31:-;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;1598:26:31;::::1;1594:60;;1633:21;;-1:-1:-1::0;;;1633:21:31::1;;;;;;;;;;;1594:60;1735:22;::::0;-1:-1:-1;;;1735:22:31;;::::1;::::0;::::1;616:25:33::0;;;1689:12:31;;1665:13:::1;::::0;-1:-1:-1;;;;;1735:13:31;::::1;::::0;::::1;::::0;589:18:33;;1735:22:31::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1712:45:::0;-1:-1:-1;;;;;;1771:29:31;::::1;1795:4;1771:29;1767:60;;1809:18;;-1:-1:-1::0;;;1809:18:31::1;;;;;;;;;;;1767:60;1838:5;-1:-1:-1::0;;;;;1838:22:31::1;;1869:4;1876:7;1273:6:13::0;;-1:-1:-1;;;;;1273:6:13;;1201:85;1876:7:31::1;1838:55;::::0;-1:-1:-1;;;;;;1838:55:31::1;::::0;;;;;;-1:-1:-1;;;;;18957:15:33;;;1838:55:31::1;::::0;::::1;18939:34:33::0;19009:15;;18989:18;;;18982:43;19041:18;;;19034:34;;;18874:18;;1838:55:31::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;1908:38:31::1;::::0;1938:7;;-1:-1:-1;;;;;;1908:38:31;::::1;::::0;-1:-1:-1;1908:38:31::1;::::0;;;::::1;1584:369;;1503:450:::0;;:::o;515:20:32:-;;;;;;;:::i;1703:87::-;1094:13:13;:11;:13::i;:::-;1770::32::1;1778:4;;1770:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;1770:7:32::1;::::0;-1:-1:-1;;;1770:13:32:i:1;1139:253:9:-:0;1230:31;:29;:31::i;:::-;1271:33;:47;;;;;-1:-1:-1;;;1271:47:9;-1:-1:-1;;;;1271:47:9;;;;;;1333:52;;;;;;1307:11;1411:14:33;1404:22;1386:41;;1374:2;1359:18;;1246:187;1333:52:9;;;;;;;;1139:253;:::o;1105:392:31:-;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;1182:26:31;::::1;1178:60;;1217:21;;-1:-1:-1::0;;;1217:21:31::1;;;;;;;;;;;1178:60;1312:30;::::0;-1:-1:-1;;;1312:30:31;;1336:4:::1;1312:30;::::0;::::1;798:51:33::0;1271:12:31;;1249::::1;::::0;-1:-1:-1;;;;;1312:15:31;::::1;::::0;::::1;::::0;771:18:33;;1312:30:31::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1294:48;;1356:7;1367:1;1356:12:::0;1352:43:::1;;1377:18;;-1:-1:-1::0;;;1377:18:31::1;;;;;;;;;;;1352:43;1406:5;-1:-1:-1::0;;;;;1406:14:31::1;;1421:7;1273:6:13::0;;-1:-1:-1;;;;;1273:6:13;;1201:85;1421:7:31::1;1406:32;::::0;-1:-1:-1;;;;;;1406:32:31::1;::::0;;;;;;-1:-1:-1;;;;;4702:32:33;;;1406::31::1;::::0;::::1;4684:51:33::0;4751:18;;;4744:34;;;4657:18;;1406:32:31::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1468:12;-1:-1:-1::0;;;;;1453:37:31::1;;1482:7;1453:37;;;;616:25:33::0;;604:2;589:18;;470:177;1453:37:31::1;;;;;;;;1168:329;;1105:392:::0;:::o;3145:153:18:-;3239:52;719:10:26;3272:8:18;3282;3239:18;:52::i;3268:580:10:-;3343:31;:29;:31::i;:::-;-1:-1:-1;;;;;3417:30:10;;;;:34;;;3465:32;;;;:61;;;3502:24;3501:25;3465:61;3462:150;;;3549:52;;-1:-1:-1;;;3549:52:10;;;;;;;;;;;3462:150;3627:77;3660:22;:20;:22::i;:::-;3627:77;;;-1:-1:-1;;;;;19559:15:33;;;19541:34;;19611:15;;;19606:2;19591:18;;19584:43;19476:18;3627:77:10;;;;;;;3715:22;:29;;-1:-1:-1;;;;3715:29:10;-1:-1:-1;;;3715:29:10;;;3754:17;:38;;-1:-1:-1;;;;;3754:38:10;;-1:-1:-1;;;;;;3754:38:10;;;;;;3803;3774:18;3803;:38::i;2927:305:32:-;2998:13;;;;2993:43;;3020:16;;-1:-1:-1;;;3020:16:32;;;;;;;;;;;2993:43;3050:6;3060:1;3050:11;3046:39;;3070:15;;-1:-1:-1;;;3070:15:32;;;;;;;;;;;3046:39;3096:36;719:10:26;3116:7:32;3125:6;3096:5;:36::i;:::-;3142:21;;;;:12;:21;;;;;:31;;3167:6;;3142:21;:31;;3167:6;;3142:31;:::i;:::-;;;;-1:-1:-1;;3188:37:32;;;19812:25:33;;;19868:2;19853:18;;19846:34;;;719:10:26;;3188:37:32;;19785:18:33;3188:37:32;;;;;;;;2927:305;;:::o;1902:704::-;1094:13:13;:11;:13::i;:::-;2048:3:32::1;2028:23:::0;::::1;2024:60;;;2060:24;;-1:-1:-1::0;;;2060:24:32::1;;;;;;;;;;;2024:60;2119:1;2098:22:::0;;;2094:69:::1;;2129:34;;-1:-1:-1::0;;;2129:34:32::1;;;;;;;;;;;2094:69;2177:35:::0;;::::1;2173:88;;2221:40;;-1:-1:-1::0;;;2221:40:32::1;;;;;;;;;;;2173:88;2277:9;2272:328;2292:21:::0;;::::1;2272:328;;;2338:7;;2346:1;2338:10;;;;;;;:::i;:::-;;;;;;;2352:1;2338:15:::0;2334:43:::1;;2362:15;;-1:-1:-1::0;;;2362:15:32::1;;;;;;;;;;;2334:43;2431:23;::::0;;;:14:::1;:23;::::0;;;;;2418:7;;2426:1;2418:10;;::::1;;;;;:::i;:::-;;;;;;;2395:20;2407:7;4102::::0;4128:22;;;:12;:22;;;;;;;4042:115;2395:20:::1;:33;;;;:::i;:::-;:59;2391:90;;;2463:18;;-1:-1:-1::0;;;2463:18:32::1;;;;;;;;;;;2391:90;2495:45;2501:10;;2512:1;2501:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2516:7;2525;;2533:1;2525:10;;;;;;;:::i;:::-;;;;;;;2495:45;;;;;;;;;;;::::0;:5:::1;:45::i;:::-;2579:7;;2587:1;2579:10;;;;;;;:::i;:::-;;;;;;;2554:12;:21;2567:7;2554:21;;;;;;;;;;;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;2315:3:32;;-1:-1:-1;2315:3:32::1;::::0;::::1;:::i;:::-;;;;2272:328;;;;1902:704:::0;;;;;:::o;1005:362:2:-;-1:-1:-1;;;;;3487:27:18;;;1102:15:2;3487:27:18;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;1192:169:2;;1227:33;;-1:-1:-1;;;1227:33:2;;;;1223:128;;;1313:22;:20;:22::i;:::-;-1:-1:-1;;;;;1293:43:2;:8;-1:-1:-1;;;;;1293:43:2;;1280:56;;1005:362;;;;:::o;3598:394:18:-;-1:-1:-1;;;;;3798:20:18;;719:10:26;3798:20:18;;:60;;-1:-1:-1;3822:36:18;3839:4;719:10:26;1005:362:2;:::i;3822:36:18:-;3777:153;;;;-1:-1:-1;;;3777:153:18;;;;;;;:::i;:::-;3940:45;3958:4;3964:2;3968;3972:6;3980:4;3940:17;:45::i;2081:198:13:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:13;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:13;;20093:2:33;2161:73:13::1;::::0;::::1;20075:21:33::0;20132:2;20112:18;;;20105:30;20171:34;20151:18;;;20144:62;-1:-1:-1;;;20222:18:33;;;20215:36;20268:19;;2161:73:13::1;19891:402:33::0;2161:73:13::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1408:213:24:-;1510:4;-1:-1:-1;;;;;;1533:41:24;;-1:-1:-1;;;1533:41:24;;:81;;;1578:36;1602:11;1578:23;:36::i;1359:130:13:-;1273:6;;-1:-1:-1;;;;;1273:6:13;719:10:26;1422:23:13;1414:68;;;;-1:-1:-1;;;1414:68:13;;20500:2:33;1414:68:13;;;20482:21:33;;;20519:18;;;20512:30;20578:34;20558:18;;;20551:62;20630:18;;1414:68:13;20298:356:33;527:214:7;630:48;655:8;665:12;630:24;:48::i;:::-;693:41;;-1:-1:-1;;;;;20821:39:33;;20803:58;;-1:-1:-1;;;;;693:41:7;;;;;20791:2:33;20776:18;693:41:7;20659:208:33;1940:103:18;2000:13;2032:4;2025:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1940:103;;;:::o;415:696:27:-;471:13;520:14;537:17;548:5;537:10;:17::i;:::-;557:1;537:21;520:38;;572:20;606:6;-1:-1:-1;;;;;595:18:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;595:18:27;-1:-1:-1;572:41:27;-1:-1:-1;733:28:27;;;749:2;733:28;788:280;-1:-1:-1;;819:5:27;-1:-1:-1;;;953:2:27;942:14;;937:30;819:5;924:44;1012:2;1003:11;;;-1:-1:-1;1032:21:27;788:280;1032:21;-1:-1:-1;1088:6:27;415:696;-1:-1:-1;;;415:696:27:o;8630:709:18:-;-1:-1:-1;;;;;8777:16:18;;8769:62;;;;-1:-1:-1;;;8769:62:18;;21074:2:33;8769:62:18;;;21056:21:33;21113:2;21093:18;;;21086:30;21152:34;21132:18;;;21125:62;-1:-1:-1;;;21203:18:33;;;21196:31;21244:19;;8769:62:18;20872:397:33;8769:62:18;719:10:26;8842:16:18;8906:21;8924:2;8906:17;:21::i;:::-;8883:44;;8937:24;8964:25;8982:6;8964:17;:25::i;:::-;8937:52;;9000:66;9021:8;9039:1;9043:2;9047:3;9052:7;9061:4;9000:20;:66::i;:::-;9077:9;:13;;;;;;;;;;;-1:-1:-1;;;;;9077:17:18;;;;;;;;;:27;;9098:6;;9077:9;:27;;9098:6;;9077:27;:::i;:::-;;;;-1:-1:-1;;9119:52:18;;;19812:25:33;;;19868:2;19853:18;;19846:34;;;-1:-1:-1;;;;;9119:52:18;;;;9152:1;;9119:52;;;;;;19785:18:33;9119:52:18;;;;;;;9182:65;9202:8;9220:1;9224:2;9228:3;9233:7;9242:4;9182:19;:65::i;:::-;9258:74;9289:8;9307:1;9311:2;9315;9319:6;9327:4;9258:30;:74::i;:::-;8759:580;;;8630:709;;;;:::o;11831:943::-;-1:-1:-1;;;;;11978:18:18;;11970:66;;;;-1:-1:-1;;;11970:66:18;;;;;;;:::i;:::-;12068:7;:14;12054:3;:10;:28;12046:81;;;;-1:-1:-1;;;12046:81:18;;;;;;;:::i;:::-;12138:16;719:10:26;12138:31:18;;12180:66;12201:8;12211:4;12225:1;12229:3;12234:7;12180:66;;;;;;;;;;;;:20;:66::i;:::-;12262:9;12257:364;12281:3;:10;12277:1;:14;12257:364;;;12312:10;12325:3;12329:1;12325:6;;;;;;;;:::i;:::-;;;;;;;12312:19;;12345:14;12362:7;12370:1;12362:10;;;;;;;;:::i;:::-;;;;;;;;;;;;12387:19;12409:13;;;;;;;;;;-1:-1:-1;;;;;12409:19:18;;;;;;;;;;;;12362:10;;-1:-1:-1;12450:21:18;;;;12442:70;;;;-1:-1:-1;;;12442:70:18;;;;;;;:::i;:::-;12554:9;:13;;;;;;;;;;;-1:-1:-1;;;;;12554:19:18;;;;;;;;;;12576:20;;12554:42;;12293:3;;;;:::i;:::-;;;;12257:364;;;;12674:1;-1:-1:-1;;;;;12636:55:18;12660:4;-1:-1:-1;;;;;12636:55:18;12650:8;-1:-1:-1;;;;;12636:55:18;;12678:3;12683:7;12636:55;;;;;;;:::i;:::-;;;;;;;;12702:65;12722:8;12732:4;12746:1;12750:3;12755:7;12702:65;;;;;;;;;;;;:19;:65::i;:::-;11960:814;11831:943;;;:::o;6233:1115::-;6453:7;:14;6439:3;:10;:28;6431:81;;;;-1:-1:-1;;;6431:81:18;;;;;;;:::i;:::-;-1:-1:-1;;;;;6530:16:18;;6522:66;;;;-1:-1:-1;;;6522:66:18;;;;;;;:::i;:::-;719:10:26;6641:60:18;719:10:26;6672:4:18;6678:2;6682:3;6687:7;6696:4;6641:20;:60::i;:::-;6717:9;6712:411;6736:3;:10;6732:1;:14;6712:411;;;6767:10;6780:3;6784:1;6780:6;;;;;;;;:::i;:::-;;;;;;;6767:19;;6800:14;6817:7;6825:1;6817:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6842:19;6864:13;;;;;;;;;;-1:-1:-1;;;;;6864:19:18;;;;;;;;;;;;6817:10;;-1:-1:-1;6905:21:18;;;;6897:76;;;;-1:-1:-1;;;6897:76:18;;;;;;;:::i;:::-;7015:9;:13;;;;;;;;;;;-1:-1:-1;;;;;7015:19:18;;;;;;;;;;7037:20;;;7015:42;;7085:17;;;;;;;:27;;7037:20;;7015:9;7085:27;;7037:20;;7085:27;:::i;:::-;;;;;;;;6753:370;;;6748:3;;;;:::i;:::-;;;6712:411;;;;7168:2;-1:-1:-1;;;;;7138:47:18;7162:4;-1:-1:-1;;;;;7138:47:18;7152:8;-1:-1:-1;;;;;7138:47:18;;7172:3;7177:7;7138:47;;;;;;;:::i;:::-;;;;;;;;7196:59;7216:8;7226:4;7232:2;7236:3;7241:7;7250:4;7196:19;:59::i;:::-;7266:75;7302:8;7312:4;7318:2;7322:3;7327:7;7336:4;7266:35;:75::i;2433:187:13:-;2525:6;;;-1:-1:-1;;;;;2541:17:13;;;-1:-1:-1;;;;;;2541:17:13;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;8171:86:18:-;8237:4;:13;8244:6;8237:4;:13;:::i;215:102:0:-;297:13;:11;:13::i;12910:323:18:-;13060:8;-1:-1:-1;;;;;13051:17:18;:5;-1:-1:-1;;;;;13051:17:18;;13043:71;;;;-1:-1:-1;;;13043:71:18;;26185:2:33;13043:71:18;;;26167:21:33;26224:2;26204:18;;;26197:30;26263:34;26243:18;;;26236:62;-1:-1:-1;;;26314:18:33;;;26307:39;26363:19;;13043:71:18;25983:405:33;13043:71:18;-1:-1:-1;;;;;13124:25:18;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13124:46:18;;;;;;;;;;13185:41;;1386::33;;;13185::18;;1359:18:33;13185:41:18;;;;;;;12910:323;;;:::o;7405:448:10:-;-1:-1:-1;;;;;7475:23:10;;;7471:376;;7601:22;;7653:21;;7650:187;;7698:95;;;-1:-1:-1;;;7698:95:10;;7773:4;7698:95;;;26565:51:33;838:4:12;26632:18:33;;;26625:47;7698:95:10;;-1:-1:-1;;;;;7698:66:10;;;;;26538:18:33;;;;;-1:-1:-1;;7698:95:10;;;;;;;-1:-1:-1;7698:66:10;:95;;;;;;;;;;;;;;;;;;;;;;;;;7694:129;;;7500:347;7405:448;:::o;10806:786:18:-;-1:-1:-1;;;;;10928:18:18;;10920:66;;;;-1:-1:-1;;;10920:66:18;;;;;;;:::i;:::-;719:10:26;10997:16:18;11061:21;11079:2;11061:17;:21::i;:::-;11038:44;;11092:24;11119:25;11137:6;11119:17;:25::i;:::-;11092:52;;11155:66;11176:8;11186:4;11200:1;11204:3;11209:7;11155:66;;;;;;;;;;;;:20;:66::i;:::-;11232:19;11254:13;;;;;;;;;;;-1:-1:-1;;;;;11254:19:18;;;;;;;;;;11291:21;;;;11283:70;;;;-1:-1:-1;;;11283:70:18;;;;;;;:::i;:::-;11387:9;:13;;;;;;;;;;;-1:-1:-1;;;;;11387:19:18;;;;;;;;;;;;11409:20;;;11387:42;;11455:54;;19812:25:33;;;19853:18;;;19846:34;;;11387:19:18;;11455:54;;;;;;19785:18:33;11455:54:18;;;;;;;11520:65;11540:8;11550:4;11564:1;11568:3;11573:7;11520:65;;;;;;;;;;;;:19;:65::i;4940:947::-;-1:-1:-1;;;;;5121:16:18;;5113:66;;;;-1:-1:-1;;;5113:66:18;;;;;;;:::i;:::-;719:10:26;5190:16:18;5254:21;5272:2;5254:17;:21::i;:::-;5231:44;;5285:24;5312:25;5330:6;5312:17;:25::i;:::-;5285:52;;5348:60;5369:8;5379:4;5385:2;5389:3;5394:7;5403:4;5348:20;:60::i;:::-;5419:19;5441:13;;;;;;;;;;;-1:-1:-1;;;;;5441:19:18;;;;;;;;;;5478:21;;;;5470:76;;;;-1:-1:-1;;;5470:76:18;;;;;;;:::i;:::-;5580:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5580:19:18;;;;;;;;;;5602:20;;;5580:42;;5642:17;;;;;;;:27;;5602:20;;5580:9;5642:27;;5602:20;;5642:27;:::i;:::-;;;;-1:-1:-1;;5685:46:18;;;19812:25:33;;;19868:2;19853:18;;19846:34;;;-1:-1:-1;;;;;5685:46:18;;;;;;;;;;;;;;19785:18:33;5685:46:18;;;;;;;5742:59;5762:8;5772:4;5778:2;5782:3;5787:7;5796:4;5742:19;:59::i;:::-;5812:68;5843:8;5853:4;5859:2;5863;5867:6;5875:4;5812:30;:68::i;:::-;5103:784;;;;4940:947;;;;;:::o;1653:284:2:-;1738:4;-1:-1:-1;;;;;;1770:46:2;;-1:-1:-1;;;1770:46:2;;:111;;-1:-1:-1;;;;;;;1829:52:2;;-1:-1:-1;;;1829:52:2;1770:111;:160;;;;1894:36;1918:11;1894:23;:36::i;2734:327:24:-;2461:5;-1:-1:-1;;;;;2836:33:24;;;;2828:88;;;;-1:-1:-1;;;2828:88:24;;26885:2:33;2828:88:24;;;26867:21:33;26924:2;26904:18;;;26897:30;26963:34;26943:18;;;26936:62;-1:-1:-1;;;27014:18:33;;;27007:40;27064:19;;2828:88:24;26683:406:33;2828:88:24;-1:-1:-1;;;;;2934:22:24;;2926:60;;;;-1:-1:-1;;;2926:60:24;;27296:2:33;2926:60:24;;;27278:21:33;27335:2;27315:18;;;27308:30;27374:27;27354:18;;;27347:55;27419:18;;2926:60:24;27094:349:33;2926:60:24;3019:35;;;;;;;;;-1:-1:-1;;;;;3019:35:24;;;;;;-1:-1:-1;;;;;3019:35:24;;;;;;;;;;-1:-1:-1;;;2997:57:24;;;;:19;:57;2734:327::o;9889:890:30:-;9942:7;;-1:-1:-1;;;10017:15:30;;10013:99;;-1:-1:-1;;;10052:15:30;;;-1:-1:-1;10095:2:30;10085:12;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;-1:-1:-1;10207:2:30;10197:12;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;-1:-1:-1;10319:2:30;10309:12;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;-1:-1:-1;10429:1:30;10419:11;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;-1:-1:-1;10538:1:30;10528:11;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;-1:-1:-1;10647:1:30;10637:11;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;10766:6;9889:890;-1:-1:-1;;9889:890:30:o;17064:193:18:-;17183:16;;;17197:1;17183:16;;;;;;;;;17130;;17158:22;;17183:16;;;;;;;;;;;;-1:-1:-1;17183:16:18;17158:41;;17220:7;17209:5;17215:1;17209:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17245:5;17064:193;-1:-1:-1;;17064:193:18:o;2480:469:2:-;2744:10;;2719:22;2764:179;2788:14;2784:1;:18;2764:179;;;2819:53;2843:4;2849:2;2853:3;2857:1;2853:6;;;;;;;;:::i;:::-;;;;;;;2861:7;2869:1;2861:10;;;;;;;;:::i;:::-;;;;;;;2819:23;:53::i;:::-;2915:3;;2764:179;;;;2709:240;2480:469;;;;;;:::o;3059:467::-;3322:10;;3297:22;3342:178;3366:14;3362:1;:18;3342:178;;;3397:52;3420:4;3426:2;3430:3;3434:1;3430:6;;;;;;;;:::i;:::-;;;;;;;3438:7;3446:1;3438:10;;;;;;;;:::i;:::-;;;;;;;3397:22;:52::i;:::-;3492:3;;3342:178;;15535:725:18;-1:-1:-1;;;;;15742:13:18;;1465:19:25;:23;15738:516:18;;15777:72;;-1:-1:-1;;;15777:72:18;;-1:-1:-1;;;;;15777:38:18;;;;;:72;;15816:8;;15826:4;;15832:2;;15836:6;;15844:4;;15777:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15777:72:18;;;;;;;;-1:-1:-1;;15777:72:18;;;;;;;;;;;;:::i;:::-;;;15773:471;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16120:6;16113:14;;-1:-1:-1;;;16113:14:18;;;;;;;;:::i;15773:471::-;;;16167:62;;-1:-1:-1;;;16167:62:18;;29330:2:33;16167:62:18;;;29312:21:33;29369:2;29349:18;;;29342:30;29408:34;29388:18;;;29381:62;-1:-1:-1;;;29459:18:33;;;29452:50;29519:19;;16167:62:18;29128:416:33;15773:471:18;-1:-1:-1;;;;;;15898:55:18;;-1:-1:-1;;;15898:55:18;15894:152;;15977:50;;-1:-1:-1;;;15977:50:18;;;;;;;:::i;16266:792::-;-1:-1:-1;;;;;16498:13:18;;1465:19:25;:23;16494:558:18;;16533:79;;-1:-1:-1;;;16533:79:18;;-1:-1:-1;;;;;16533:43:18;;;;;:79;;16577:8;;16587:4;;16593:3;;16598:7;;16607:4;;16533:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16533:79:18;;;;;;;;-1:-1:-1;;16533:79:18;;;;;;;;;;;;:::i;:::-;;;16529:513;;;;:::i;:::-;-1:-1:-1;;;;;;16691:60:18;;-1:-1:-1;;;16691:60:18;16687:157;;16775:50;;-1:-1:-1;;;16775:50:18;;;;;;;:::i;1236:305::-;1338:4;-1:-1:-1;;;;;;1373:41:18;;-1:-1:-1;;;1373:41:18;;:109;;-1:-1:-1;;;;;;;1430:52:18;;-1:-1:-1;;;1430:52:18;1373:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:28;;;1498:36:18;829:155:28;3830:650:11;-1:-1:-1;;;;;3972:18:11;;;;;4021:16;;;3972:18;4051:32;;;;;4070:13;4051:32;4048:426;;;4106:28;;-1:-1:-1;;;4106:28:11;;;;;;;;;;;4048:426;4154:15;4151:323;;;4185:62;4151:323;;;4267:13;4296:64;4264:210;4391:72;719:10:26;4426:4:11;4432:2;4436:7;4445:6;4453:9;4391:20;:72::i;4610:652::-;-1:-1:-1;;;;;4751:18:11;;;;;4800:16;;;4751:18;4830:32;;;;;4849:13;4830:32;4827:429;;;4885:28;;-1:-1:-1;;;4885:28:11;;;;;;;;;;;4827:429;4933:15;4964:63;4930:326;5047:13;5076:65;5044:212;5172:73;2081:198:13:o;6844:489:10:-;7057:17;7077:22;:20;:22::i;:::-;7057:42;-1:-1:-1;;;;;;7114:23:10;;;7110:217;;-1:-1:-1;;;;;7157:23:10;;:10;:23;7153:68;;7200:7;;;7153:68;7235:81;;-1:-1:-1;;;7235:81:10;;-1:-1:-1;;;;;31105:15:33;;;7235:81:10;;;31087:34:33;31157:15;;;31137:18;;;31130:43;31209:15;;;31189:18;;;31182:43;31241:18;;;31234:34;;;31284:19;;;31277:35;;;7235:46:10;;;;;31021:19:33;;7235:81:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7047:286;6844:489;;;;;;:::o;14:131:33:-;-1:-1:-1;;;;;89:31:33;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:33:o;860:131::-;-1:-1:-1;;;;;;934:32:33;;924:43;;914:71;;981:1;978;971:12;996:245;1054:6;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1162:9;1149:23;1181:30;1205:5;1181:30;:::i;:::-;1230:5;996:245;-1:-1:-1;;;996:245:33:o;1438:435::-;1505:6;1513;1566:2;1554:9;1545:7;1541:23;1537:32;1534:52;;;1582:1;1579;1572:12;1534:52;1621:9;1608:23;1640:31;1665:5;1640:31;:::i;:::-;1690:5;-1:-1:-1;1747:2:33;1732:18;;1719:32;-1:-1:-1;;;;;1782:40:33;;1770:53;;1760:81;;1837:1;1834;1827:12;1760:81;1860:7;1850:17;;;1438:435;;;;;:::o;1878:250::-;1963:1;1973:113;1987:6;1984:1;1981:13;1973:113;;;2063:11;;;2057:18;2044:11;;;2037:39;2009:2;2002:10;1973:113;;;-1:-1:-1;;2120:1:33;2102:16;;2095:27;1878:250::o;2133:271::-;2175:3;2213:5;2207:12;2240:6;2235:3;2228:19;2256:76;2325:6;2318:4;2313:3;2309:14;2302:4;2295:5;2291:16;2256:76;:::i;:::-;2386:2;2365:15;-1:-1:-1;;2361:29:33;2352:39;;;;2393:4;2348:50;;2133:271;-1:-1:-1;;2133:271:33:o;2409:220::-;2558:2;2547:9;2540:21;2521:4;2578:45;2619:2;2608:9;2604:18;2596:6;2578:45;:::i;2922:180::-;2981:6;3034:2;3022:9;3013:7;3009:23;3005:32;3002:52;;;3050:1;3047;3040:12;3002:52;-1:-1:-1;3073:23:33;;2922:180;-1:-1:-1;2922:180:33:o;3107:248::-;3175:6;3183;3236:2;3224:9;3215:7;3211:23;3207:32;3204:52;;;3252:1;3249;3242:12;3204:52;-1:-1:-1;;3275:23:33;;;3345:2;3330:18;;;3317:32;;-1:-1:-1;3107:248:33:o;3360:367::-;3423:8;3433:6;3487:3;3480:4;3472:6;3468:17;3464:27;3454:55;;3505:1;3502;3495:12;3454:55;-1:-1:-1;3528:20:33;;-1:-1:-1;;;;;3560:30:33;;3557:50;;;3603:1;3600;3593:12;3557:50;3640:4;3632:6;3628:17;3616:29;;3700:3;3693:4;3683:6;3680:1;3676:14;3668:6;3664:27;3660:38;3657:47;3654:67;;;3717:1;3714;3707:12;3732:773;3854:6;3862;3870;3878;3931:2;3919:9;3910:7;3906:23;3902:32;3899:52;;;3947:1;3944;3937:12;3899:52;3987:9;3974:23;-1:-1:-1;;;;;4057:2:33;4049:6;4046:14;4043:34;;;4073:1;4070;4063:12;4043:34;4112:70;4174:7;4165:6;4154:9;4150:22;4112:70;:::i;:::-;4201:8;;-1:-1:-1;4086:96:33;-1:-1:-1;4289:2:33;4274:18;;4261:32;;-1:-1:-1;4305:16:33;;;4302:36;;;4334:1;4331;4324:12;4302:36;;4373:72;4437:7;4426:8;4415:9;4411:24;4373:72;:::i;:::-;3732:773;;;;-1:-1:-1;4464:8:33;-1:-1:-1;;;;3732:773:33:o;4789:127::-;4850:10;4845:3;4841:20;4838:1;4831:31;4881:4;4878:1;4871:15;4905:4;4902:1;4895:15;4921:249;5031:2;5012:13;;-1:-1:-1;;5008:27:33;4996:40;;-1:-1:-1;;;;;5051:34:33;;5087:22;;;5048:62;5045:88;;;5113:18;;:::i;:::-;5149:2;5142:22;-1:-1:-1;;4921:249:33:o;5175:183::-;5235:4;-1:-1:-1;;;;;5260:6:33;5257:30;5254:56;;;5290:18;;:::i;:::-;-1:-1:-1;5335:1:33;5331:14;5347:4;5327:25;;5175:183::o;5363:724::-;5417:5;5470:3;5463:4;5455:6;5451:17;5447:27;5437:55;;5488:1;5485;5478:12;5437:55;5524:6;5511:20;5550:4;5573:43;5613:2;5573:43;:::i;:::-;5645:2;5639:9;5657:31;5685:2;5677:6;5657:31;:::i;:::-;5723:18;;;5815:1;5811:10;;;;5799:23;;5795:32;;;5757:15;;;;-1:-1:-1;5839:15:33;;;5836:35;;;5867:1;5864;5857:12;5836:35;5903:2;5895:6;5891:15;5915:142;5931:6;5926:3;5923:15;5915:142;;;5997:17;;5985:30;;6035:12;;;;5948;;5915:142;;;-1:-1:-1;6075:6:33;5363:724;-1:-1:-1;;;;;;5363:724:33:o;6092:555::-;6134:5;6187:3;6180:4;6172:6;6168:17;6164:27;6154:55;;6205:1;6202;6195:12;6154:55;6241:6;6228:20;-1:-1:-1;;;;;6263:2:33;6260:26;6257:52;;;6289:18;;:::i;:::-;6338:2;6332:9;6350:67;6405:2;6386:13;;-1:-1:-1;;6382:27:33;6411:4;6378:38;6332:9;6350:67;:::i;:::-;6441:2;6433:6;6426:18;6487:3;6480:4;6475:2;6467:6;6463:15;6459:26;6456:35;6453:55;;;6504:1;6501;6494:12;6453:55;6568:2;6561:4;6553:6;6549:17;6542:4;6534:6;6530:17;6517:54;6615:1;6591:15;;;6608:4;6587:26;6580:37;;;;6595:6;6092:555;-1:-1:-1;;;6092:555:33:o;6652:1071::-;6806:6;6814;6822;6830;6838;6891:3;6879:9;6870:7;6866:23;6862:33;6859:53;;;6908:1;6905;6898:12;6859:53;6947:9;6934:23;6966:31;6991:5;6966:31;:::i;:::-;7016:5;-1:-1:-1;7073:2:33;7058:18;;7045:32;7086:33;7045:32;7086:33;:::i;:::-;7138:7;-1:-1:-1;7196:2:33;7181:18;;7168:32;-1:-1:-1;;;;;7249:14:33;;;7246:34;;;7276:1;7273;7266:12;7246:34;7299:61;7352:7;7343:6;7332:9;7328:22;7299:61;:::i;:::-;7289:71;;7413:2;7402:9;7398:18;7385:32;7369:48;;7442:2;7432:8;7429:16;7426:36;;;7458:1;7455;7448:12;7426:36;7481:63;7536:7;7525:8;7514:9;7510:24;7481:63;:::i;:::-;7471:73;;7597:3;7586:9;7582:19;7569:33;7553:49;;7627:2;7617:8;7614:16;7611:36;;;7643:1;7640;7633:12;7611:36;;7666:51;7709:7;7698:8;7687:9;7683:24;7666:51;:::i;:::-;7656:61;;;6652:1071;;;;;;;;:::o;7728:1277::-;7846:6;7854;7907:2;7895:9;7886:7;7882:23;7878:32;7875:52;;;7923:1;7920;7913:12;7875:52;7963:9;7950:23;-1:-1:-1;;;;;8033:2:33;8025:6;8022:14;8019:34;;;8049:1;8046;8039:12;8019:34;8087:6;8076:9;8072:22;8062:32;;8132:7;8125:4;8121:2;8117:13;8113:27;8103:55;;8154:1;8151;8144:12;8103:55;8190:2;8177:16;8212:4;8235:43;8275:2;8235:43;:::i;:::-;8307:2;8301:9;8319:31;8347:2;8339:6;8319:31;:::i;:::-;8385:18;;;8473:1;8469:10;;;;8461:19;;8457:28;;;8419:15;;;;-1:-1:-1;8497:19:33;;;8494:39;;;8529:1;8526;8519:12;8494:39;8553:11;;;;8573:217;8589:6;8584:3;8581:15;8573:217;;;8669:3;8656:17;8686:31;8711:5;8686:31;:::i;:::-;8730:18;;8606:12;;;;8768;;;;8573:217;;;8809:6;-1:-1:-1;;8853:18:33;;8840:32;;-1:-1:-1;;8884:16:33;;;8881:36;;;8913:1;8910;8903:12;8881:36;;8936:63;8991:7;8980:8;8969:9;8965:24;8936:63;:::i;:::-;8926:73;;;7728:1277;;;;;:::o;9010:435::-;9063:3;9101:5;9095:12;9128:6;9123:3;9116:19;9154:4;9183:2;9178:3;9174:12;9167:19;;9220:2;9213:5;9209:14;9241:1;9251:169;9265:6;9262:1;9259:13;9251:169;;;9326:13;;9314:26;;9360:12;;;;9395:15;;;;9287:1;9280:9;9251:169;;;-1:-1:-1;9436:3:33;;9010:435;-1:-1:-1;;;;;9010:435:33:o;9450:261::-;9629:2;9618:9;9611:21;9592:4;9649:56;9701:2;9690:9;9686:18;9678:6;9649:56;:::i;9716:118::-;9802:5;9795:13;9788:21;9781:5;9778:32;9768:60;;9824:1;9821;9814:12;9839:241;9895:6;9948:2;9936:9;9927:7;9923:23;9919:32;9916:52;;;9964:1;9961;9954:12;9916:52;10003:9;9990:23;10022:28;10044:5;10022:28;:::i;10085:592::-;10156:6;10164;10217:2;10205:9;10196:7;10192:23;10188:32;10185:52;;;10233:1;10230;10223:12;10185:52;10273:9;10260:23;-1:-1:-1;;;;;10343:2:33;10335:6;10332:14;10329:34;;;10359:1;10356;10349:12;10329:34;10397:6;10386:9;10382:22;10372:32;;10442:7;10435:4;10431:2;10427:13;10423:27;10413:55;;10464:1;10461;10454:12;10413:55;10504:2;10491:16;10530:2;10522:6;10519:14;10516:34;;;10546:1;10543;10536:12;10516:34;10591:7;10586:2;10577:6;10573:2;10569:15;10565:24;10562:37;10559:57;;;10612:1;10609;10602:12;10559:57;10643:2;10635:11;;;;;10665:6;;-1:-1:-1;10085:592:33;;-1:-1:-1;;;;10085:592:33:o;10682:247::-;10741:6;10794:2;10782:9;10773:7;10769:23;10765:32;10762:52;;;10810:1;10807;10800:12;10762:52;10849:9;10836:23;10868:31;10893:5;10868:31;:::i;10934:382::-;10999:6;11007;11060:2;11048:9;11039:7;11035:23;11031:32;11028:52;;;11076:1;11073;11066:12;11028:52;11115:9;11102:23;11134:31;11159:5;11134:31;:::i;:::-;11184:5;-1:-1:-1;11241:2:33;11226:18;;11213:32;11254:30;11213:32;11254:30;:::i;11321:841::-;11452:6;11460;11468;11476;11484;11537:2;11525:9;11516:7;11512:23;11508:32;11505:52;;;11553:1;11550;11543:12;11505:52;11589:9;11576:23;11566:33;;11650:2;11639:9;11635:18;11622:32;-1:-1:-1;;;;;11714:2:33;11706:6;11703:14;11700:34;;;11730:1;11727;11720:12;11700:34;11769:70;11831:7;11822:6;11811:9;11807:22;11769:70;:::i;:::-;11858:8;;-1:-1:-1;11743:96:33;-1:-1:-1;11946:2:33;11931:18;;11918:32;;-1:-1:-1;11962:16:33;;;11959:36;;;11991:1;11988;11981:12;11959:36;;12030:72;12094:7;12083:8;12072:9;12068:24;12030:72;:::i;:::-;11321:841;;;;-1:-1:-1;11321:841:33;;-1:-1:-1;12121:8:33;;12004:98;11321:841;-1:-1:-1;;;11321:841:33:o;12167:388::-;12235:6;12243;12296:2;12284:9;12275:7;12271:23;12267:32;12264:52;;;12312:1;12309;12302:12;12264:52;12351:9;12338:23;12370:31;12395:5;12370:31;:::i;:::-;12420:5;-1:-1:-1;12477:2:33;12462:18;;12449:32;12490:33;12449:32;12490:33;:::i;12560:734::-;12664:6;12672;12680;12688;12696;12749:3;12737:9;12728:7;12724:23;12720:33;12717:53;;;12766:1;12763;12756:12;12717:53;12805:9;12792:23;12824:31;12849:5;12824:31;:::i;:::-;12874:5;-1:-1:-1;12931:2:33;12916:18;;12903:32;12944:33;12903:32;12944:33;:::i;:::-;12996:7;-1:-1:-1;13050:2:33;13035:18;;13022:32;;-1:-1:-1;13101:2:33;13086:18;;13073:32;;-1:-1:-1;13156:3:33;13141:19;;13128:33;-1:-1:-1;;;;;13173:30:33;;13170:50;;;13216:1;13213;13206:12;13170:50;13239:49;13280:7;13271:6;13260:9;13256:22;13239:49;:::i;13710:380::-;13789:1;13785:12;;;;13832;;;13853:61;;13907:4;13899:6;13895:17;13885:27;;13853:61;13960:2;13952:6;13949:14;13929:18;13926:38;13923:161;;14006:10;14001:3;13997:20;13994:1;13987:31;14041:4;14038:1;14031:15;14069:4;14066:1;14059:15;13923:161;;13710:380;;;:::o;14095:663::-;14375:3;14413:6;14407:13;14429:66;14488:6;14483:3;14476:4;14468:6;14464:17;14429:66;:::i;:::-;14558:13;;14517:16;;;;14580:70;14558:13;14517:16;14627:4;14615:17;;14580:70;:::i;:::-;-1:-1:-1;;;14672:20:33;;14701:22;;;14750:1;14739:13;;14095:663;-1:-1:-1;;;;14095:663:33:o;14763:127::-;14824:10;14819:3;14815:20;14812:1;14805:31;14855:4;14852:1;14845:15;14879:4;14876:1;14869:15;14895:125;14960:9;;;14981:10;;;14978:36;;;14994:18;;:::i;15025:127::-;15086:10;15081:3;15077:20;15074:1;15067:31;15117:4;15114:1;15107:15;15141:4;15138:1;15131:15;15157:128;15224:9;;;15245:11;;;15242:37;;;15259:18;;:::i;15290:135::-;15329:3;15350:17;;;15347:43;;15370:18;;:::i;:::-;-1:-1:-1;15417:1:33;15406:13;;15290:135::o;15430:311::-;15518:19;;;15500:3;-1:-1:-1;;;;;15549:31:33;;15546:51;;;15593:1;15590;15583:12;15546:51;15629:6;15626:1;15622:14;15681:8;15674:5;15667:4;15662:3;15658:14;15645:45;15710:18;;;;15730:4;15706:29;;15430:311;-1:-1:-1;;;15430:311:33:o;15746:519::-;16023:2;16012:9;16005:21;15986:4;16049:73;16118:2;16107:9;16103:18;16095:6;16087;16049:73;:::i;:::-;16170:9;16162:6;16158:22;16153:2;16142:9;16138:18;16131:50;16198:61;16252:6;16244;16236;16198:61;:::i;:::-;16190:69;15746:519;-1:-1:-1;;;;;;;15746:519:33:o;16270:168::-;16343:9;;;16374;;16391:15;;;16385:22;;16371:37;16361:71;;16412:18;;:::i;16575:217::-;16615:1;16641;16631:132;;16685:10;16680:3;16676:20;16673:1;16666:31;16720:4;16717:1;16710:15;16748:4;16745:1;16738:15;16631:132;-1:-1:-1;16777:9:33;;16575:217::o;16797:410::-;16999:2;16981:21;;;17038:2;17018:18;;;17011:30;17077:34;17072:2;17057:18;;17050:62;-1:-1:-1;;;17143:2:33;17128:18;;17121:44;17197:3;17182:19;;16797:410::o;17622:184::-;17692:6;17745:2;17733:9;17724:7;17720:23;17716:32;17713:52;;;17761:1;17758;17751:12;17713:52;-1:-1:-1;17784:16:33;;17622:184;-1:-1:-1;17622:184:33:o;18443:251::-;18513:6;18566:2;18554:9;18545:7;18541:23;18537:32;18534:52;;;18582:1;18579;18572:12;18534:52;18614:9;18608:16;18633:31;18658:5;18633:31;:::i;19079:245::-;19146:6;19199:2;19187:9;19178:7;19174:23;19170:32;19167:52;;;19215:1;19212;19205:12;19167:52;19247:9;19241:16;19266:28;19288:5;19266:28;:::i;21274:399::-;21476:2;21458:21;;;21515:2;21495:18;;;21488:30;21554:34;21549:2;21534:18;;21527:62;-1:-1:-1;;;21620:2:33;21605:18;;21598:33;21663:3;21648:19;;21274:399::o;21678:404::-;21880:2;21862:21;;;21919:2;21899:18;;;21892:30;21958:34;21953:2;21938:18;;21931:62;-1:-1:-1;;;22024:2:33;22009:18;;22002:38;22072:3;22057:19;;21678:404::o;22087:400::-;22289:2;22271:21;;;22328:2;22308:18;;;22301:30;22367:34;22362:2;22347:18;;22340:62;-1:-1:-1;;;22433:2:33;22418:18;;22411:34;22477:3;22462:19;;22087:400::o;22492:465::-;22749:2;22738:9;22731:21;22712:4;22775:56;22827:2;22816:9;22812:18;22804:6;22775:56;:::i;:::-;22879:9;22871:6;22867:22;22862:2;22851:9;22847:18;22840:50;22907:44;22944:6;22936;22907:44;:::i;:::-;22899:52;22492:465;-1:-1:-1;;;;;22492:465:33:o;22962:401::-;23164:2;23146:21;;;23203:2;23183:18;;;23176:30;23242:34;23237:2;23222:18;;23215:62;-1:-1:-1;;;23308:2:33;23293:18;;23286:35;23353:3;23338:19;;22962:401::o;23368:406::-;23570:2;23552:21;;;23609:2;23589:18;;;23582:30;23648:34;23643:2;23628:18;;23621:62;-1:-1:-1;;;23714:2:33;23699:18;;23692:40;23764:3;23749:19;;23368:406::o;23905:545::-;24007:2;24002:3;23999:11;23996:448;;;24043:1;24068:5;24064:2;24057:17;24113:4;24109:2;24099:19;24183:2;24171:10;24167:19;24164:1;24160:27;24154:4;24150:38;24219:4;24207:10;24204:20;24201:47;;;-1:-1:-1;24242:4:33;24201:47;24297:2;24292:3;24288:12;24285:1;24281:20;24275:4;24271:31;24261:41;;24352:82;24370:2;24363:5;24360:13;24352:82;;;24415:17;;;24396:1;24385:13;24352:82;;23996:448;23905:545;;;:::o;24626:1352::-;24752:3;24746:10;-1:-1:-1;;;;;24771:6:33;24768:30;24765:56;;;24801:18;;:::i;:::-;24830:97;24920:6;24880:38;24912:4;24906:11;24880:38;:::i;:::-;24874:4;24830:97;:::i;:::-;24982:4;;25046:2;25035:14;;25063:1;25058:663;;;;25765:1;25782:6;25779:89;;;-1:-1:-1;25834:19:33;;;25828:26;25779:89;-1:-1:-1;;24583:1:33;24579:11;;;24575:24;24571:29;24561:40;24607:1;24603:11;;;24558:57;25881:81;;25028:944;;25058:663;23852:1;23845:14;;;23889:4;23876:18;;-1:-1:-1;;25094:20:33;;;25212:236;25226:7;25223:1;25220:14;25212:236;;;25315:19;;;25309:26;25294:42;;25407:27;;;;25375:1;25363:14;;;;25242:19;;25212:236;;;25216:3;25476:6;25467:7;25464:19;25461:201;;;25537:19;;;25531:26;-1:-1:-1;;25620:1:33;25616:14;;;25632:3;25612:24;25608:37;25604:42;25589:58;25574:74;;25461:201;-1:-1:-1;;;;;25708:1:33;25692:14;;;25688:22;25675:36;;-1:-1:-1;24626:1352:33:o;27448:561::-;-1:-1:-1;;;;;27745:15:33;;;27727:34;;27797:15;;27792:2;27777:18;;27770:43;27844:2;27829:18;;27822:34;;;27887:2;27872:18;;27865:34;;;27707:3;27930;27915:19;;27908:32;;;27670:4;;27957:46;;27983:19;;27975:6;27957:46;:::i;28014:249::-;28083:6;28136:2;28124:9;28115:7;28111:23;28107:32;28104:52;;;28152:1;28149;28142:12;28104:52;28184:9;28178:16;28203:30;28227:5;28203:30;:::i;28268:179::-;28303:3;28345:1;28327:16;28324:23;28321:120;;;28391:1;28388;28385;28370:23;-1:-1:-1;28428:1:33;28422:8;28417:3;28413:18;28268:179;:::o;28452:671::-;28491:3;28533:4;28515:16;28512:26;28509:39;;;28452:671;:::o;28509:39::-;28575:2;28569:9;-1:-1:-1;;28640:16:33;28636:25;;28633:1;28569:9;28612:50;28691:4;28685:11;28715:16;-1:-1:-1;;;;;28821:2:33;28814:4;28806:6;28802:17;28799:25;28794:2;28786:6;28783:14;28780:45;28777:58;;;28828:5;;;;;28452:671;:::o;28777:58::-;28865:6;28859:4;28855:17;28844:28;;28901:3;28895:10;28928:2;28920:6;28917:14;28914:27;;;28934:5;;;;;;28452:671;:::o;28914:27::-;29018:2;28999:16;28993:4;28989:27;28985:36;28978:4;28969:6;28964:3;28960:16;28956:27;28953:69;28950:82;;;29025:5;;;;;;28452:671;:::o;28950:82::-;29041:57;29092:4;29083:6;29075;29071:19;29067:30;29061:4;29041:57;:::i;:::-;-1:-1:-1;29114:3:33;;28452:671;-1:-1:-1;;;;;28452:671:33:o;29549:404::-;29751:2;29733:21;;;29790:2;29770:18;;;29763:30;29829:34;29824:2;29809:18;;29802:62;-1:-1:-1;;;29895:2:33;29880:18;;29873:38;29943:3;29928:19;;29549:404::o;29958:827::-;-1:-1:-1;;;;;30355:15:33;;;30337:34;;30407:15;;30402:2;30387:18;;30380:43;30317:3;30454:2;30439:18;;30432:31;;;30280:4;;30486:57;;30523:19;;30515:6;30486:57;:::i;:::-;30591:9;30583:6;30579:22;30574:2;30563:9;30559:18;30552:50;30625:44;30662:6;30654;30625:44;:::i;:::-;30611:58;;30718:9;30710:6;30706:22;30700:3;30689:9;30685:19;30678:51;30746:33;30772:6;30764;30746:33;:::i;:::-;30738:41;29958:827;-1:-1:-1;;;;;;;;29958:827:33:o
Swarm Source
ipfs://6f1a3a9b8876fd0e29e7cfe5b4fd40a810422553d075407fb2294873e4192213
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.