Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
There are no matching entriesUpdate your filters to view other transactions | |||||||||
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ERC1155CollectionFactoryUpgradeable
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "./erc1155.sol"; // LeoxERC1155FixedSupply
/// @title Factory for ERC1155 Fixed Supply Collections (Upgradeable)
contract ERC1155CollectionFactoryUpgradeable is Initializable, OwnableUpgradeable {
struct CollectionInfo {
string name;
string slug;
address collectionAddress;
address creator;
uint256 maxSupply;
uint96 royaltyFee;
bool exists;
}
mapping(address => CollectionInfo) public collectionInfos;
mapping(address => address[]) private userCollections;
address[] public allCollections;
mapping(string => bool) private slugUsed;
event CollectionCreated(
address indexed creator,
address indexed collectionAddress,
string name,
string slug,
uint96 royaltyFee,
uint256 maxSupply
);
/// @notice Initializer replaces constructor for upgradeable contracts
function initialize() public initializer {
__Ownable_init();
}
function createCollection(
string memory _name,
string memory _slug,
uint96 _royaltyFee,
uint256 _maxSupply
) external returns (address) {
require(!slugUsed[_slug], "Slug already used");
require(_royaltyFee <= 1000, "Max royalty 10%");
require(_maxSupply > 0, "Max supply must be >0");
LeoxERC1155FixedSupply collection = new LeoxERC1155FixedSupply(
msg.sender,
_royaltyFee,
_maxSupply
);
collectionInfos[address(collection)] = CollectionInfo({
name: _name,
slug: _slug,
collectionAddress: address(collection),
creator: msg.sender,
maxSupply: _maxSupply,
royaltyFee: _royaltyFee,
exists: true
});
slugUsed[_slug] = true;
userCollections[msg.sender].push(address(collection));
allCollections.push(address(collection));
emit CollectionCreated(msg.sender, address(collection), _name, _slug, _royaltyFee, _maxSupply);
return address(collection);
}
function getUserCollections(address _user) external view returns (address[] memory) {
return userCollections[_user];
}
function getAllCollections() external view returns (address[] memory) {
return allCollections;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_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. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check 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 (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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 (last updated v4.9.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.9.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.9.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.9.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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check 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 (last updated v4.9.4) (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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// 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
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";
error InvalidQuantity();
error ExceedsMaxSupply();
/// @notice ERC1155 Collection with fixed per-token supply and global max supply, optimized for gas
contract LeoxERC1155FixedSupply is ERC1155, ERC2981 {
uint256 private _tokenIds; // Counter for token IDs
uint256 public immutable maxSupply; // Maximum total supply across all tokens
uint256 public totalMinted; // Total minted across all token IDs
address public immutable owner; // Owner of the contract
uint96 public immutable fixedRoyalty; // Fixed royalty in basis points (0-1000 = 0%-10%)
mapping(uint256 => string) private _tokenURIs;
mapping(uint256 => uint256) public tokenSupply; // Supply per token ID
// ===== EVENTS =====
event BatchMinted(uint256 indexed tokenId, address indexed creator, uint256 supply, string tokenURI);
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
constructor(address _creator, uint96 _royaltyFee, uint256 _maxSupply) ERC1155("") {
require(_royaltyFee <= 1000, "Max royalty 10%");
require(_maxSupply > 0, "Max supply > 0");
owner =_creator;
fixedRoyalty = _royaltyFee;
maxSupply = _maxSupply;
_setDefaultRoyalty(_creator, _royaltyFee);
}
/**
* @notice Mint a new token with a fixed supply
* @param tokenURI_ Metadata URI for this token
* @param supply Supply for this token
* @return tokenId Minted token ID
*/
function mint(string memory tokenURI_, uint256 supply) external onlyOwner returns (uint256 tokenId) {
if (supply == 0) revert InvalidQuantity();
unchecked {
// Safe unchecked addition; totalMinted <= maxSupply ensures no overflow
if (totalMinted + supply > maxSupply) revert ExceedsMaxSupply();
_tokenIds += 1;
totalMinted += supply;
}
tokenId = _tokenIds;
// Mint the token with the requested supply to the owner
_mint(msg.sender, tokenId, supply, "");
// Store metadata and token supply
_tokenURIs[tokenId] = tokenURI_;
tokenSupply[tokenId] = supply;
emit BatchMinted(tokenId, msg.sender, supply, tokenURI_);
}
/**
* @notice Returns the URI for a given token ID
*/
function uri(uint256 tokenId) public view override returns (string memory) {
return _tokenURIs[tokenId];
}
// ===== Interface support =====
function supportsInterface(bytes4 interfaceId) public view override(ERC1155, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
}{
"optimizer": {
"enabled": true,
"runs": 500
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"slug","type":"string"},{"indexed":false,"internalType":"uint96","name":"royaltyFee","type":"uint96"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allCollections","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionInfos","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"slug","type":"string"},{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint96","name":"royaltyFee","type":"uint96"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_slug","type":"string"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"createCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllCollections","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserCollections","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50612efd806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200009f5760003560e01c8063715018a6116200006e578063715018a614620001345780638129fc1c14620001405780638da5cb5b146200014a5780639aa5ad8c146200015c578063f2fde38b146200017357600080fd5b8063167ef49514620000a45780634e40f4e214620000d8578063508ae2b014620000ef5780636804a958146200011b575b600080fd5b620000bb620000b536600462000ae7565b6200018a565b6040516001600160a01b0390911681526020015b60405180910390f35b620000bb620000e936600462000bac565b620001b5565b620001066200010036600462000c3e565b62000531565b604051620000cf979695949392919062000cc4565b62000125620006a9565b604051620000cf919062000d2f565b6200013e6200070d565b005b6200013e62000725565b6033546001600160a01b0316620000bb565b620001256200016d36600462000c3e565b6200084e565b6200013e6200018436600462000c3e565b620008c6565b606781815481106200019b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000606884604051620001c9919062000d7e565b9081526040519081900360200190205460ff16156200022f5760405162461bcd60e51b815260206004820152601160248201527f536c756720616c7265616479207573656400000000000000000000000000000060448201526064015b60405180910390fd5b6103e8836001600160601b031611156200028c5760405162461bcd60e51b815260206004820152600f60248201527f4d617820726f79616c7479203130250000000000000000000000000000000000604482015260640162000226565b60008211620002de5760405162461bcd60e51b815260206004820152601560248201527f4d617820737570706c79206d757374206265203e300000000000000000000000604482015260640162000226565b6000338484604051620002f19062000ad9565b6001600160a01b0390931683526001600160601b0390911660208301526040820152606001604051809103906000f08015801562000333573d6000803e3d6000fd5b506040805160e08101825288815260208082018990526001600160a01b038416828401819052336060840152608083018890526001600160601b03891660a0840152600160c084015260009081526065909152919091208151929350909181906200039f908262000e2b565b5060208201516001820190620003b6908262000e2b565b506040828101516002830180546001600160a01b039283166001600160a01b03199182161790915560608501516003850180549190931691161790556080830151600483015560a08301516005909201805460c0909401511515600160601b026cffffffffffffffffffffffffff199094166001600160601b0390931692909217929092179055516001906068906200045190889062000d7e565b9081526040805160209281900383018120805460ff1916941515949094179093553360008181526066845291822080546001818101835591845293832090930180546001600160a01b03199081166001600160a01b0388169081179092556067805495860181559093527f9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6ae9093018054909216831790915590917fc1aad499d09c1a261cc2fb83a485fd77e22d1ed358d46a0e54665b1cdfd0e2b49062000520908a908a908a908a9062000ef8565b60405180910390a395945050505050565b6065602052600090815260409020805481906200054e9062000d9c565b80601f01602080910402602001604051908101604052809291908181526020018280546200057c9062000d9c565b8015620005cd5780601f10620005a157610100808354040283529160200191620005cd565b820191906000526020600020905b815481529060010190602001808311620005af57829003601f168201915b505050505090806001018054620005e49062000d9c565b80601f0160208091040260200160405190810160405280929190818152602001828054620006129062000d9c565b8015620006635780601f10620006375761010080835404028352916020019162000663565b820191906000526020600020905b8154815290600101906020018083116200064557829003601f168201915b5050505060028301546003840154600485015460059095015493946001600160a01b0392831694929091169250906001600160601b03811690600160601b900460ff1687565b606060678054806020026020016040519081016040528092919081815260200182805480156200070357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620006e4575b5050505050905090565b6200071762000942565b6200072360006200099e565b565b600054610100900460ff1615808015620007465750600054600160ff909116105b80620007625750303b15801562000762575060005460ff166001145b620007d65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840162000226565b6000805460ff191660011790558015620007fa576000805461ff0019166101001790555b62000804620009f0565b80156200084b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b038116600090815260666020908152604091829020805483518184028101840190945280845260609392830182828015620008ba57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200089b575b50505050509050919050565b620008d062000942565b6001600160a01b038116620009375760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000226565b6200084b816200099e565b6033546001600160a01b03163314620007235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000226565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1662000a5d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000226565b62000723600054610100900460ff1662000ace5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000226565b62000723336200099e565b611f898062000f3f83390190565b60006020828403121562000afa57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262000b2957600080fd5b813567ffffffffffffffff8082111562000b475762000b4762000b01565b604051601f8301601f19908116603f0116810190828211818310171562000b725762000b7262000b01565b8160405283815286602085880101111562000b8c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121562000bc357600080fd5b843567ffffffffffffffff8082111562000bdc57600080fd5b62000bea8883890162000b17565b9550602087013591508082111562000c0157600080fd5b5062000c108782880162000b17565b93505060408501356001600160601b038116811462000c2e57600080fd5b9396929550929360600135925050565b60006020828403121562000c5157600080fd5b81356001600160a01b038116811462000c6957600080fd5b9392505050565b60005b8381101562000c8d57818101518382015260200162000c73565b50506000910152565b6000815180845262000cb081602086016020860162000c70565b601f01601f19169290920160200192915050565b60e08152600062000cd960e083018a62000c96565b828103602084015262000ced818a62000c96565b6001600160a01b0398891660408501529690971660608301525060808101939093526001600160601b039190911660a0830152151560c0909101529392505050565b6020808252825182820181905260009190848201906040850190845b8181101562000d725783516001600160a01b03168352928401929184019160010162000d4b565b50909695505050505050565b6000825162000d9281846020870162000c70565b9190910192915050565b600181811c9082168062000db157607f821691505b60208210810362000dd257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e2657600081815260208120601f850160051c8101602086101562000e015750805b601f850160051c820191505b8181101562000e225782815560010162000e0d565b5050505b505050565b815167ffffffffffffffff81111562000e485762000e4862000b01565b62000e608162000e59845462000d9c565b8462000dd8565b602080601f83116001811462000e98576000841562000e7f5750858301515b600019600386901b1c1916600185901b17855562000e22565b600085815260208120601f198616915b8281101562000ec95788860151825594840194600190910190840162000ea8565b508582101562000ee85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60808152600062000f0d608083018762000c96565b828103602084015262000f21818762000c96565b6001600160601b039590951660408401525050606001529291505056fe60e06040523480156200001157600080fd5b5060405162001f8938038062001f8983398101604081905262000034916200022c565b6040805160208101909152600081526200004e8162000119565b506103e8826001600160601b03161115620000a25760405162461bcd60e51b815260206004820152600f60248201526e4d617820726f79616c74792031302560881b60448201526064015b60405180910390fd5b60008111620000e55760405162461bcd60e51b815260206004820152600e60248201526d04d617820737570706c79203e20360941b604482015260640162000099565b6001600160a01b03831660a0526001600160601b03821660c05260808190526200011083836200012b565b505050620003fb565b60026200012782826200032f565b5050565b6127106001600160601b03821611156200019b5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000099565b6001600160a01b038216620001f35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000099565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600355565b6000806000606084860312156200024257600080fd5b83516001600160a01b03811681146200025a57600080fd5b60208501519093506001600160601b03811681146200027857600080fd5b80925050604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002b557607f821691505b602082108103620002d657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032a57600081815260208120601f850160051c81016020861015620003055750805b601f850160051c820191505b81811015620003265782815560010162000311565b5050505b505050565b81516001600160401b038111156200034b576200034b6200028a565b62000363816200035c8454620002a0565b84620002dc565b602080601f8311600181146200039b5760008415620003825750858301515b600019600386901b1c1916600185901b17855562000326565b600085815260208120601f198616915b82811015620003cc57888601518255948401946001909101908401620003ab565b5085821015620003eb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c051611b5062000439600039600061024001526000818161020101526103c20152600081816102a0015261043e0152611b506000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c80634e1273f411610097578063a2309ff811610066578063a2309ff814610292578063d5abeb011461029b578063e985e9c5146102c2578063f242432a146102fe57600080fd5b80634e1273f4146101dc5780638da5cb5b146101fc5780639eb0068d1461023b578063a22cb4651461027f57600080fd5b80630e89341c116100d35780630e89341c146101555780632693ebf2146101755780632a55205a146101955780632eb2c2d6146101c757600080fd5b8062fdd58e146100f957806301ffc9a71461011f578063056b01ce14610142575b600080fd5b61010c610107366004611250565b610311565b6040519081526020015b60405180910390f35b61013261012d366004611293565b6103aa565b6040519015158152602001610116565b61010c610150366004611358565b6103b5565b6101686101633660046113b1565b610521565b6040516101169190611410565b61010c6101833660046113b1565b60086020526000908152604090205481565b6101a86101a3366004611423565b6105c3565b604080516001600160a01b039093168352602083019190915201610116565b6101da6101d53660046114fa565b61067e565b005b6101ef6101ea3660046115a4565b610711565b60405161011691906116aa565b6102237f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610116565b6102627f000000000000000000000000000000000000000000000000000000000000000081565b6040516bffffffffffffffffffffffff9091168152602001610116565b6101da61028d3660046116bd565b61083b565b61010c60065481565b61010c7f000000000000000000000000000000000000000000000000000000000000000081565b6101326102d03660046116f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101da61030c36600461172c565b61084a565b60006001600160a01b0383166103815760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006103a4826108d6565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461041b5760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610378565b8160000361043c5760405163524f409b60e01b815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000826006540111156104815760405163c30436e960e01b815260040160405180910390fd5b50600580546001019081905560068054830190556040805160208101909152600081526104b3903390839085906108fb565b60008181526007602052604090206104cb8482611816565b506000818152600860205260409081902083905551339082907fb6af2d8cb054f9662964fcd79512932beac19624ef76c55c1242d1a4204426429061051390869088906118d6565b60405180910390a392915050565b600081815260076020526040902080546060919061053e90611791565b80601f016020809104026020016040519081016040528092919081815260200182805461056a90611791565b80156105b75780601f1061058c576101008083540402835291602001916105b7565b820191906000526020600020905b81548152906001019060200180831161059a57829003601f168201915b50505050509050919050565b60008281526004602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916106425750604080518082019091526003546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610666906bffffffffffffffffffffffff168761190d565b6106709190611924565b915196919550909350505050565b6001600160a01b03851633148061069a575061069a85336102d0565b6106fd5760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201526d195c881bdc88185c1c1c9bdd995960921b6064820152608401610378565b61070a8585858585610a0f565b5050505050565b606081518351146107765760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610378565b6000835167ffffffffffffffff811115610792576107926112b7565b6040519080825280602002602001820160405280156107bb578160200160208202803683370190505b50905060005b8451811015610833576108068582815181106107df576107df611946565b60200260200101518583815181106107f9576107f9611946565b6020026020010151610311565b82828151811061081857610818611946565b602090810291909101015261082c8161195c565b90506107c1565b509392505050565b610846338383610c6d565b5050565b6001600160a01b038516331480610866575061086685336102d0565b6108c95760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201526d195c881bdc88185c1c1c9bdd995960921b6064820152608401610378565b61070a8585858585610d4d565b60006001600160e01b0319821663152a902d60e11b14806103a457506103a482610ef8565b6001600160a01b03841661095b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610378565b33600061096785610f48565b9050600061097485610f48565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906109a6908490611975565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a0683600089898989610f93565b50505050505050565b8151835114610a715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610378565b6001600160a01b038416610ad55760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610378565b3360005b8451811015610bff576000858281518110610af657610af6611946565b602002602001015190506000858381518110610b1457610b14611946565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610ba75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610378565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610be4908490611975565b9250508190555050505080610bf89061195c565b9050610ad9565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c4f929190611988565b60405180910390a4610c65818787878787611138565b505050505050565b816001600160a01b0316836001600160a01b031603610ce05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610378565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610db15760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610378565b336000610dbd85610f48565b90506000610dca85610f48565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015610e505760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610378565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610e8d908490611975565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610eed848a8a8a8a8a610f93565b505050505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480610f2957506001600160e01b031982166303a24d0760e21b145b806103a457506301ffc9a760e01b6001600160e01b03198316146103a4565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610f8257610f82611946565b602090810291909101015292915050565b6001600160a01b0384163b15610c655760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190610fd790899089908890889088906004016119b6565b6020604051808303816000875af1925050508015611012575060408051601f3d908101601f1916820190925261100f918101906119f9565b60015b6110c75761101e611a16565b806308c379a0036110575750611032611a32565b8061103d5750611059565b8060405162461bcd60e51b81526004016103789190611410565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610378565b6001600160e01b0319811663f23a6e6160e01b14610a065760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610378565b6001600160a01b0384163b15610c655760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061117c9089908990889088908890600401611abc565b6020604051808303816000875af19250505080156111b7575060408051601f3d908101601f191682019092526111b4918101906119f9565b60015b6111c35761101e611a16565b6001600160e01b0319811663bc197c8160e01b14610a065760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610378565b80356001600160a01b038116811461124b57600080fd5b919050565b6000806040838503121561126357600080fd5b61126c83611234565b946020939093013593505050565b6001600160e01b03198116811461129057600080fd5b50565b6000602082840312156112a557600080fd5b81356112b08161127a565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156112f3576112f36112b7565b6040525050565b600067ffffffffffffffff831115611314576113146112b7565b60405161132b601f8501601f1916602001826112cd565b80915083815284848401111561134057600080fd5b83836020830137600060208583010152509392505050565b6000806040838503121561136b57600080fd5b823567ffffffffffffffff81111561138257600080fd5b8301601f8101851361139357600080fd5b6113a2858235602084016112fa565b95602094909401359450505050565b6000602082840312156113c357600080fd5b5035919050565b6000815180845260005b818110156113f0576020818501810151868301820152016113d4565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006112b060208301846113ca565b6000806040838503121561143657600080fd5b50508035926020909101359150565b600067ffffffffffffffff82111561145f5761145f6112b7565b5060051b60200190565b600082601f83011261147a57600080fd5b8135602061148782611445565b60405161149482826112cd565b83815260059390931b85018201928281019150868411156114b457600080fd5b8286015b848110156114cf57803583529183019183016114b8565b509695505050505050565b600082601f8301126114eb57600080fd5b6112b0838335602085016112fa565b600080600080600060a0868803121561151257600080fd5b61151b86611234565b945061152960208701611234565b9350604086013567ffffffffffffffff8082111561154657600080fd5b61155289838a01611469565b9450606088013591508082111561156857600080fd5b61157489838a01611469565b9350608088013591508082111561158a57600080fd5b50611597888289016114da565b9150509295509295909350565b600080604083850312156115b757600080fd5b823567ffffffffffffffff808211156115cf57600080fd5b818501915085601f8301126115e357600080fd5b813560206115f082611445565b6040516115fd82826112cd565b83815260059390931b850182019282810191508984111561161d57600080fd5b948201945b838610156116425761163386611234565b82529482019490820190611622565b9650508601359250508082111561165857600080fd5b5061166585828601611469565b9150509250929050565b600081518084526020808501945080840160005b8381101561169f57815187529582019590820190600101611683565b509495945050505050565b6020815260006112b0602083018461166f565b600080604083850312156116d057600080fd5b6116d983611234565b9150602083013580151581146116ee57600080fd5b809150509250929050565b6000806040838503121561170c57600080fd5b61171583611234565b915061172360208401611234565b90509250929050565b600080600080600060a0868803121561174457600080fd5b61174d86611234565b945061175b60208701611234565b93506040860135925060608601359150608086013567ffffffffffffffff81111561178557600080fd5b611597888289016114da565b600181811c908216806117a557607f821691505b6020821081036117c557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561181157600081815260208120601f850160051c810160208610156117f25750805b601f850160051c820191505b81811015610c65578281556001016117fe565b505050565b815167ffffffffffffffff811115611830576118306112b7565b6118448161183e8454611791565b846117cb565b602080601f83116001811461187957600084156118615750858301515b600019600386901b1c1916600185901b178555610c65565b600085815260208120601f198616915b828110156118a857888601518255948401946001909101908401611889565b50858210156118c65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8281526040602082015260006118ef60408301846113ca565b949350505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176103a4576103a46118f7565b60008261194157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006001820161196e5761196e6118f7565b5060010190565b808201808211156103a4576103a46118f7565b60408152600061199b604083018561166f565b82810360208401526119ad818561166f565b95945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526119ee60a08301846113ca565b979650505050505050565b600060208284031215611a0b57600080fd5b81516112b08161127a565b600060033d1115611a2f5760046000803e5060005160e01c5b90565b600060443d1015611a405790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611a7057505050505090565b8285019150815181811115611a885750505050505090565b843d8701016020828501011115611aa25750505050505090565b611ab1602082860101876112cd565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152611ae860a083018661166f565b8281036060840152611afa818661166f565b90508281036080840152611b0e81856113ca565b9897505050505050505056fea2646970667358221220e984fbd667400f62861803adfb6d017e21b41d070f0536e3f27adac9bb3e05d864736f6c63430008120033a2646970667358221220f719d9484c554e3c95e13a368771fccfa00542946f3525eb2f4af1058401ed9a64736f6c63430008120033
Deployed Bytecode
0x60806040523480156200001157600080fd5b50600436106200009f5760003560e01c8063715018a6116200006e578063715018a614620001345780638129fc1c14620001405780638da5cb5b146200014a5780639aa5ad8c146200015c578063f2fde38b146200017357600080fd5b8063167ef49514620000a45780634e40f4e214620000d8578063508ae2b014620000ef5780636804a958146200011b575b600080fd5b620000bb620000b536600462000ae7565b6200018a565b6040516001600160a01b0390911681526020015b60405180910390f35b620000bb620000e936600462000bac565b620001b5565b620001066200010036600462000c3e565b62000531565b604051620000cf979695949392919062000cc4565b62000125620006a9565b604051620000cf919062000d2f565b6200013e6200070d565b005b6200013e62000725565b6033546001600160a01b0316620000bb565b620001256200016d36600462000c3e565b6200084e565b6200013e6200018436600462000c3e565b620008c6565b606781815481106200019b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000606884604051620001c9919062000d7e565b9081526040519081900360200190205460ff16156200022f5760405162461bcd60e51b815260206004820152601160248201527f536c756720616c7265616479207573656400000000000000000000000000000060448201526064015b60405180910390fd5b6103e8836001600160601b031611156200028c5760405162461bcd60e51b815260206004820152600f60248201527f4d617820726f79616c7479203130250000000000000000000000000000000000604482015260640162000226565b60008211620002de5760405162461bcd60e51b815260206004820152601560248201527f4d617820737570706c79206d757374206265203e300000000000000000000000604482015260640162000226565b6000338484604051620002f19062000ad9565b6001600160a01b0390931683526001600160601b0390911660208301526040820152606001604051809103906000f08015801562000333573d6000803e3d6000fd5b506040805160e08101825288815260208082018990526001600160a01b038416828401819052336060840152608083018890526001600160601b03891660a0840152600160c084015260009081526065909152919091208151929350909181906200039f908262000e2b565b5060208201516001820190620003b6908262000e2b565b506040828101516002830180546001600160a01b039283166001600160a01b03199182161790915560608501516003850180549190931691161790556080830151600483015560a08301516005909201805460c0909401511515600160601b026cffffffffffffffffffffffffff199094166001600160601b0390931692909217929092179055516001906068906200045190889062000d7e565b9081526040805160209281900383018120805460ff1916941515949094179093553360008181526066845291822080546001818101835591845293832090930180546001600160a01b03199081166001600160a01b0388169081179092556067805495860181559093527f9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6ae9093018054909216831790915590917fc1aad499d09c1a261cc2fb83a485fd77e22d1ed358d46a0e54665b1cdfd0e2b49062000520908a908a908a908a9062000ef8565b60405180910390a395945050505050565b6065602052600090815260409020805481906200054e9062000d9c565b80601f01602080910402602001604051908101604052809291908181526020018280546200057c9062000d9c565b8015620005cd5780601f10620005a157610100808354040283529160200191620005cd565b820191906000526020600020905b815481529060010190602001808311620005af57829003601f168201915b505050505090806001018054620005e49062000d9c565b80601f0160208091040260200160405190810160405280929190818152602001828054620006129062000d9c565b8015620006635780601f10620006375761010080835404028352916020019162000663565b820191906000526020600020905b8154815290600101906020018083116200064557829003601f168201915b5050505060028301546003840154600485015460059095015493946001600160a01b0392831694929091169250906001600160601b03811690600160601b900460ff1687565b606060678054806020026020016040519081016040528092919081815260200182805480156200070357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620006e4575b5050505050905090565b6200071762000942565b6200072360006200099e565b565b600054610100900460ff1615808015620007465750600054600160ff909116105b80620007625750303b15801562000762575060005460ff166001145b620007d65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840162000226565b6000805460ff191660011790558015620007fa576000805461ff0019166101001790555b62000804620009f0565b80156200084b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b038116600090815260666020908152604091829020805483518184028101840190945280845260609392830182828015620008ba57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200089b575b50505050509050919050565b620008d062000942565b6001600160a01b038116620009375760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000226565b6200084b816200099e565b6033546001600160a01b03163314620007235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000226565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1662000a5d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000226565b62000723600054610100900460ff1662000ace5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000226565b62000723336200099e565b611f898062000f3f83390190565b60006020828403121562000afa57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262000b2957600080fd5b813567ffffffffffffffff8082111562000b475762000b4762000b01565b604051601f8301601f19908116603f0116810190828211818310171562000b725762000b7262000b01565b8160405283815286602085880101111562000b8c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121562000bc357600080fd5b843567ffffffffffffffff8082111562000bdc57600080fd5b62000bea8883890162000b17565b9550602087013591508082111562000c0157600080fd5b5062000c108782880162000b17565b93505060408501356001600160601b038116811462000c2e57600080fd5b9396929550929360600135925050565b60006020828403121562000c5157600080fd5b81356001600160a01b038116811462000c6957600080fd5b9392505050565b60005b8381101562000c8d57818101518382015260200162000c73565b50506000910152565b6000815180845262000cb081602086016020860162000c70565b601f01601f19169290920160200192915050565b60e08152600062000cd960e083018a62000c96565b828103602084015262000ced818a62000c96565b6001600160a01b0398891660408501529690971660608301525060808101939093526001600160601b039190911660a0830152151560c0909101529392505050565b6020808252825182820181905260009190848201906040850190845b8181101562000d725783516001600160a01b03168352928401929184019160010162000d4b565b50909695505050505050565b6000825162000d9281846020870162000c70565b9190910192915050565b600181811c9082168062000db157607f821691505b60208210810362000dd257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e2657600081815260208120601f850160051c8101602086101562000e015750805b601f850160051c820191505b8181101562000e225782815560010162000e0d565b5050505b505050565b815167ffffffffffffffff81111562000e485762000e4862000b01565b62000e608162000e59845462000d9c565b8462000dd8565b602080601f83116001811462000e98576000841562000e7f5750858301515b600019600386901b1c1916600185901b17855562000e22565b600085815260208120601f198616915b8281101562000ec95788860151825594840194600190910190840162000ea8565b508582101562000ee85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60808152600062000f0d608083018762000c96565b828103602084015262000f21818762000c96565b6001600160601b039590951660408401525050606001529291505056fe60e06040523480156200001157600080fd5b5060405162001f8938038062001f8983398101604081905262000034916200022c565b6040805160208101909152600081526200004e8162000119565b506103e8826001600160601b03161115620000a25760405162461bcd60e51b815260206004820152600f60248201526e4d617820726f79616c74792031302560881b60448201526064015b60405180910390fd5b60008111620000e55760405162461bcd60e51b815260206004820152600e60248201526d04d617820737570706c79203e20360941b604482015260640162000099565b6001600160a01b03831660a0526001600160601b03821660c05260808190526200011083836200012b565b505050620003fb565b60026200012782826200032f565b5050565b6127106001600160601b03821611156200019b5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000099565b6001600160a01b038216620001f35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000099565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600355565b6000806000606084860312156200024257600080fd5b83516001600160a01b03811681146200025a57600080fd5b60208501519093506001600160601b03811681146200027857600080fd5b80925050604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002b557607f821691505b602082108103620002d657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032a57600081815260208120601f850160051c81016020861015620003055750805b601f850160051c820191505b81811015620003265782815560010162000311565b5050505b505050565b81516001600160401b038111156200034b576200034b6200028a565b62000363816200035c8454620002a0565b84620002dc565b602080601f8311600181146200039b5760008415620003825750858301515b600019600386901b1c1916600185901b17855562000326565b600085815260208120601f198616915b82811015620003cc57888601518255948401946001909101908401620003ab565b5085821015620003eb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c051611b5062000439600039600061024001526000818161020101526103c20152600081816102a0015261043e0152611b506000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c80634e1273f411610097578063a2309ff811610066578063a2309ff814610292578063d5abeb011461029b578063e985e9c5146102c2578063f242432a146102fe57600080fd5b80634e1273f4146101dc5780638da5cb5b146101fc5780639eb0068d1461023b578063a22cb4651461027f57600080fd5b80630e89341c116100d35780630e89341c146101555780632693ebf2146101755780632a55205a146101955780632eb2c2d6146101c757600080fd5b8062fdd58e146100f957806301ffc9a71461011f578063056b01ce14610142575b600080fd5b61010c610107366004611250565b610311565b6040519081526020015b60405180910390f35b61013261012d366004611293565b6103aa565b6040519015158152602001610116565b61010c610150366004611358565b6103b5565b6101686101633660046113b1565b610521565b6040516101169190611410565b61010c6101833660046113b1565b60086020526000908152604090205481565b6101a86101a3366004611423565b6105c3565b604080516001600160a01b039093168352602083019190915201610116565b6101da6101d53660046114fa565b61067e565b005b6101ef6101ea3660046115a4565b610711565b60405161011691906116aa565b6102237f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610116565b6102627f000000000000000000000000000000000000000000000000000000000000000081565b6040516bffffffffffffffffffffffff9091168152602001610116565b6101da61028d3660046116bd565b61083b565b61010c60065481565b61010c7f000000000000000000000000000000000000000000000000000000000000000081565b6101326102d03660046116f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101da61030c36600461172c565b61084a565b60006001600160a01b0383166103815760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006103a4826108d6565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461041b5760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610378565b8160000361043c5760405163524f409b60e01b815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000826006540111156104815760405163c30436e960e01b815260040160405180910390fd5b50600580546001019081905560068054830190556040805160208101909152600081526104b3903390839085906108fb565b60008181526007602052604090206104cb8482611816565b506000818152600860205260409081902083905551339082907fb6af2d8cb054f9662964fcd79512932beac19624ef76c55c1242d1a4204426429061051390869088906118d6565b60405180910390a392915050565b600081815260076020526040902080546060919061053e90611791565b80601f016020809104026020016040519081016040528092919081815260200182805461056a90611791565b80156105b75780601f1061058c576101008083540402835291602001916105b7565b820191906000526020600020905b81548152906001019060200180831161059a57829003601f168201915b50505050509050919050565b60008281526004602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916106425750604080518082019091526003546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610666906bffffffffffffffffffffffff168761190d565b6106709190611924565b915196919550909350505050565b6001600160a01b03851633148061069a575061069a85336102d0565b6106fd5760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201526d195c881bdc88185c1c1c9bdd995960921b6064820152608401610378565b61070a8585858585610a0f565b5050505050565b606081518351146107765760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610378565b6000835167ffffffffffffffff811115610792576107926112b7565b6040519080825280602002602001820160405280156107bb578160200160208202803683370190505b50905060005b8451811015610833576108068582815181106107df576107df611946565b60200260200101518583815181106107f9576107f9611946565b6020026020010151610311565b82828151811061081857610818611946565b602090810291909101015261082c8161195c565b90506107c1565b509392505050565b610846338383610c6d565b5050565b6001600160a01b038516331480610866575061086685336102d0565b6108c95760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201526d195c881bdc88185c1c1c9bdd995960921b6064820152608401610378565b61070a8585858585610d4d565b60006001600160e01b0319821663152a902d60e11b14806103a457506103a482610ef8565b6001600160a01b03841661095b5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610378565b33600061096785610f48565b9050600061097485610f48565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906109a6908490611975565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a0683600089898989610f93565b50505050505050565b8151835114610a715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610378565b6001600160a01b038416610ad55760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610378565b3360005b8451811015610bff576000858281518110610af657610af6611946565b602002602001015190506000858381518110610b1457610b14611946565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610ba75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610378565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610be4908490611975565b9250508190555050505080610bf89061195c565b9050610ad9565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c4f929190611988565b60405180910390a4610c65818787878787611138565b505050505050565b816001600160a01b0316836001600160a01b031603610ce05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610378565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610db15760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610378565b336000610dbd85610f48565b90506000610dca85610f48565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015610e505760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610378565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610e8d908490611975565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610eed848a8a8a8a8a610f93565b505050505050505050565b60006001600160e01b03198216636cdb3d1360e11b1480610f2957506001600160e01b031982166303a24d0760e21b145b806103a457506301ffc9a760e01b6001600160e01b03198316146103a4565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610f8257610f82611946565b602090810291909101015292915050565b6001600160a01b0384163b15610c655760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190610fd790899089908890889088906004016119b6565b6020604051808303816000875af1925050508015611012575060408051601f3d908101601f1916820190925261100f918101906119f9565b60015b6110c75761101e611a16565b806308c379a0036110575750611032611a32565b8061103d5750611059565b8060405162461bcd60e51b81526004016103789190611410565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610378565b6001600160e01b0319811663f23a6e6160e01b14610a065760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610378565b6001600160a01b0384163b15610c655760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061117c9089908990889088908890600401611abc565b6020604051808303816000875af19250505080156111b7575060408051601f3d908101601f191682019092526111b4918101906119f9565b60015b6111c35761101e611a16565b6001600160e01b0319811663bc197c8160e01b14610a065760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401610378565b80356001600160a01b038116811461124b57600080fd5b919050565b6000806040838503121561126357600080fd5b61126c83611234565b946020939093013593505050565b6001600160e01b03198116811461129057600080fd5b50565b6000602082840312156112a557600080fd5b81356112b08161127a565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156112f3576112f36112b7565b6040525050565b600067ffffffffffffffff831115611314576113146112b7565b60405161132b601f8501601f1916602001826112cd565b80915083815284848401111561134057600080fd5b83836020830137600060208583010152509392505050565b6000806040838503121561136b57600080fd5b823567ffffffffffffffff81111561138257600080fd5b8301601f8101851361139357600080fd5b6113a2858235602084016112fa565b95602094909401359450505050565b6000602082840312156113c357600080fd5b5035919050565b6000815180845260005b818110156113f0576020818501810151868301820152016113d4565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006112b060208301846113ca565b6000806040838503121561143657600080fd5b50508035926020909101359150565b600067ffffffffffffffff82111561145f5761145f6112b7565b5060051b60200190565b600082601f83011261147a57600080fd5b8135602061148782611445565b60405161149482826112cd565b83815260059390931b85018201928281019150868411156114b457600080fd5b8286015b848110156114cf57803583529183019183016114b8565b509695505050505050565b600082601f8301126114eb57600080fd5b6112b0838335602085016112fa565b600080600080600060a0868803121561151257600080fd5b61151b86611234565b945061152960208701611234565b9350604086013567ffffffffffffffff8082111561154657600080fd5b61155289838a01611469565b9450606088013591508082111561156857600080fd5b61157489838a01611469565b9350608088013591508082111561158a57600080fd5b50611597888289016114da565b9150509295509295909350565b600080604083850312156115b757600080fd5b823567ffffffffffffffff808211156115cf57600080fd5b818501915085601f8301126115e357600080fd5b813560206115f082611445565b6040516115fd82826112cd565b83815260059390931b850182019282810191508984111561161d57600080fd5b948201945b838610156116425761163386611234565b82529482019490820190611622565b9650508601359250508082111561165857600080fd5b5061166585828601611469565b9150509250929050565b600081518084526020808501945080840160005b8381101561169f57815187529582019590820190600101611683565b509495945050505050565b6020815260006112b0602083018461166f565b600080604083850312156116d057600080fd5b6116d983611234565b9150602083013580151581146116ee57600080fd5b809150509250929050565b6000806040838503121561170c57600080fd5b61171583611234565b915061172360208401611234565b90509250929050565b600080600080600060a0868803121561174457600080fd5b61174d86611234565b945061175b60208701611234565b93506040860135925060608601359150608086013567ffffffffffffffff81111561178557600080fd5b611597888289016114da565b600181811c908216806117a557607f821691505b6020821081036117c557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561181157600081815260208120601f850160051c810160208610156117f25750805b601f850160051c820191505b81811015610c65578281556001016117fe565b505050565b815167ffffffffffffffff811115611830576118306112b7565b6118448161183e8454611791565b846117cb565b602080601f83116001811461187957600084156118615750858301515b600019600386901b1c1916600185901b178555610c65565b600085815260208120601f198616915b828110156118a857888601518255948401946001909101908401611889565b50858210156118c65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8281526040602082015260006118ef60408301846113ca565b949350505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176103a4576103a46118f7565b60008261194157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006001820161196e5761196e6118f7565b5060010190565b808201808211156103a4576103a46118f7565b60408152600061199b604083018561166f565b82810360208401526119ad818561166f565b95945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526119ee60a08301846113ca565b979650505050505050565b600060208284031215611a0b57600080fd5b81516112b08161127a565b600060033d1115611a2f5760046000803e5060005160e01c5b90565b600060443d1015611a405790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611a7057505050505090565b8285019150815181811115611a885750505050505090565b843d8701016020828501011115611aa25750505050505090565b611ab1602082860101876112cd565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152611ae860a083018661166f565b8281036060840152611afa818661166f565b90508281036080840152611b0e81856113ca565b9897505050505050505056fea2646970667358221220e984fbd667400f62861803adfb6d017e21b41d070f0536e3f27adac9bb3e05d864736f6c63430008120033a2646970667358221220f719d9484c554e3c95e13a368771fccfa00542946f3525eb2f4af1058401ed9a64736f6c63430008120033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.