ERC-1155
Overview
Max Total Supply
2,888
Holders
332
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TokenLaunchpadVouchers
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-12 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File @animoca/ethereum-contracts-core-1.1.2/contracts/metatx/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.8.0; /* * 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. */ abstract contract ManagedIdentity { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { return msg.data; } } // File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC-173 Contract Ownership Standard * Note: the ERC-165 identifier for this interface is 0x7f5828d0 */ interface IERC173 { /** * Event emited when ownership of a contract changes. * @param previousOwner the previous owner. * @param newOwner the new owner. */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * Get the address of the owner * @return The address of the owner. */ function owner() external view returns (address); /** * Set the address of the new owner of the contract * Set newOwner to address(0) to renounce any ownership. * @dev Emits an {OwnershipTransferred} event. * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership. */ function transferOwnership(address newOwner) external; } // File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is ManagedIdentity, IERC173 { address internal _owner; /** * Initializes the contract, setting the deployer as the initial owner. * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event. */ constructor(address owner_) { _owner = owner_; emit OwnershipTransferred(address(0), owner_); } /** * Gets the address of the current contract owner. */ function owner() public view virtual override returns (address) { return _owner; } /** * See {IERC173-transferOwnership(address)} * @dev Reverts if the sender is not the current contract owner. * @param newOwner the address of the new owner. Use the zero address to renounce the ownership. */ function transferOwnership(address newOwner) public virtual override { _requireOwnership(_msgSender()); _owner = newOwner; emit OwnershipTransferred(_owner, newOwner); } /** * @dev Reverts if `account` is not the contract owner. * @param account the account to test. */ function _requireOwnership(address account) internal virtual { require(account == this.owner(), "Ownable: not the owner"); } } // File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected] // Partially derived from OpenZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol pragma solidity >=0.7.6 <0.8.0; /** * @dev Upgrades the address type to check if it is a contract. */ library AddressIsContract { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } } // File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC20Wrapper * Wraps ERC20 functions to support non-standard implementations which do not return a bool value. * Calls to the wrapped functions revert only if they throw or if they return false. */ library ERC20Wrapper { using AddressIsContract for address; function wrappedTransfer( IWrappedERC20 token, address to, uint256 value ) internal { _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function wrappedTransferFrom( IWrappedERC20 token, address from, address to, uint256 value ) internal { _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function wrappedApprove( IWrappedERC20 token, address spender, uint256 value ) internal { _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal { address target = address(token); require(target.isContract(), "ERC20Wrapper: non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory data) = target.call(callData); if (success) { if (data.length != 0) { require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed"); } } else { // revert using a standard revert message if (data.length == 0) { revert("ERC20Wrapper: operation failed"); } // revert using the revert message coming from the call assembly { let size := mload(data) revert(add(32, data), size) } } } } interface IWrappedERC20 { function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function approve(address spender, uint256 value) external returns (bool); } // File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected] pragma solidity >=0.7.6 <0.8.0; abstract contract Recoverable is ManagedIdentity, Ownable { using ERC20Wrapper for IWrappedERC20; /** * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts. * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens * so that the extraction is limited to only amounts sent accidentally. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length. * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function. * @dev Reverts if one of the ERC20 transfers fail for any reason. * @param accounts the list of accounts to transfer the tokens to. * @param tokens the list of ERC20 token addresses. * @param amounts the list of token amounts to transfer. */ function recoverERC20s( address[] calldata accounts, address[] calldata tokens, uint256[] calldata amounts ) external virtual { _requireOwnership(_msgSender()); uint256 length = accounts.length; require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays"); for (uint256 i = 0; i != length; ++i) { IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]); } } /** * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts. * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens * so that the extraction is limited to only tokens sent accidentally. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length. * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function. * @dev Reverts if one of the ERC721 transfers fail for any reason. * @param accounts the list of accounts to transfer the tokens to. * @param contracts the list of ERC721 contract addresses. * @param tokenIds the list of token ids to transfer. */ function recoverERC721s( address[] calldata accounts, address[] calldata contracts, uint256[] calldata tokenIds ) external virtual { _requireOwnership(_msgSender()); uint256 length = accounts.length; require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays"); for (uint256 i = 0; i != length; ++i) { IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]); } } } interface IRecoverableERC721 { /// See {IERC721-transferFrom(address,address,uint256)} function transferFrom( address from, address to, uint256 tokenId ) external; } // File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; abstract contract UsingAppendedCallData { function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) { // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1 // The assembly code is more direct than the Solidity version using `abi.decode`. // solhint-disable-next-line no-inline-assembly assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) { return msg.data[:msg.data.length - 20]; } } // File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; interface IERC2771 { function isTrustedForwarder(address forwarder) external view returns (bool); } // File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; interface IForwarderRegistry { function isForwarderFor(address, address) external view returns (bool); } // File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected] pragma solidity ^0.7.0; abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 { IForwarderRegistry internal immutable _forwarderRegistry; address internal immutable _universalForwarder; constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) { _universalForwarder = universalForwarder; _forwarderRegistry = forwarderRegistry; } function isTrustedForwarder(address forwarder) external view virtual override returns (bool) { return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry); } function _msgSender() internal view virtual returns (address payable) { address payable msgSender = msg.sender; address payable sender = _lastAppendedDataAsSender(); if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) { // if forwarder use appended data return sender; } // if msg.sender is neither the registry nor the universal forwarder, // we have to check the last 20bytes of the call data intepreted as an address // and check if the msg.sender was registered as forewarder for that address // we check tx.origin to save gas in case where msg.sender == tx.origin // solhint-disable-next-line avoid-tx-origin if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) { return sender; } return msgSender; } function _msgData() internal view virtual returns (bytes calldata) { address payable msgSender = msg.sender; if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) { // if forwarder use appended data return _msgDataAssuming20BytesAppendedData(); } // we check tx.origin to save gas in case where msg.sender == tx.origin // solhint-disable-next-line avoid-tx-origin if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) { return _msgDataAssuming20BytesAppendedData(); } return msg.data; } } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Inventory. optional extension: Burnable. * @dev See https://eips.ethereum.org/EIPS/eip-1155 * @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1. */ interface IERC1155InventoryBurnable { /** * Burns some token. * @dev Reverts if the sender is not approved. * @dev Reverts if `id` does not represent a token. * @dev Reverts if `id` represents a Fungible Token and `value` is 0. * @dev Reverts if `id` represents a Fungible Token and `value` is higher than `from`'s balance. * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1. * @dev Reverts if `id` represents a Non-Fungible Token which is not owned by `from`. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Address of the current token owner. * @param id Identifier of the token to burn. * @param value Amount of token to burn. */ function burnFrom( address from, uint256 id, uint256 value ) external; /** * Burns multiple tokens. * @dev Reverts if `ids` and `values` have different lengths. * @dev Reverts if the sender is not approved. * @dev Reverts if one of `ids` does not represent a token. * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0. * @dev Reverts if one of `ids` represents a Fungible Token and `value` is higher than `from`'s balance. * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1. * @dev Reverts if one of `ids` represents a Non-Fungible Token which is not owned by `from`. * @dev Emits an {IERC1155-TransferBatch} event. * @param from Address of the current tokens owner. * @param ids Identifiers of the tokens to burn. * @param values Amounts of tokens to burn. */ function batchBurnFrom( address from, uint256[] calldata ids, uint256[] calldata values ) external; } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155InventoryIdentifiersLib, a library to introspect inventory identifiers. * @dev With N=32, representing the Non-Fungible Collection mask length, identifiers are represented as follow: * (a) a Fungible Token: * - most significant bit == 0 * (b) a Non-Fungible Collection: * - most significant bit == 1 * - (256-N) least significant bits == 0 * (c) a Non-Fungible Token: * - most significant bit == 1 * - (256-N) least significant bits != 0 */ library ERC1155InventoryIdentifiersLib { // Non-Fungible bit. If an id has this bit set, it is a Non-Fungible (either Collection or Token) uint256 internal constant _NF_BIT = 1 << 255; // Mask for Non-Fungible Collection (including the nf bit) uint256 internal constant _NF_COLLECTION_MASK = uint256(type(uint32).max) << 224; uint256 internal constant _NF_TOKEN_MASK = ~_NF_COLLECTION_MASK; function isFungibleToken(uint256 id) internal pure returns (bool) { return id & _NF_BIT == 0; } function isNonFungibleToken(uint256 id) internal pure returns (bool) { return id & _NF_BIT != 0 && id & _NF_TOKEN_MASK != 0; } function getNonFungibleCollection(uint256 nftId) internal pure returns (uint256) { return nftId & _NF_COLLECTION_MASK; } } // File @animoca/ethereum-contracts-core-1.1.2/contracts/introspection/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165. */ 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); } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Multi Token Standard, basic interface. * @dev See https://eips.ethereum.org/EIPS/eip-1155 * @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26. */ interface IERC1155 { event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value); event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); event URI(string _value, uint256 indexed _id); /** * Safely transfers some token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `from` has an insufficient balance. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused. * @dev Emits a `TransferSingle` event. * @param from Current token owner. * @param to Address of the new token owner. * @param id Identifier of the token to transfer. * @param value Amount of token to transfer. * @param data Optional data to send along to a receiver contract. */ function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes calldata data ) external; /** * Safely transfers a batch of tokens. * @dev Reverts if `to` is the zero address. * @dev Reverts if `ids` and `values` have different lengths. * @dev Reverts if the sender is not approved. * @dev Reverts if `from` has an insufficient balance for any of `ids`. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Emits a `TransferBatch` event. * @param from Current token owner. * @param to Address of the new token owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to send along to a receiver contract. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; /** * Retrieves the balance of `id` owned by account `owner`. * @param owner The account to retrieve the balance of. * @param id The identifier to retrieve the balance of. * @return The balance of `id` owned by account `owner`. */ function balanceOf(address owner, uint256 id) external view returns (uint256); /** * Retrieves the balances of `ids` owned by accounts `owners`. For each pair: * @dev Reverts if `owners` and `ids` have different lengths. * @param owners The addresses of the token holders * @param ids The identifiers to retrieve the balance of. * @return The balances of `ids` owned by accounts `owners`. */ function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory); /** * Enables or disables an operator's approval. * @dev Emits an `ApprovalForAll` event. * @param operator Address of the operator. * @param approved True to approve the operator, false to revoke an approval. */ function setApprovalForAll(address operator, bool approved) external; /** * Retrieves the approval status of an operator for a given owner. * @param owner Address of the authorisation giver. * @param operator Address of the operator. * @return True if the operator is approved, false if not. */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Multi Token Standard, optional extension: Inventory. * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract. * @dev See https://eips.ethereum.org/EIPS/eip-xxxx * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46. */ interface IERC1155InventoryFunctions { function ownerOf(uint256 nftId) external view returns (address); function isFungible(uint256 id) external view returns (bool); function collectionOf(uint256 nftId) external view returns (uint256); } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Multi Token Standard, optional extension: Inventory. * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract. * * This interface rationalizes the co-existence of Fungible and Non-Fungible Tokens * within the same contract. As several kinds of Fungible Tokens can be managed under * the Multi-Token standard, we consider that Non-Fungible Tokens can be classified * under their own specific type. We introduce the concept of Non-Fungible Collection * and consider the usage of 3 types of identifiers: * (a) Fungible Token identifiers, each representing a set of Fungible Tokens, * (b) Non-Fungible Collection identifiers, each representing a set of Non-Fungible Tokens (this is not a token), * (c) Non-Fungible Token identifiers. * * Identifiers nature * | Type | isFungible | isCollection | isToken | * | Fungible Token | true | true | true | * | Non-Fungible Collection | false | true | false | * | Non-Fungible Token | false | false | true | * * Identifiers compatibilities * | Type | transfer | balance | supply | owner | * | Fungible Token | OK | OK | OK | NOK | * | Non-Fungible Collection | NOK | OK | OK | NOK | * | Non-Fungible Token | OK | 0 or 1 | 0 or 1 | OK | * * @dev See https://eips.ethereum.org/EIPS/eip-xxxx * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46. */ interface IERC1155Inventory is IERC1155, IERC1155InventoryFunctions { //================================================== ERC1155Inventory ===================================================// /** * Optional event emitted when a collection (Fungible Token or Non-Fungible Collection) is created. * This event can be used by a client application to determine which identifiers are meaningful * to track through the functions `balanceOf`, `balanceOfBatch` and `totalSupply`. * @dev This event MUST NOT be emitted twice for the same `collectionId`. */ event CollectionCreated(uint256 indexed collectionId, bool indexed fungible); /** * Retrieves the owner of a Non-Fungible Token (ERC721-compatible). * @dev Reverts if `nftId` is owned by the zero address. * @param nftId Identifier of the token to query. * @return Address of the current owner of the token. */ function ownerOf(uint256 nftId) external view override returns (address); /** * Introspects whether or not `id` represents a Fungible Token. * This function MUST return true even for a Fungible Token which is not-yet created. * @param id The identifier to query. * @return bool True if `id` represents aFungible Token, false otherwise. */ function isFungible(uint256 id) external view override returns (bool); /** * Introspects the Non-Fungible Collection to which `nftId` belongs. * @dev This function MUST return a value representing a Non-Fungible Collection. * @dev This function MUST return a value for a non-existing token, and SHOULD NOT be used to check the existence of a Non-Fungible Token. * @dev Reverts if `nftId` does not represent a Non-Fungible Token. * @param nftId The token identifier to query the collection of. * @return The Non-Fungible Collection identifier to which `nftId` belongs. */ function collectionOf(uint256 nftId) external view override returns (uint256); //======================================================= ERC1155 =======================================================// /** * Retrieves the balance of `id` owned by account `owner`. * @param owner The account to retrieve the balance of. * @param id The identifier to retrieve the balance of. * @return * If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection. * If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0. */ function balanceOf(address owner, uint256 id) external view override returns (uint256); /** * Retrieves the balances of `ids` owned by accounts `owners`. * @dev Reverts if `owners` and `ids` have different lengths. * @param owners The accounts to retrieve the balances of. * @param ids The identifiers to retrieve the balances of. * @return An array of elements such as for each pair `id`/`owner`: * If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection. * If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0. */ function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view override returns (uint256[] memory); /** * Safely transfers some token. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if `id` does not represent a token. * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1. * @dev Reverts if `id` represents a Non-Fungible Token and is not owned by `from`. * @dev Reverts if `id` represents a Fungible Token and `value` is 0. * @dev Reverts if `id` represents a Fungible Token and `from` has an insufficient balance. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused. * @dev Emits an {IERC1155-TransferSingle} event. * @param from Current token owner. * @param to Address of the new token owner. * @param id Identifier of the token to transfer. * @param value Amount of token to transfer. * @param data Optional data to pass to the receiver contract. */ function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes calldata data ) external override; /** * @notice this documentation overrides its {IERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}. * Safely transfers a batch of tokens. * @dev Reverts if `to` is the zero address. * @dev Reverts if the sender is not approved. * @dev Reverts if one of `ids` does not represent a token. * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1. * @dev Reverts if one of `ids` represents a Non-Fungible Token and is not owned by `from`. * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0. * @dev Reverts if one of `ids` represents a Fungible Token and `from` has an insufficient balance. * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Emits an {IERC1155-TransferBatch} event. * @param from Current tokens owner. * @param to Address of the new tokens owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to pass to the receiver contract. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external override; } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Multi Token Standard, optional extension: Metadata URI. * @dev See https://eips.ethereum.org/EIPS/eip-1155 * @dev Note: The ERC-165 identifier for this interface is 0x0e89341c. */ interface IERC1155MetadataURI { /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * @dev The URI MUST point to a JSON file that conforms to the "ERC1155 Metadata URI JSON Schema". * @dev The uri function SHOULD be used to retrieve values if no event was emitted. * @dev The uri function MUST return the same value as the latest event for an _id if it was emitted. * @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for * an implementation to return a valid string even if the token does not exist. * @return URI string */ function uri(uint256 id) external view returns (string memory); } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Inventory, optional extension: Total Supply. * @dev See https://eips.ethereum.org/EIPS/eip-xxxx * @dev Note: The ERC-165 identifier for this interface is 0xbd85b039. */ interface IERC1155InventoryTotalSupply { /** * Retrieves the total supply of `id`. * @param id The identifier for which to retrieve the supply of. * @return * If `id` represents a collection (Fungible Token or Non-Fungible Collection), the total supply for this collection. * If `id` represents a Non-Fungible Token, 1 if the token exists, else 0. */ function totalSupply(uint256 id) external view returns (uint256); } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Multi Token Standard, Tokens Receiver. * Interface for any contract that wants to support transfers from ERC1155 asset contracts. * @dev See https://eips.ethereum.org/EIPS/eip-1155 * @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0. */ interface IERC1155TokenReceiver { /** * @notice Handle the receipt of a single ERC1155 token type. * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update. * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61) to accept the transfer. * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller. * @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 `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @notice Handle the receipt of multiple ERC1155 token types. * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates. * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81) if to accept the transfer(s). * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller. * @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)"))` */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Inventory Base. * @dev The functions `safeTransferFrom(address,address,uint256,uint256,bytes)` * and `safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)` need to be implemented by a child contract. * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`. */ abstract contract ERC1155InventoryBase is ManagedIdentity, IERC165, IERC1155Inventory, IERC1155MetadataURI, IERC1155InventoryTotalSupply { using ERC1155InventoryIdentifiersLib for uint256; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81; // Burnt Non-Fungible Token owner's magic value uint256 internal constant _BURNT_NFT_OWNER = 0xdead000000000000000000000000000000000000000000000000000000000000; /* owner => operator => approved */ mapping(address => mapping(address => bool)) internal _operators; /* collection ID => owner => balance */ mapping(uint256 => mapping(address => uint256)) internal _balances; /* collection ID => supply */ mapping(uint256 => uint256) internal _supplies; /* NFT ID => owner */ mapping(uint256 => uint256) internal _owners; /* collection ID => creator */ mapping(uint256 => address) internal _creators; //======================================================= ERC165 ========================================================// /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || interfaceId == type(IERC1155InventoryFunctions).interfaceId || interfaceId == type(IERC1155InventoryTotalSupply).interfaceId; } //======================================================= ERC1155 =======================================================// /// @inheritdoc IERC1155Inventory function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) { require(owner != address(0), "Inventory: zero address"); if (id.isNonFungibleToken()) { return address(uint160(_owners[id])) == owner ? 1 : 0; } return _balances[id][owner]; } /// @inheritdoc IERC1155Inventory function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual override returns (uint256[] memory) { require(owners.length == ids.length, "Inventory: inconsistent arrays"); uint256[] memory balances = new uint256[](owners.length); for (uint256 i = 0; i != owners.length; ++i) { balances[i] = balanceOf(owners[i], ids[i]); } return balances; } /// @inheritdoc IERC1155 function setApprovalForAll(address operator, bool approved) public virtual override { address sender = _msgSender(); require(operator != sender, "Inventory: self-approval"); _operators[sender][operator] = approved; emit ApprovalForAll(sender, operator, approved); } /// @inheritdoc IERC1155 function isApprovedForAll(address tokenOwner, address operator) public view virtual override returns (bool) { return _operators[tokenOwner][operator]; } //================================================== ERC1155Inventory ===================================================// /// @inheritdoc IERC1155Inventory function isFungible(uint256 id) external pure virtual override returns (bool) { return id.isFungibleToken(); } /// @inheritdoc IERC1155Inventory function collectionOf(uint256 nftId) external pure virtual override returns (uint256) { require(nftId.isNonFungibleToken(), "Inventory: not an NFT"); return nftId.getNonFungibleCollection(); } /// @inheritdoc IERC1155Inventory function ownerOf(uint256 nftId) public view virtual override returns (address) { address owner = address(uint160(_owners[nftId])); require(owner != address(0), "Inventory: non-existing NFT"); return owner; } //============================================= ERC1155InventoryTotalSupply =============================================// /// @inheritdoc IERC1155InventoryTotalSupply function totalSupply(uint256 id) external view virtual override returns (uint256) { if (id.isNonFungibleToken()) { return address(uint160(_owners[id])) == address(0) ? 0 : 1; } else { return _supplies[id]; } } //============================================ High-level Internal Functions ============================================// /** * Creates a collection (optional). * @dev Reverts if `collectionId` does not represent a collection. * @dev Reverts if `collectionId` has already been created. * @dev Emits a {IERC1155Inventory-CollectionCreated} event. * @param collectionId Identifier of the collection. */ function _createCollection(uint256 collectionId) internal virtual { require(!collectionId.isNonFungibleToken(), "Inventory: not a collection"); require(_creators[collectionId] == address(0), "Inventory: existing collection"); _creators[collectionId] = _msgSender(); emit CollectionCreated(collectionId, collectionId.isFungibleToken()); } function _creator(uint256 collectionId) internal view virtual returns (address) { require(!collectionId.isNonFungibleToken(), "Inventory: not a collection"); return _creators[collectionId]; } //============================================== Helper Internal Functions ==============================================// /** * Returns whether `sender` is authorised to make a transfer on behalf of `from`. * @param from The address to check operatibility upon. * @param sender The sender address. * @return True if sender is `from` or an operator for `from`, false otherwise. */ function _isOperatable(address from, address sender) internal view virtual returns (bool) { return (from == sender) || _operators[from][sender]; } /** * Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract. * @dev Reverts if `to` is not a contract. * @dev Reverts if the call to the target fails or is refused. * @param from Previous token owner. * @param to New token owner. * @param id Identifier of the token transferred. * @param value Amount of token transferred. * @param data Optional data to send along with the receiver contract call. */ function _callOnERC1155Received( address from, address to, uint256 id, uint256 value, bytes memory data ) internal { require(IERC1155TokenReceiver(to).onERC1155Received(_msgSender(), from, id, value, data) == _ERC1155_RECEIVED, "Inventory: transfer refused"); } /** * Calls {IERC1155TokenReceiver-onERC1155batchReceived} on a target contract. * @dev Reverts if `to` is not a contract. * @dev Reverts if the call to the target fails or is refused. * @param from Previous tokens owner. * @param to New tokens owner. * @param ids Identifiers of the tokens to transfer. * @param values Amounts of tokens to transfer. * @param data Optional data to send along with the receiver contract call. */ function _callOnERC1155BatchReceived( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) internal { require( IERC1155TokenReceiver(to).onERC1155BatchReceived(_msgSender(), from, ids, values, data) == _ERC1155_BATCH_RECEIVED, "Inventory: transfer refused" ); } } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; // solhint-disable-next-line max-line-length /** * @title ERC1155Inventory, a contract which manages up to multiple Collections of Fungible and Non-Fungible Tokens. * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`. */ abstract contract ERC1155Inventory is ERC1155InventoryBase { using AddressIsContract for address; using ERC1155InventoryIdentifiersLib for uint256; //======================================================= ERC1155 =======================================================// /// @inheritdoc IERC1155Inventory function safeTransferFrom( address from, address to, uint256 id, uint256 value, bytes memory data ) public virtual override { address sender = _msgSender(); require(to != address(0), "Inventory: transfer to zero"); require(_isOperatable(from, sender), "Inventory: non-approved sender"); if (id.isFungibleToken()) { _transferFungible(from, to, id, value); } else if (id.isNonFungibleToken()) { _transferNFT(from, to, id, value, false); } else { revert("Inventory: not a token id"); } emit TransferSingle(sender, from, to, id, value); if (to.isContract()) { _callOnERC1155Received(from, to, id, value, data); } } /// @inheritdoc IERC1155Inventory function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) public virtual override { // internal function to avoid stack too deep error _safeBatchTransferFrom(from, to, ids, values, data); } //============================================ High-level Internal Functions ============================================// function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) internal { require(to != address(0), "Inventory: transfer to zero"); uint256 length = ids.length; require(length == values.length, "Inventory: inconsistent arrays"); address sender = _msgSender(); require(_isOperatable(from, sender), "Inventory: non-approved sender"); uint256 nfCollectionId; uint256 nfCollectionCount; for (uint256 i; i != length; ++i) { uint256 id = ids[i]; uint256 value = values[i]; if (id.isFungibleToken()) { _transferFungible(from, to, id, value); } else if (id.isNonFungibleToken()) { _transferNFT(from, to, id, value, true); uint256 nextCollectionId = id.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount); nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } else { revert("Inventory: not a token id"); } } if (nfCollectionId != 0) { _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount); } emit TransferBatch(sender, from, to, ids, values); if (to.isContract()) { _callOnERC1155BatchReceived(from, to, ids, values, data); } } function _safeMint( address to, uint256 id, uint256 value, bytes memory data ) internal { require(to != address(0), "Inventory: mint to zero"); if (id.isFungibleToken()) { _mintFungible(to, id, value); } else if (id.isNonFungibleToken()) { _mintNFT(to, id, value, false); } else { revert("Inventory: not a token id"); } emit TransferSingle(_msgSender(), address(0), to, id, value); if (to.isContract()) { _callOnERC1155Received(address(0), to, id, value, data); } } function _safeBatchMint( address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) internal virtual { require(to != address(0), "Inventory: mint to zero"); uint256 length = ids.length; require(length == values.length, "Inventory: inconsistent arrays"); uint256 nfCollectionId; uint256 nfCollectionCount; for (uint256 i; i != length; ++i) { uint256 id = ids[i]; uint256 value = values[i]; if (id.isFungibleToken()) { _mintFungible(to, id, value); } else if (id.isNonFungibleToken()) { _mintNFT(to, id, value, true); uint256 nextCollectionId = id.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _balances[nfCollectionId][to] += nfCollectionCount; _supplies[nfCollectionId] += nfCollectionCount; nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } else { revert("Inventory: not a token id"); } } if (nfCollectionId != 0) { _balances[nfCollectionId][to] += nfCollectionCount; _supplies[nfCollectionId] += nfCollectionCount; } emit TransferBatch(_msgSender(), address(0), to, ids, values); if (to.isContract()) { _callOnERC1155BatchReceived(address(0), to, ids, values, data); } } //============================================== Helper Internal Functions ==============================================// function _mintFungible( address to, uint256 id, uint256 value ) internal { require(value != 0, "Inventory: zero value"); uint256 supply = _supplies[id]; uint256 newSupply = supply + value; require(newSupply > supply, "Inventory: supply overflow"); _supplies[id] = newSupply; // cannot overflow as any balance is bounded up by the supply which cannot overflow _balances[id][to] += value; } function _mintNFT( address to, uint256 id, uint256 value, bool isBatch ) internal { require(value == 1, "Inventory: wrong NFT value"); require(_owners[id] == 0, "Inventory: existing/burnt NFT"); _owners[id] = uint256(uint160(to)); if (!isBatch) { uint256 collectionId = id.getNonFungibleCollection(); // it is virtually impossible that a Non-Fungible Collection supply // overflows due to the cost of minting individual tokens ++_supplies[collectionId]; // cannot overflow as supply cannot overflow ++_balances[collectionId][to]; } } function _transferFungible( address from, address to, uint256 id, uint256 value ) internal { require(value != 0, "Inventory: zero value"); uint256 balance = _balances[id][from]; require(balance >= value, "Inventory: not enough balance"); if (from != to) { _balances[id][from] = balance - value; // cannot overflow as supply cannot overflow _balances[id][to] += value; } } function _transferNFT( address from, address to, uint256 id, uint256 value, bool isBatch ) internal { require(value == 1, "Inventory: wrong NFT value"); require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT"); _owners[id] = uint256(uint160(to)); if (!isBatch) { uint256 collectionId = id.getNonFungibleCollection(); // cannot underflow as balance is verified through ownership _balances[collectionId][from] -= 1; // cannot overflow as supply cannot overflow _balances[collectionId][to] += 1; } } function _transferNFTUpdateCollection( address from, address to, uint256 collectionId, uint256 amount ) internal virtual { if (from != to) { // cannot underflow as balance is verified through ownership _balances[collectionId][from] -= amount; // cannot overflow as supply cannot overflow _balances[collectionId][to] += amount; } } } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155Inventory, burnable version. * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`. */ abstract contract ERC1155InventoryBurnable is IERC1155InventoryBurnable, ERC1155Inventory { using ERC1155InventoryIdentifiersLib for uint256; //======================================================= ERC165 ========================================================// /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC1155InventoryBurnable).interfaceId || super.supportsInterface(interfaceId); } //============================================== ERC1155InventoryBurnable ===============================================// /// @inheritdoc IERC1155InventoryBurnable function burnFrom( address from, uint256 id, uint256 value ) public virtual override { address sender = _msgSender(); require(_isOperatable(from, sender), "Inventory: non-approved sender"); if (id.isFungibleToken()) { _burnFungible(from, id, value); } else if (id.isNonFungibleToken()) { _burnNFT(from, id, value, false); } else { revert("Inventory: not a token id"); } emit TransferSingle(sender, from, address(0), id, value); } /// @inheritdoc IERC1155InventoryBurnable function batchBurnFrom( address from, uint256[] memory ids, uint256[] memory values ) public virtual override { uint256 length = ids.length; require(length == values.length, "Inventory: inconsistent arrays"); address sender = _msgSender(); require(_isOperatable(from, sender), "Inventory: non-approved sender"); uint256 nfCollectionId; uint256 nfCollectionCount; for (uint256 i; i != length; ++i) { uint256 id = ids[i]; uint256 value = values[i]; if (id.isFungibleToken()) { _burnFungible(from, id, value); } else if (id.isNonFungibleToken()) { _burnNFT(from, id, value, true); uint256 nextCollectionId = id.getNonFungibleCollection(); if (nfCollectionId == 0) { nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { if (nextCollectionId != nfCollectionId) { _balances[nfCollectionId][from] -= nfCollectionCount; _supplies[nfCollectionId] -= nfCollectionCount; nfCollectionId = nextCollectionId; nfCollectionCount = 1; } else { ++nfCollectionCount; } } } else { revert("Inventory: not a token id"); } } if (nfCollectionId != 0) { _balances[nfCollectionId][from] -= nfCollectionCount; _supplies[nfCollectionId] -= nfCollectionCount; } emit TransferBatch(sender, from, address(0), ids, values); } //============================================== Helper Internal Functions ==============================================// function _burnFungible( address from, uint256 id, uint256 value ) internal { require(value != 0, "Inventory: zero value"); uint256 balance = _balances[id][from]; require(balance >= value, "Inventory: not enough balance"); _balances[id][from] = balance - value; // Cannot underflow _supplies[id] -= value; } function _burnNFT( address from, uint256 id, uint256 value, bool isBatch ) internal { require(value == 1, "Inventory: wrong NFT value"); require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT"); _owners[id] = _BURNT_NFT_OWNER; if (!isBatch) { uint256 collectionId = id.getNonFungibleCollection(); // cannot underflow as balance is confirmed through ownership --_balances[collectionId][from]; // Cannot underflow --_supplies[collectionId]; } } } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Inventory, optional extension: Mintable. * @dev See https://eips.ethereum.org/EIPS/eip-1155 */ interface IERC1155InventoryMintable { /** * Safely mints some token. * @dev Reverts if `to` is the zero address. * @dev Reverts if `id` is not a token. * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1. * @dev Reverts if `id` represents a Non-Fungible Token which has already been minted. * @dev Reverts if `id` represents a Fungible Token and `value` is 0. * @dev Reverts if `id` represents a Fungible Token and there is an overflow of supply. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused. * @dev Emits an {IERC1155-TransferSingle} event. * @param to Address of the new token owner. * @param id Identifier of the token to mint. * @param value Amount of token to mint. * @param data Optional data to send along to a receiver contract. */ function safeMint( address to, uint256 id, uint256 value, bytes calldata data ) external; /** * Safely mints a batch of tokens. * @dev Reverts if `ids` and `values` have different lengths. * @dev Reverts if `to` is the zero address. * @dev Reverts if one of `ids` is not a token. * @dev Reverts if one of `ids` represents a Non-Fungible Token and its paired value is not 1. * @dev Reverts if one of `ids` represents a Non-Fungible Token which has already been minted. * @dev Reverts if one of `ids` represents a Fungible Token and its paired value is 0. * @dev Reverts if one of `ids` represents a Fungible Token and there is an overflow of supply. * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused. * @dev Emits an {IERC1155-TransferBatch} event. * @param to Address of the new tokens owner. * @param ids Identifiers of the tokens to mint. * @param values Amounts of tokens to mint. * @param data Optional data to send along to a receiver contract. */ function safeBatchMint( address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * @title ERC1155 Inventory, optional extension: Creator. * @dev See https://eips.ethereum.org/EIPS/eip-1155 * @dev Note: The ERC-165 identifier for this interface is 0x510b5158. */ interface IERC1155InventoryCreator { /** * Returns the creator of a collection, or the zero address if the collection has not been created. * @dev Reverts if `collectionId` does not represent a collection. * @param collectionId Identifier of the collection. * @return The creator of a collection, or the zero address if the collection has not been created. */ function creator(uint256 collectionId) external view returns (address); } // File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected] // Partially derived from OpenZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b10cb38d8fedf34f2d89b0ed604f2dceb76d6a9/contracts/utils/Strings.sol pragma solidity >=0.7.6 <0.8.0; library UInt256ToDecimalString { function toDecimalString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } // File @animoca/ethereum-contracts-assets-2.0.0/contracts/metadata/[email protected] pragma solidity >=0.7.6 <0.8.0; abstract contract BaseMetadataURI is ManagedIdentity, Ownable { using UInt256ToDecimalString for uint256; event BaseMetadataURISet(string baseMetadataURI); string public baseMetadataURI; function setBaseMetadataURI(string calldata baseMetadataURI_) external { _requireOwnership(_msgSender()); baseMetadataURI = baseMetadataURI_; emit BaseMetadataURISet(baseMetadataURI_); } function _uri(uint256 id) internal view virtual returns (string memory) { return string(abi.encodePacked(baseMetadataURI, id.toDecimalString())); } } // File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected] pragma solidity >=0.7.6 <0.8.0; /** * Contract which allows derived contracts access control over token minting operations. */ contract MinterRole is Ownable { event MinterAdded(address indexed account); event MinterRemoved(address indexed account); mapping(address => bool) public isMinter; /** * Constructor. */ constructor(address owner_) Ownable(owner_) { _addMinter(owner_); } /** * Grants the minter role to a non-minter. * @dev reverts if the sender is not the contract owner. * @param account The account to grant the minter role to. */ function addMinter(address account) public { _requireOwnership(_msgSender()); _addMinter(account); } /** * Renounces the granted minter role. * @dev reverts if the sender is not a minter. */ function renounceMinter() public { address account = _msgSender(); _requireMinter(account); isMinter[account] = false; emit MinterRemoved(account); } function _requireMinter(address account) internal view { require(isMinter[account], "MinterRole: not a Minter"); } function _addMinter(address account) internal { isMinter[account] = true; emit MinterAdded(account); } } // File contracts/token/ERC1155/TokenLaunchpadVouchers.sol pragma solidity >=0.7.6 <0.8.0; // solhint-disable-next-line max-line-length /** * @title TokenLaunchpadVouchers */ contract TokenLaunchpadVouchers is Recoverable, UsingUniversalForwarding, ERC1155InventoryBurnable, IERC1155InventoryMintable, IERC1155InventoryCreator, BaseMetadataURI, MinterRole { constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) UsingUniversalForwarding(forwarderRegistry, universalForwarder) MinterRole(msg.sender) {} //======================================================= ERC165 ========================================================// /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC1155InventoryCreator).interfaceId || super.supportsInterface(interfaceId); } //================================================= ERC1155MetadataURI ==================================================// /// @inheritdoc IERC1155MetadataURI function uri(uint256 id) external view virtual override returns (string memory) { return _uri(id); } //=============================================== ERC1155InventoryCreator ===============================================// /// @inheritdoc IERC1155InventoryCreator function creator(uint256 collectionId) external view override returns (address) { return _creator(collectionId); } //=========================================== ERC1155InventoryCreator (admin) ===========================================// /** * Creates a collection. * @dev Reverts if the sender is not the contract owner. * @dev Reverts if `collectionId` does not represent a collection. * @dev Reverts if `collectionId` has already been created. * @dev Emits a {IERC1155Inventory-CollectionCreated} event. * @param collectionId Identifier of the collection. */ function createCollection(uint256 collectionId) external { _requireOwnership(_msgSender()); _createCollection(collectionId); } //============================================== ERC1155InventoryMintable ===============================================// /// @inheritdoc IERC1155InventoryMintable /// @dev Reverts if the sender is not a minter. function safeMint( address to, uint256 id, uint256 value, bytes memory data ) public virtual override { _requireMinter(_msgSender()); _safeMint(to, id, value, data); } /// @inheritdoc IERC1155InventoryMintable /// @dev Reverts if the sender is not a minter. function safeBatchMint( address to, uint256[] memory ids, uint256[] memory values, bytes memory data ) public virtual override { _requireMinter(_msgSender()); _safeBatchMint(to, ids, values, data); } //======================================== Meta Transactions Internal Functions =========================================// function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) { return UsingUniversalForwarding._msgSender(); } function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) { return UsingUniversalForwarding._msgData(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"fungible","type":"bool"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"collectionOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseMetadataURI_","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162003c6b38038062003c6b833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633908117825560405190918491849184918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606091821b811660a05291901b16608052620000ad81620000b6565b50505062000102565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b60805160601c60a05160601c613b306200013b6000398061128852806132425250806112c35280613207528061329a5250613b306000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d94578063e985e9c514610db1578063f242432a14610ddf578063f2fde38b14610eaa576101c3565b8063bd85b03914610c46578063c3666c3614610c63578063c7778baa14610d77576101c3565b806398650275116100d35780639865027514610bcd578063a22cb46514610bd5578063aa271e1a14610c03578063adebf6f214610c29576101c3565b80638053493414610a685780638da5cb5b14610b9f578063983b2d5614610ba7576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146108055780636352211e146108c757806373c8a958146108e45780637e518ec8146109f8576101c3565b8063510b51581461079e578063572b6c05146107d75780635b2bd79e146107fd576101c3565b80630e89341c116101a25780630e89341c14610401578063124d91e5146104935780632eb2c2d6146104c55780634e1273f41461068c576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610ed0565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f9b565b604080519115158252519081900360200190f35b6103ff6004803603608081101561025757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561030657600080fd5b82018360208201111561031857600080fd5b8035906020019184602083028401116401000000008311171561033a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561038a57600080fd5b82018360208201111561039c57600080fd5b803590602001918460018302840111640100000000831117156103be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe1945050505050565b005b61041e6004803603602081101561041757600080fd5b5035611003565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ff600480360360608110156104a957600080fd5b506001600160a01b03813516906020810135906040013561100e565b6103ff600480360360a08110156104db57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561050f57600080fd5b82018360208201111561052157600080fd5b8035906020019184602083028401116401000000008311171561054357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460208302840111640100000000831117156105c757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561061757600080fd5b82018360208201111561062957600080fd5b8035906020019184600183028401116401000000008311171561064b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061115f945050505050565b61074e600480360360408110156106a257600080fd5b8101906020810181356401000000008111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460208302840111640100000000831117156106f157600080fd5b91939092909160208101903564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050611173565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561078a578181015183820152602001610772565b505050509050019250505060405180910390f35b6107bb600480360360208110156107b457600080fd5b5035611279565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107ed57600080fd5b50356001600160a01b0316611284565b61041e6112fd565b6103ff6004803603608081101561081b57600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561085257600080fd5b82018360208201111561086457600080fd5b8035906020019184600183028401116401000000008311171561088657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061138b945050505050565b6107bb600480360360208110156108dd57600080fd5b50356113a2565b6103ff600480360360608110156108fa57600080fd5b81019060208101813564010000000081111561091557600080fd5b82018360208201111561092757600080fd5b8035906020019184602083028401116401000000008311171561094957600080fd5b91939092909160208101903564010000000081111561096757600080fd5b82018360208201111561097957600080fd5b8035906020019184602083028401116401000000008311171561099b57600080fd5b9193909290916020810190356401000000008111156109b957600080fd5b8201836020820111156109cb57600080fd5b803590602001918460208302840111640100000000831117156109ed57600080fd5b50909250905061140c565b6103ff60048036036020811015610a0e57600080fd5b810190602081018135640100000000811115610a2957600080fd5b820183602082011115610a3b57600080fd5b80359060200191846001830284011164010000000083111715610a5d57600080fd5b5090925090506114fe565b6103ff60048036036060811015610a7e57600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610aa957600080fd5b820183602082011115610abb57600080fd5b80359060200191846020830284011164010000000083111715610add57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b80359060200191846020830284011164010000000083111715610b6157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061157a945050505050565b6107bb611851565b6103ff60048036036020811015610bbd57600080fd5b50356001600160a01b0316611861565b6103ff611878565b6103ff60048036036040811015610beb57600080fd5b506001600160a01b03813516906020013515156118d6565b61022d60048036036020811015610c1957600080fd5b50356001600160a01b03166119b7565b61022d60048036036020811015610c3f57600080fd5b50356119cc565b6101f460048036036020811015610c5c57600080fd5b50356119d7565b6103ff60048036036060811015610c7957600080fd5b810190602081018135640100000000811115610c9457600080fd5b820183602082011115610ca657600080fd5b80359060200191846020830284011164010000000083111715610cc857600080fd5b919390929091602081019035640100000000811115610ce657600080fd5b820183602082011115610cf857600080fd5b80359060200191846020830284011164010000000083111715610d1a57600080fd5b919390929091602081019035640100000000811115610d3857600080fd5b820183602082011115610d4a57600080fd5b80359060200191846020830284011164010000000083111715610d6c57600080fd5b509092509050611a2d565b6101f460048036036020811015610d8d57600080fd5b5035611b75565b6103ff60048036036020811015610daa57600080fd5b5035611bda565b61022d60048036036040811015610dc757600080fd5b506001600160a01b0381358116916020013516611bee565b6103ff600480360360a0811015610df557600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135640100000000811115610e3557600080fd5b820183602082011115610e4757600080fd5b80359060200191846001830284011164010000000083111715610e6957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c1c945050505050565b6103ff60048036036020811015610ec057600080fd5b50356001600160a01b0316611da2565b60006001600160a01b038316610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f3682611e13565b15610f70576000828152600460205260409020546001600160a01b03848116911614610f63576000610f66565b60015b60ff169050610f95565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b5158000000000000000000000000000000000000000000000000000000001480610fd95750610fd982611e65565b90505b919050565b610ff1610fec611ea3565b611eb2565b610ffd84848484611f1f565b50505050565b6060610fd982612209565b6000611018611ea3565b905061102484826122dc565b611075576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b61107e8361232a565b156110935761108e848484612350565b6110fb565b61109c83611e13565b156110ae5761108e8484846000612459565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61116c85858585856125a2565b5050505050565b60608382146111c9576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff811180156111e257600080fd5b5060405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b80861461126f5761125087878381811061122857fe5b905060200201356001600160a01b031686868481811061124457fe5b90506020020135610ed0565b82828151811061125c57fe5b6020908102919091010152600101611212565b5095945050505050565b6000610fd98261289e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b505050505081565b611396610fec611ea3565b610ffd84848484612917565b6000818152600460205260408120546001600160a01b038116610fd9576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61141c611417611ea3565b612a2c565b84838114801561142b57508082145b61147c576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f4576114ec88888381811061149557fe5b905060200201356001600160a01b03168585848181106114b157fe5b905060200201358888858181106114c457fe5b905060200201356001600160a01b03166001600160a01b0316612af09092919063ffffffff16565b60010161147f565b5050505050505050565b611509611417611ea3565b61151560068383613a59565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b8151815181146115d1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60006115db611ea3565b90506115e785826122dc565b611638576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b84811461172c57600087828151811061165357fe5b60200260200101519050600087838151811061166b57fe5b6020026020010151905061167e8261232a565b156116935761168e8a8383612350565b611722565b61169c82611e13565b156110ae576116ae8a83836001612459565b60006116b983612b75565b9050856116cc5780955060019450611720565b8581146117195760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611720565b8460010194505b505b505060010161163e565b50811561176e5760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156117f45781810151838201526020016117dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561183357818101518382015260200161181b565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b61186c611417611ea3565b61187581612b82565b50565b6000611882611ea3565b905061188d81611eb2565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b60006118e0611ea3565b9050806001600160a01b0316836001600160a01b03161415611949576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610fd98261232a565b60006119e282611e13565b15611a18576000828152600460205260409020546001600160a01b031615611a0b576001611a0e565b60005b60ff169050610fdc565b50600081815260036020526040902054610fdc565b611a38611417611ea3565b848381148015611a4757508082145b611a98576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f457858582818110611aae57fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611ad957fe5b905060200201356001600160a01b0316878786818110611af557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611b5257600080fd5b505af1158015611b66573d6000803e3d6000fd5b50505050806001019050611a9b565b6000611b8082611e13565b611bd1576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b610fd982612b75565b611be5611417611ea3565b61187581612bce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611c26611ea3565b90506001600160a01b038516611c83576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611c8d86826122dc565b611cde576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b611ce78461232a565b15611cfd57611cf886868686612d1a565b611d19565b611d0684611e13565b156110ae57611cf8868686866000612e38565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611d88856001600160a01b0316612f66565b15611d9a57611d9a8686868686612f6c565b505050505050565b611dad611417611ea3565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60007f8000000000000000000000000000000000000000000000000000000000000000821615801590610fd95750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f921ed8d1000000000000000000000000000000000000000000000000000000001480610fd95750610fd9826130f6565b6000611ead6131f7565b905090565b6001600160a01b03811660009081526007602052604090205460ff16611875576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611f7a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b825182518114611fd1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008060005b8381146120c3576000878281518110611fec57fe5b60200260200101519050600087838151811061200457fe5b602002602001015190506120178261232a565b1561202c576120278a8383613357565b6120b9565b61203582611e13565b156110ae576120478a83836001613449565b600061205283612b75565b90508561206557809550600194506120b7565b8581146120b05760008681526002602090815260408083206001600160a01b038f168452825280832080548901905597825260039052959095208054909401909355600192846120b7565b8460010194505b505b5050600101611fd7565b5081156121035760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000612117611ea3565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561218757818101518382015260200161216f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156121c65781810151838201526020016121ae565b5050505090500194505050505060405180910390a46121ed876001600160a01b0316612f66565b156122005761220060008888888861356b565b50505050505050565b60606006612216836136e9565b60405160200180838054600181600116156101000203166002900480156122745780601f10612252576101008083540402835291820191612274565b820191906000526020600020905b815481529060010190602001808311612260575b5050825160208401908083835b602083106122a05780518252601f199092019160209182019101612281565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061232357506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b806123a2576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b03871684529091529020548181101561241a576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b816001146124ae576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b0385811691161461251c576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090207fdead000000000000000000000000000000000000000000000000000000000000905580610ffd57600061255d84612b75565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b0384166125fd576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114612654576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061265e611ea3565b905061266a87826122dc565b6126bb576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b8481146127835760008882815181106126d657fe5b6020026020010151905060008883815181106126ee57fe5b602002602001015190506127018261232a565b15612717576127128c8c8484612d1a565b612779565b61272082611e13565b156110ae576127338c8c84846001612e38565b600061273e83612b75565b9050856127515780955060019450612777565b858114612770576127648d8d88886137f8565b80955060019450612777565b8460010194505b505b50506001016126c1565b50811561279657612796898984846137f8565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561281b578181015183820152602001612803565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561285a578181015183820152602001612842565b5050505090500194505050505060405180910390a4612881886001600160a01b0316612f66565b1561289357612893898989898961356b565b505050505050505050565b60006128a982611e13565b156128fb576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b038416612972576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b61297b8361232a565b156129905761298b848484613357565b6129ab565b61299983611e13565b156110ae5761298b8484846000613449565b6001600160a01b03841660006129bf611ea3565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4612a19846001600160a01b0316612f66565b15610ffd57610ffd600085858585612f6c565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d6020811015612a8f57600080fd5b50516001600160a01b03828116911614611875576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612b7090849061384c565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612bd781611e13565b15612c29576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612c93576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612c9b611ea3565b600082815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612ce88161232a565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612d6c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612de4576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461116c5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612e8d576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612efb576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061116c576000612f2584612b75565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61612fa4611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561301e578181015183820152602001613006565b50505050905090810190601f16801561304b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561306e57600080fd5b505af1158015613082573d6000803e3d6000fd5b505050506040513d602081101561309857600080fd5b50516001600160e01b0319161461116c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000148061315957506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061318d57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806131c157506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b80610fd95750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b60003381613203613a2f565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061327657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b1561328457915061185e9050565b6001600160a01b038216321480159061334357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561331657600080fd5b505afa15801561332a573d6000803e3d6000fd5b505050506040513d602081101561334057600080fd5b50515b1561335157915061185e9050565b50905090565b806133a9576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526003602052604090205481810181811161340f576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b8160011461349e576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b600083815260046020526040902054156134ff576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610ffd57600061352984612b75565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816135a3611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561361c578181015183820152602001613604565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561365b578181015183820152602001613643565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561369757818101518382015260200161367f565b50505050905090810190601f1680156136c45780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561306e57600080fd5b60608161372a575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610fdc565b8160005b811561374257600101600a8204915061372e565b60008167ffffffffffffffff8111801561375b57600080fd5b506040519080825280601f01601f191660200182016040528015613786576020820181803683370190505b50859350905060001982015b83156137ef57600a840660300160f81b828280600190039350815181106137b557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350613792565b50949350505050565b826001600160a01b0316846001600160a01b031614610ffd5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b8161385f6001600160a01b038216612f66565b6138b0576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106138ed5780518252601f1990920191602091820191016138ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461394f576040519150601f19603f3d011682016040523d82523d6000602084013e613954565b606091505b509150915081156139d3578051156139ce5780806020019051602081101561397b57600080fd5b50516139ce576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61116c565b8051613a26576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613a8f5760008555613ad5565b82601f10613aa85782800160ff19823516178555613ad5565b82800160010185558215613ad5579182015b82811115613ad5578235825591602001919060010190613aba565b50613ae1929150613ae5565b5090565b5b80821115613ae15760008155600101613ae656fea2646970667358221220d77b226555abdc3eaeb897b36079c6aba265c6dea8b9f1b2079a1553b5e712b664736f6c63430007060033000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d94578063e985e9c514610db1578063f242432a14610ddf578063f2fde38b14610eaa576101c3565b8063bd85b03914610c46578063c3666c3614610c63578063c7778baa14610d77576101c3565b806398650275116100d35780639865027514610bcd578063a22cb46514610bd5578063aa271e1a14610c03578063adebf6f214610c29576101c3565b80638053493414610a685780638da5cb5b14610b9f578063983b2d5614610ba7576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146108055780636352211e146108c757806373c8a958146108e45780637e518ec8146109f8576101c3565b8063510b51581461079e578063572b6c05146107d75780635b2bd79e146107fd576101c3565b80630e89341c116101a25780630e89341c14610401578063124d91e5146104935780632eb2c2d6146104c55780634e1273f41461068c576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610ed0565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f9b565b604080519115158252519081900360200190f35b6103ff6004803603608081101561025757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561030657600080fd5b82018360208201111561031857600080fd5b8035906020019184602083028401116401000000008311171561033a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561038a57600080fd5b82018360208201111561039c57600080fd5b803590602001918460018302840111640100000000831117156103be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe1945050505050565b005b61041e6004803603602081101561041757600080fd5b5035611003565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ff600480360360608110156104a957600080fd5b506001600160a01b03813516906020810135906040013561100e565b6103ff600480360360a08110156104db57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561050f57600080fd5b82018360208201111561052157600080fd5b8035906020019184602083028401116401000000008311171561054357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460208302840111640100000000831117156105c757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561061757600080fd5b82018360208201111561062957600080fd5b8035906020019184600183028401116401000000008311171561064b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061115f945050505050565b61074e600480360360408110156106a257600080fd5b8101906020810181356401000000008111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460208302840111640100000000831117156106f157600080fd5b91939092909160208101903564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050611173565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561078a578181015183820152602001610772565b505050509050019250505060405180910390f35b6107bb600480360360208110156107b457600080fd5b5035611279565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107ed57600080fd5b50356001600160a01b0316611284565b61041e6112fd565b6103ff6004803603608081101561081b57600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561085257600080fd5b82018360208201111561086457600080fd5b8035906020019184600183028401116401000000008311171561088657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061138b945050505050565b6107bb600480360360208110156108dd57600080fd5b50356113a2565b6103ff600480360360608110156108fa57600080fd5b81019060208101813564010000000081111561091557600080fd5b82018360208201111561092757600080fd5b8035906020019184602083028401116401000000008311171561094957600080fd5b91939092909160208101903564010000000081111561096757600080fd5b82018360208201111561097957600080fd5b8035906020019184602083028401116401000000008311171561099b57600080fd5b9193909290916020810190356401000000008111156109b957600080fd5b8201836020820111156109cb57600080fd5b803590602001918460208302840111640100000000831117156109ed57600080fd5b50909250905061140c565b6103ff60048036036020811015610a0e57600080fd5b810190602081018135640100000000811115610a2957600080fd5b820183602082011115610a3b57600080fd5b80359060200191846001830284011164010000000083111715610a5d57600080fd5b5090925090506114fe565b6103ff60048036036060811015610a7e57600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610aa957600080fd5b820183602082011115610abb57600080fd5b80359060200191846020830284011164010000000083111715610add57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b80359060200191846020830284011164010000000083111715610b6157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061157a945050505050565b6107bb611851565b6103ff60048036036020811015610bbd57600080fd5b50356001600160a01b0316611861565b6103ff611878565b6103ff60048036036040811015610beb57600080fd5b506001600160a01b03813516906020013515156118d6565b61022d60048036036020811015610c1957600080fd5b50356001600160a01b03166119b7565b61022d60048036036020811015610c3f57600080fd5b50356119cc565b6101f460048036036020811015610c5c57600080fd5b50356119d7565b6103ff60048036036060811015610c7957600080fd5b810190602081018135640100000000811115610c9457600080fd5b820183602082011115610ca657600080fd5b80359060200191846020830284011164010000000083111715610cc857600080fd5b919390929091602081019035640100000000811115610ce657600080fd5b820183602082011115610cf857600080fd5b80359060200191846020830284011164010000000083111715610d1a57600080fd5b919390929091602081019035640100000000811115610d3857600080fd5b820183602082011115610d4a57600080fd5b80359060200191846020830284011164010000000083111715610d6c57600080fd5b509092509050611a2d565b6101f460048036036020811015610d8d57600080fd5b5035611b75565b6103ff60048036036020811015610daa57600080fd5b5035611bda565b61022d60048036036040811015610dc757600080fd5b506001600160a01b0381358116916020013516611bee565b6103ff600480360360a0811015610df557600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135640100000000811115610e3557600080fd5b820183602082011115610e4757600080fd5b80359060200191846001830284011164010000000083111715610e6957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c1c945050505050565b6103ff60048036036020811015610ec057600080fd5b50356001600160a01b0316611da2565b60006001600160a01b038316610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f3682611e13565b15610f70576000828152600460205260409020546001600160a01b03848116911614610f63576000610f66565b60015b60ff169050610f95565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b5158000000000000000000000000000000000000000000000000000000001480610fd95750610fd982611e65565b90505b919050565b610ff1610fec611ea3565b611eb2565b610ffd84848484611f1f565b50505050565b6060610fd982612209565b6000611018611ea3565b905061102484826122dc565b611075576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b61107e8361232a565b156110935761108e848484612350565b6110fb565b61109c83611e13565b156110ae5761108e8484846000612459565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61116c85858585856125a2565b5050505050565b60608382146111c9576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff811180156111e257600080fd5b5060405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b80861461126f5761125087878381811061122857fe5b905060200201356001600160a01b031686868481811061124457fe5b90506020020135610ed0565b82828151811061125c57fe5b6020908102919091010152600101611212565b5095945050505050565b6000610fd98261289e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd957507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b505050505081565b611396610fec611ea3565b610ffd84848484612917565b6000818152600460205260408120546001600160a01b038116610fd9576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61141c611417611ea3565b612a2c565b84838114801561142b57508082145b61147c576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f4576114ec88888381811061149557fe5b905060200201356001600160a01b03168585848181106114b157fe5b905060200201358888858181106114c457fe5b905060200201356001600160a01b03166001600160a01b0316612af09092919063ffffffff16565b60010161147f565b5050505050505050565b611509611417611ea3565b61151560068383613a59565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b8151815181146115d1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60006115db611ea3565b90506115e785826122dc565b611638576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b84811461172c57600087828151811061165357fe5b60200260200101519050600087838151811061166b57fe5b6020026020010151905061167e8261232a565b156116935761168e8a8383612350565b611722565b61169c82611e13565b156110ae576116ae8a83836001612459565b60006116b983612b75565b9050856116cc5780955060019450611720565b8581146117195760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611720565b8460010194505b505b505060010161163e565b50811561176e5760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156117f45781810151838201526020016117dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561183357818101518382015260200161181b565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b61186c611417611ea3565b61187581612b82565b50565b6000611882611ea3565b905061188d81611eb2565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b60006118e0611ea3565b9050806001600160a01b0316836001600160a01b03161415611949576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610fd98261232a565b60006119e282611e13565b15611a18576000828152600460205260409020546001600160a01b031615611a0b576001611a0e565b60005b60ff169050610fdc565b50600081815260036020526040902054610fdc565b611a38611417611ea3565b848381148015611a4757508082145b611a98576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f457858582818110611aae57fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611ad957fe5b905060200201356001600160a01b0316878786818110611af557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611b5257600080fd5b505af1158015611b66573d6000803e3d6000fd5b50505050806001019050611a9b565b6000611b8082611e13565b611bd1576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b610fd982612b75565b611be5611417611ea3565b61187581612bce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611c26611ea3565b90506001600160a01b038516611c83576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611c8d86826122dc565b611cde576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b611ce78461232a565b15611cfd57611cf886868686612d1a565b611d19565b611d0684611e13565b156110ae57611cf8868686866000612e38565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611d88856001600160a01b0316612f66565b15611d9a57611d9a8686868686612f6c565b505050505050565b611dad611417611ea3565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60007f8000000000000000000000000000000000000000000000000000000000000000821615801590610fd95750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f921ed8d1000000000000000000000000000000000000000000000000000000001480610fd95750610fd9826130f6565b6000611ead6131f7565b905090565b6001600160a01b03811660009081526007602052604090205460ff16611875576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611f7a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b825182518114611fd1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008060005b8381146120c3576000878281518110611fec57fe5b60200260200101519050600087838151811061200457fe5b602002602001015190506120178261232a565b1561202c576120278a8383613357565b6120b9565b61203582611e13565b156110ae576120478a83836001613449565b600061205283612b75565b90508561206557809550600194506120b7565b8581146120b05760008681526002602090815260408083206001600160a01b038f168452825280832080548901905597825260039052959095208054909401909355600192846120b7565b8460010194505b505b5050600101611fd7565b5081156121035760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000612117611ea3565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561218757818101518382015260200161216f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156121c65781810151838201526020016121ae565b5050505090500194505050505060405180910390a46121ed876001600160a01b0316612f66565b156122005761220060008888888861356b565b50505050505050565b60606006612216836136e9565b60405160200180838054600181600116156101000203166002900480156122745780601f10612252576101008083540402835291820191612274565b820191906000526020600020905b815481529060010190602001808311612260575b5050825160208401908083835b602083106122a05780518252601f199092019160209182019101612281565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061232357506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b806123a2576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b03871684529091529020548181101561241a576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b816001146124ae576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b0385811691161461251c576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090207fdead000000000000000000000000000000000000000000000000000000000000905580610ffd57600061255d84612b75565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b0384166125fd576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114612654576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061265e611ea3565b905061266a87826122dc565b6126bb576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b8481146127835760008882815181106126d657fe5b6020026020010151905060008883815181106126ee57fe5b602002602001015190506127018261232a565b15612717576127128c8c8484612d1a565b612779565b61272082611e13565b156110ae576127338c8c84846001612e38565b600061273e83612b75565b9050856127515780955060019450612777565b858114612770576127648d8d88886137f8565b80955060019450612777565b8460010194505b505b50506001016126c1565b50811561279657612796898984846137f8565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561281b578181015183820152602001612803565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561285a578181015183820152602001612842565b5050505090500194505050505060405180910390a4612881886001600160a01b0316612f66565b1561289357612893898989898961356b565b505050505050505050565b60006128a982611e13565b156128fb576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b038416612972576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b61297b8361232a565b156129905761298b848484613357565b6129ab565b61299983611e13565b156110ae5761298b8484846000613449565b6001600160a01b03841660006129bf611ea3565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4612a19846001600160a01b0316612f66565b15610ffd57610ffd600085858585612f6c565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d6020811015612a8f57600080fd5b50516001600160a01b03828116911614611875576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612b7090849061384c565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612bd781611e13565b15612c29576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612c93576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612c9b611ea3565b600082815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612ce88161232a565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612d6c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612de4576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461116c5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612e8d576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612efb576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061116c576000612f2584612b75565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61612fa4611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561301e578181015183820152602001613006565b50505050905090810190601f16801561304b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561306e57600080fd5b505af1158015613082573d6000803e3d6000fd5b505050506040513d602081101561309857600080fd5b50516001600160e01b0319161461116c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000148061315957506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061318d57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806131c157506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b80610fd95750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b60003381613203613a2f565b90507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316148061327657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b1561328457915061185e9050565b6001600160a01b038216321480159061334357507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561331657600080fd5b505afa15801561332a573d6000803e3d6000fd5b505050506040513d602081101561334057600080fd5b50515b1561335157915061185e9050565b50905090565b806133a9576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526003602052604090205481810181811161340f576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b8160011461349e576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b600083815260046020526040902054156134ff576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610ffd57600061352984612b75565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816135a3611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561361c578181015183820152602001613604565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561365b578181015183820152602001613643565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561369757818101518382015260200161367f565b50505050905090810190601f1680156136c45780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561306e57600080fd5b60608161372a575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610fdc565b8160005b811561374257600101600a8204915061372e565b60008167ffffffffffffffff8111801561375b57600080fd5b506040519080825280601f01601f191660200182016040528015613786576020820181803683370190505b50859350905060001982015b83156137ef57600a840660300160f81b828280600190039350815181106137b557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350613792565b50949350505050565b826001600160a01b0316846001600160a01b031614610ffd5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b8161385f6001600160a01b038216612f66565b6138b0576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106138ed5780518252601f1990920191602091820191016138ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461394f576040519150601f19603f3d011682016040523d82523d6000602084013e613954565b606091505b509150915081156139d3578051156139ce5780806020019051602081101561397b57600080fd5b50516139ce576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61116c565b8051613a26576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613a8f5760008555613ad5565b82601f10613aa85782800160ff19823516178555613ad5565b82800160010185558215613ad5579182015b82811115613ad5578235825591602001919060010190613aba565b50613ae1929150613ae5565b5090565b5b80821115613ae15760008155600101613ae656fea2646970667358221220d77b226555abdc3eaeb897b36079c6aba265c6dea8b9f1b2079a1553b5e712b664736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : forwarderRegistry (address): 0xB87EbEB1f4aA317bd3eEc04704D3fFD6e3BC4b8f
Arg [1] : universalForwarder (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65562:3420:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38618:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38618:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;66144:214;;;;;;;;;;;;;;;;-1:-1:-1;66144:214:0;-1:-1:-1;;;;;;66144:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68202:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68202:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68202:263:0;;;;;;;;-1:-1:-1;68202:263:0;;-1:-1:-1;;68202:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68202:263:0;;;;;;;;-1:-1:-1;68202:263:0;;-1:-1:-1;;68202:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68202:263:0;;-1:-1:-1;68202:263:0;;-1:-1:-1;;;;;68202:263:0:i;:::-;;66538:114;;;;;;;;;;;;;;;;-1:-1:-1;66538:114:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55290:572;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55290:572:0;;;;;;;;;;;;;:::i;46294:329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46294:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46294:329:0;;;;;;;;-1:-1:-1;46294:329:0;;-1:-1:-1;;46294:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46294:329:0;;;;;;;;-1:-1:-1;46294:329:0;;-1:-1:-1;;46294:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46294:329:0;;-1:-1:-1;46294:329:0;;-1:-1:-1;;;;;46294:329:0:i;38993:445::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38993:445:0;;-1:-1:-1;38993:445:0;-1:-1:-1;38993:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66837:128;;;;;;;;;;;;;;;;-1:-1:-1;66837:128:0;;:::i;:::-;;;;-1:-1:-1;;;;;66837:128:0;;;;;;;;;;;;;;12466:195;;;;;;;;;;;;;;;;-1:-1:-1;12466:195:0;-1:-1:-1;;;;;12466:195:0;;:::i;63484:29::-;;;:::i;67863:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67863:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67863:231:0;;-1:-1:-1;67863:231:0;;-1:-1:-1;;;;;67863:231:0:i;40597:239::-;;;;;;;;;;;;;;;;-1:-1:-1;40597:239:0;;:::i;8549:492::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8549:492:0;;-1:-1:-1;8549:492:0;-1:-1:-1;8549:492:0;:::i;63522:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63522:218:0;;-1:-1:-1;63522:218:0;-1:-1:-1;63522:218:0;:::i;55917:1804::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55917:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55917:1804:0;;;;;;;;-1:-1:-1;55917:1804:0;;-1:-1:-1;;55917:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55917:1804:0;;-1:-1:-1;55917:1804:0;;-1:-1:-1;;;;;55917:1804:0:i;2894:96::-;;;:::i;64651:123::-;;;;;;;;;;;;;;;;-1:-1:-1;64651:123:0;-1:-1:-1;;;;;64651:123:0;;:::i;64895:190::-;;;:::i;39476:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39476:306:0;;;;;;;;;;:::i;64282:40::-;;;;;;;;;;;;;;;;-1:-1:-1;64282:40:0;-1:-1:-1;;;;;64282:40:0;;:::i;40164:124::-;;;;;;;;;;;;;;;;-1:-1:-1;40164:124:0;;:::i;41025:267::-;;;;;;;;;;;;;;;;-1:-1:-1;41025:267:0;;:::i;9867:522::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9867:522:0;;-1:-1:-1;9867:522:0;-1:-1:-1;9867:522:0;:::i;40335:215::-;;;;;;;;;;;;;;;;-1:-1:-1;40335:215:0;;:::i;67475:149::-;;;;;;;;;;;;;;;;-1:-1:-1;67475:149:0;;:::i;39820:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39820:166:0;;;;;;;;;;:::i;45436:811::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45436:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45436:811:0;;-1:-1:-1;45436:811:0;;-1:-1:-1;;;;;45436:811:0:i;3237:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3237:201:0;-1:-1:-1;;;;;3237:201:0;;:::i;38618:328::-;38702:7;-1:-1:-1;;;;;38730:19:0;;38722:55;;;;;-1:-1:-1;;;38722:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38794:23;:2;:21;:23::i;:::-;38790:109;;;38857:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;38841:38:0;;;;;;:46;;38886:1;38841:46;;;38882:1;38841:46;38834:53;;;;;;38790:109;-1:-1:-1;38918:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;38918:20:0;;;;;;;;;;38618:328;;;;;:::o;66144:214::-;66229:4;-1:-1:-1;;;;;;66253:57:0;;66268:42;66253:57;;:97;;;66314:36;66338:11;66314:23;:36::i;:::-;66246:104;;66144:214;;;;:::o;68202:263::-;68381:28;68396:12;:10;:12::i;:::-;68381:14;:28::i;:::-;68420:37;68435:2;68439:3;68444:6;68452:4;68420:14;:37::i;:::-;68202:263;;;;:::o;66538:114::-;66603:13;66636:8;66641:2;66636:4;:8::i;55290:572::-;55418:14;55435:12;:10;:12::i;:::-;55418:29;;55466:27;55480:4;55486:6;55466:13;:27::i;:::-;55458:70;;;;;-1:-1:-1;;;55458:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55545:20;:2;:18;:20::i;:::-;55541:245;;;55582:30;55596:4;55602:2;55606:5;55582:13;:30::i;:::-;55541:245;;;55634:23;:2;:21;:23::i;:::-;55630:156;;;55674:32;55683:4;55689:2;55693:5;55700;55674:8;:32::i;55630:156::-;55739:35;;;-1:-1:-1;;;55739:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55630:156;55840:1;-1:-1:-1;;;;;55803:51:0;55826:4;-1:-1:-1;;;;;55803:51:0;55818:6;-1:-1:-1;;;;;55803:51:0;;55844:2;55848:5;55803:51;;;;;;;;;;;;;;;;;;;;;;;;55290:572;;;;:::o;46294:329::-;46564:51;46587:4;46593:2;46597:3;46602:6;46610:4;46564:22;:51::i;:::-;46294:329;;;;;:::o;38993:445::-;39108:16;39145:27;;;39137:70;;;;;-1:-1:-1;;;39137:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39220:25;39262:6;39248:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39248:28:0;;39220:56;;39294:9;39289:114;39309:18;;;39289:114;;39363:28;39373:6;;39380:1;39373:9;;;;;;;;;;;;;-1:-1:-1;;;;;39373:9:0;39384:3;;39388:1;39384:6;;;;;;;;;;;;;39363:9;:28::i;:::-;39349:8;39358:1;39349:11;;;;;;;;;;;;;;;;;:42;39329:3;;39289:114;;;-1:-1:-1;39422:8:0;38993:445;-1:-1:-1;;;;;38993:445:0:o;66837:128::-;66908:7;66935:22;66944:12;66935:8;:22::i;12466:195::-;12553:4;12590:19;-1:-1:-1;;;;;12577:32:0;:9;-1:-1:-1;;;;;12577:32:0;;:76;;;;12634:18;-1:-1:-1;;;;;12613:40:0;:9;-1:-1:-1;;;;;12613:40:0;;12570:83;;12466:195;;;:::o;63484:29::-;;;;;;;;;;;;;;;-1:-1:-1;;63484:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67863:231::-;68017:28;68032:12;:10;:12::i;68017:28::-;68056:30;68066:2;68070;68074:5;68081:4;68056:9;:30::i;40597:239::-;40667:7;40719:14;;;:7;:14;;;;;;-1:-1:-1;;;;;40754:19:0;;40746:59;;;;;-1:-1:-1;;;40746:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8549:492;8718:31;8736:12;:10;:12::i;:::-;8718:17;:31::i;:::-;8777:8;8811:23;;;:51;;;;-1:-1:-1;8838:24:0;;;8811:51;8803:90;;;;;-1:-1:-1;;;8803:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8909:9;8904:130;8929:6;8924:1;:11;8904:130;;8957:65;8998:8;;9007:1;8998:11;;;;;;;;;;;;;-1:-1:-1;;;;;8998:11:0;9011:7;;9019:1;9011:10;;;;;;;;;;;;;8971:6;;8978:1;8971:9;;;;;;;;;;;;;-1:-1:-1;;;;;8971:9:0;-1:-1:-1;;;;;8957:40:0;;;:65;;;;;:::i;:::-;8937:3;;8904:130;;;;8549:492;;;;;;;:::o;63522:218::-;63604:31;63622:12;:10;:12::i;63604:31::-;63646:34;:15;63664:16;;63646:34;:::i;:::-;;63696:36;63715:16;;63696:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63696:36:0;;;;;;;;-1:-1:-1;63696:36:0;;-1:-1:-1;;;;63696:36:0;63522:218;;:::o;55917:1804::-;56087:10;;56126:13;;56116:23;;56108:66;;;;;-1:-1:-1;;;56108:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56187:14;56204:12;:10;:12::i;:::-;56187:29;;56235:27;56249:4;56255:6;56235:13;:27::i;:::-;56227:70;;;;;-1:-1:-1;;;56227:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56310:22;56343:25;56384:9;56379:1088;56400:6;56395:1;:11;56379:1088;;56428:10;56441:3;56445:1;56441:6;;;;;;;;;;;;;;56428:19;;56462:13;56478:6;56485:1;56478:9;;;;;;;;;;;;;;56462:25;;56506:20;:2;:18;:20::i;:::-;56502:954;;;56547:30;56561:4;56567:2;56571:5;56547:13;:30::i;:::-;56502:954;;;56603:23;:2;:21;:23::i;:::-;56599:857;;;56647:31;56656:4;56662:2;56666:5;56673:4;56647:8;:31::i;:::-;56697:24;56724:29;:2;:27;:29::i;:::-;56697:56;-1:-1:-1;56776:19:0;56772:593;;56837:16;56820:33;;56896:1;56876:21;;56772:593;;;56970:14;56950:16;:34;56946:400;;57013:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57013:31:0;;;;;;;;;:52;;;;;;;57092:25;;;:9;:25;;;;;;:46;;;;;;;;;-1:-1:-1;;57182:16:0;56946:400;;;57303:19;;;;;56946:400;56599:857;;-1:-1:-1;;56408:3:0;;56379:1088;;;-1:-1:-1;57483:19:0;;57479:165;;57519:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57519:31:0;;;;;;;;;:52;;;;;;;57586:25;;;:9;:25;;;;;:46;;;;;;;57479:165;57697:1;-1:-1:-1;;;;;57661:52:0;57683:4;-1:-1:-1;;;;;57661:52:0;57675:6;-1:-1:-1;;;;;57661:52:0;;57701:3;57706:6;57661:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55917:1804;;;;;;;:::o;2894:96::-;2949:7;2976:6;-1:-1:-1;;;;;2976:6:0;2894:96;;:::o;64651:123::-;64705:31;64723:12;:10;:12::i;64705:31::-;64747:19;64758:7;64747:10;:19::i;:::-;64651:123;:::o;64895:190::-;64939:15;64957:12;:10;:12::i;:::-;64939:30;;64980:23;64995:7;64980:14;:23::i;:::-;-1:-1:-1;;;;;65014:17:0;;65034:5;65014:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;65014:25:0;;;65055:22;;;65034:5;65055:22;64895:190;:::o;39476:306::-;39571:14;39588:12;:10;:12::i;:::-;39571:29;;39631:6;-1:-1:-1;;;;;39619:18:0;:8;-1:-1:-1;;;;;39619:18:0;;;39611:55;;;;;-1:-1:-1;;;39611:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39677:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;39677:39:0;;;;;;;;;;39732:42;;;;;;;;;;;;;;;;;39476:306;;;:::o;64282:40::-;;;;;;;;;;;;;;;:::o;40164:124::-;40236:4;40260:20;:2;:18;:20::i;41025:267::-;41098:7;41122:23;:2;:21;:23::i;:::-;41118:167;;;41210:1;41185:11;;;:7;:11;;;;;;-1:-1:-1;;;;;41169:43:0;;:51;;41219:1;41169:51;;;41215:1;41169:51;41162:58;;;;;;41118:167;-1:-1:-1;41260:13:0;;;;:9;:13;;;;;;41253:20;;9867:522;10041:31;10059:12;:10;:12::i;10041:31::-;10100:8;10134:26;;;:55;;;;-1:-1:-1;10164:25:0;;;10134:55;10126:94;;;;;-1:-1:-1;;;10126:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10236:9;10231:151;10256:6;10251:1;:11;10231:151;;10303:9;;10313:1;10303:12;;;;;;;;;;;;;-1:-1:-1;;;;;10303:12:0;-1:-1:-1;;;;;10284:45:0;;10338:4;10345:8;;10354:1;10345:11;;;;;;;;;;;;;-1:-1:-1;;;;;10345:11:0;10358:8;;10367:1;10358:11;;;;;;;;;;;;;10284:86;;;;;;;;;;;;;-1:-1:-1;;;;;10284:86:0;;;;;;-1:-1:-1;;;;;10284:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10264:3;;;;;10231:151;;40335:215;40412:7;40440:26;:5;:24;:26::i;:::-;40432:60;;;;;-1:-1:-1;;;40432:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40510:32;:5;:30;:32::i;67475:149::-;67543:31;67561:12;:10;:12::i;67543:31::-;67585;67603:12;67585:17;:31::i;39820:166::-;-1:-1:-1;;;;;39946:22:0;;;39922:4;39946:22;;;:10;:22;;;;;;;;:32;;;;;;;;;;;;;;;39820:166::o;45436:811::-;45621:14;45638:12;:10;:12::i;:::-;45621:29;-1:-1:-1;;;;;;45669:16:0;;45661:56;;;;;-1:-1:-1;;;45661:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45736:27;45750:4;45756:6;45736:13;:27::i;:::-;45728:70;;;;;-1:-1:-1;;;45728:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45815:20;:2;:18;:20::i;:::-;45811:261;;;45852:38;45870:4;45876:2;45880;45884:5;45852:17;:38::i;:::-;45811:261;;;45912:23;:2;:21;:23::i;:::-;45908:164;;;45952:40;45965:4;45971:2;45975;45979:5;45986;45952:12;:40::i;45908:164::-;46118:2;-1:-1:-1;;;;;46089:43:0;46112:4;-1:-1:-1;;;;;46089:43:0;46104:6;-1:-1:-1;;;;;46089:43:0;;46122:2;46126:5;46089:43;;;;;;;;;;;;;;;;;;;;;;;;46147:15;:2;-1:-1:-1;;;;;46147:13:0;;:15::i;:::-;46143:97;;;46179:49;46202:4;46208:2;46212;46216:5;46223:4;46179:22;:49::i;:::-;45436:811;;;;;;:::o;3237:201::-;3317:31;3335:12;:10;:12::i;3317:31::-;3359:6;:17;;;;-1:-1:-1;;;;;3359:17:0;;;;;;;;;3392:38;;3359:17;;3413:6;;;3392:38;;3359:6;3392:38;3237:201;:::o;17668:140::-;17731:4;17311:8;17755:12;;:17;;;;:45;;-1:-1:-1;;17522:20:0;17776:19;:24;;;17668:140::o;54889:215::-;54974:4;-1:-1:-1;;;;;;54998:58:0;;55013:43;54998:58;;:98;;;55060:36;55084:11;55060:23;:36::i;68604:185::-;68709:15;68744:37;:35;:37::i;:::-;68737:44;;68604:185;:::o;65093:128::-;-1:-1:-1;;;;;65167:17:0;;;;;;:8;:17;;;;;;;;65159:54;;;;;-1:-1:-1;;;65159:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49359:1880;-1:-1:-1;;;;;49540:16:0;;49532:52;;;;;-1:-1:-1;;;49532:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49612:10;;49651:13;;49641:23;;49633:66;;;;;-1:-1:-1;;;49633:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49712:22;49745:25;49786:9;49781:1082;49802:6;49797:1;:11;49781:1082;;49830:10;49843:3;49847:1;49843:6;;;;;;;;;;;;;;49830:19;;49864:13;49880:6;49887:1;49880:9;;;;;;;;;;;;;;49864:25;;49908:20;:2;:18;:20::i;:::-;49904:948;;;49949:28;49963:2;49967;49971:5;49949:13;:28::i;:::-;49904:948;;;50003:23;:2;:21;:23::i;:::-;49999:853;;;50047:29;50056:2;50060;50064:5;50071:4;50047:8;:29::i;:::-;50095:24;50122:29;:2;:27;:29::i;:::-;50095:56;-1:-1:-1;50174:19:0;50170:591;;50235:16;50218:33;;50294:1;50274:21;;50170:591;;;50368:14;50348:16;:34;50344:398;;50411:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50411:29:0;;;;;;;;;:50;;;;;;50488:25;;;:9;:25;;;;;;:46;;;;;;;;-1:-1:-1;;50578:16:0;50344:398;;;50699:19;;;;;50344:398;49999:853;;-1:-1:-1;;49810:3:0;;49781:1082;;;-1:-1:-1;50879:19:0;;50875:163;;50915:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50915:29:0;;;;;;;;;:50;;;;;;50980:25;;;:9;:25;;;;;:46;;;;;;50875:163;-1:-1:-1;;;;;51055:56:0;;51091:1;51069:12;:10;:12::i;:::-;-1:-1:-1;;;;;51055:56:0;;51099:3;51104:6;51055:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51126:15;:2;-1:-1:-1;;;;;51126:13:0;;:15::i;:::-;51122:110;;;51158:62;51194:1;51198:2;51202:3;51207:6;51215:4;51158:27;:62::i;:::-;49359:1880;;;;;;;:::o;63748:161::-;63805:13;63862:15;63879:20;:2;:18;:20::i;:::-;63845:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63845:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63845:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63831:70;;63748:161;;;:::o;42783:160::-;42867:4;42900:6;-1:-1:-1;;;;;42892:14:0;:4;-1:-1:-1;;;;;42892:14:0;;42891:44;;;-1:-1:-1;;;;;;42911:16:0;;;;;;;:10;:16;;;;;;;;:24;;;;;;;;;;;;42891:44;42884:51;42783:160;-1:-1:-1;;;42783:160:0:o;17551:109::-;17311:8;17635:12;:17;;17551:109::o;57860:397::-;57986:10;57978:44;;;;;-1:-1:-1;;;57978:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58033:15;58051:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58051:19:0;;;;;;;;;;58089:16;;;;58081:58;;;;;-1:-1:-1;;;58081:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58150:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58150:19:0;;;;;;;;;;;58172:15;;;;58150:37;;;58227:13;;;:9;:13;;;;;:22;;;;;;;;57860:397::o;58265:618::-;58409:5;58418:1;58409:10;58401:49;;;;;-1:-1:-1;;;58401:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58493:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;58469:37:0;;;;;;58461:74;;;;;-1:-1:-1;;;58461:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58546:11;;;;:7;:11;;;;;37259:66;58546:30;;58594:7;58589:287;;58618:20;58641:29;:2;:27;:29::i;:::-;58762:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;58762:29:0;;;;;;;;;58760:31;;-1:-1:-1;;58760:31:0;;;;;;58841:23;;;:9;:23;;;;;58839:25;;;;;;;-1:-1:-1;58265:618:0;;;;:::o;46762:1942::-;-1:-1:-1;;;;;46966:16:0;;46958:56;;;;;-1:-1:-1;;;46958:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47042:10;;47081:13;;47071:23;;47063:66;;;;;-1:-1:-1;;;47063:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47140:14;47157:12;:10;:12::i;:::-;47140:29;;47188:27;47202:4;47208:6;47188:13;:27::i;:::-;47180:70;;;;;-1:-1:-1;;;47180:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47263:22;47296:25;47337:9;47332:1052;47353:6;47348:1;:11;47332:1052;;47381:10;47394:3;47398:1;47394:6;;;;;;;;;;;;;;47381:19;;47415:13;47431:6;47438:1;47431:9;;;;;;;;;;;;;;47415:25;;47459:20;:2;:18;:20::i;:::-;47455:918;;;47500:38;47518:4;47524:2;47528;47532:5;47500:17;:38::i;:::-;47455:918;;;47564:23;:2;:21;:23::i;:::-;47560:813;;;47608:39;47621:4;47627:2;47631;47635:5;47642:4;47608:12;:39::i;:::-;47666:24;47693:29;:2;:27;:29::i;:::-;47666:56;-1:-1:-1;47745:19:0;47741:541;;47806:16;47789:33;;47865:1;47845:21;;47741:541;;;47939:14;47919:16;:34;47915:348;;47982:73;48011:4;48017:2;48021:14;48037:17;47982:28;:73::i;:::-;48099:16;48082:33;;48162:1;48142:21;;47915:348;;;48220:19;;;;;47915:348;47560:813;;-1:-1:-1;;47361:3:0;;47332:1052;;;-1:-1:-1;48400:19:0;;48396:125;;48436:73;48465:4;48471:2;48475:14;48491:17;48436:28;:73::i;:::-;48566:2;-1:-1:-1;;;;;48538:44:0;48560:4;-1:-1:-1;;;;;48538:44:0;48552:6;-1:-1:-1;;;;;48538:44:0;;48570:3;48575:6;48538:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48597:15;:2;-1:-1:-1;;;;;48597:13:0;;:15::i;:::-;48593:104;;;48629:56;48657:4;48663:2;48667:3;48672:6;48680:4;48629:27;:56::i;:::-;46762:1942;;;;;;;;;:::o;42137:214::-;42208:7;42237:33;:12;:31;:33::i;:::-;42236:34;42228:74;;;;;-1:-1:-1;;;42228:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42320:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;42320:23:0;;42137:214::o;48712:639::-;-1:-1:-1;;;;;48860:16:0;;48852:52;;;;;-1:-1:-1;;;48852:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48921:20;:2;:18;:20::i;:::-;48917:241;;;48958:28;48972:2;48976;48980:5;48958:13;:28::i;:::-;48917:241;;;49008:23;:2;:21;:23::i;:::-;49004:154;;;49048:30;49057:2;49061;49065:5;49072;49048:8;:30::i;49004:154::-;-1:-1:-1;;;;;49175:55:0;;49212:1;49190:12;:10;:12::i;:::-;-1:-1:-1;;;;;49175:55:0;;49220:2;49224:5;49175:55;;;;;;;;;;;;;;;;;;;;;;;;49245:15;:2;-1:-1:-1;;;;;49245:13:0;;:15::i;:::-;49241:103;;;49277:55;49308:1;49312:2;49316;49320:5;49327:4;49277:22;:55::i;3569:138::-;3660:4;-1:-1:-1;;;;;3660:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3660:12:0;-1:-1:-1;;;;;3649:23:0;;;;;;3641:58;;;;;-1:-1:-1;;;3641:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5536:229;5698:58;;;-1:-1:-1;;;;;5698:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5721:23;5698:58;;;5663:94;;5691:5;;5663:27;:94::i;:::-;5536:229;;;:::o;17816:134::-;-1:-1:-1;;;;;;17915:27:0;;17816:134::o;65229:125::-;-1:-1:-1;;;;;65286:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;65286:24:0;65306:4;65286:24;;;65326:20;;;65286:17;65326:20;65229:125;:::o;41751:378::-;41837:33;:12;:31;:33::i;:::-;41836:34;41828:74;;;;;-1:-1:-1;;;41828:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41956:1;41921:23;;;:9;:23;;;;;;-1:-1:-1;;;;;41921:23:0;:37;41913:80;;;;;-1:-1:-1;;;41913:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42030:12;:10;:12::i;:::-;42004:23;;;;:9;:23;;;;;:38;;;;-1:-1:-1;;;;;42004:38:0;;;;;;;;;;42090:30;42004:23;42090:28;:30::i;:::-;42058:63;;42076:12;42058:63;;;;;;;;;;41751:378;:::o;52588:501::-;52739:10;52731:44;;;;;-1:-1:-1;;;52731:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52786:15;52804:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52804:19:0;;;;;;;;;;52842:16;;;;52834:58;;;;;-1:-1:-1;;;52834:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52915:2;-1:-1:-1;;;;;52907:10:0;:4;-1:-1:-1;;;;;52907:10:0;;52903:179;;52934:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52934:19:0;;;;;;;;;;;52956:15;;;;52934:37;;;53044:17;;;;;;;:26;;;;;;;52588:501::o;53097:679::-;53266:5;53275:1;53266:10;53258:49;;;;;-1:-1:-1;;;53258:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53350:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;53326:37:0;;;;;;53318:74;;;;;-1:-1:-1;;;53318:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53403:11;;;;:7;:11;;;;;-1:-1:-1;;;;;53417:20:0;;53403:34;;53453:7;53448:321;;53477:20;53500:29;:2;:27;:29::i;:::-;53618:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;53618:29:0;;;;;;;;;;;:34;;-1:-1:-1;;53618:34:0;;;53725:27;;;;;;-1:-1:-1;;;53725:27:0;;:32;;-1:-1:-1;53725:32:0;;;-1:-1:-1;53097:679:0:o;4723:387::-;5046:20;5094:8;;;4723:387::o;43426:325::-;43694:17;-1:-1:-1;;;;;43610:43:0;;36977:10;43654:12;:10;:12::i;:::-;43668:4;43674:2;43678:5;43685:4;43610:80;;;;;;;;;;;;;-1:-1:-1;;;;;43610:80:0;;;;;;-1:-1:-1;;;;;43610:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43610:80:0;-1:-1:-1;;;;;;43610:101:0;;43602:141;;;;;-1:-1:-1;;;43602:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37989:451;38074:4;-1:-1:-1;;;;;;38111:40:0;;38126:25;38111:40;;:98;;-1:-1:-1;;;;;;;38168:41:0;;38183:26;38168:41;38111:98;:167;;;-1:-1:-1;;;;;;;38226:52:0;;38241:37;38226:52;38111:167;:243;;;-1:-1:-1;;;;;;;38295:59:0;;38310:44;38295:59;38111:243;:321;;;-1:-1:-1;;;;;;;;38371:61:0;38386:46;38371:61;;37989:451::o;12669:922::-;12722:15;12778:10;12722:15;12824:27;:25;:27::i;:::-;12799:52;;12887:18;-1:-1:-1;;;;;12866:40:0;:9;-1:-1:-1;;;;;12866:40:0;;:76;;;;12923:19;-1:-1:-1;;;;;12910:32:0;:9;-1:-1:-1;;;;;12910:32:0;;12866:76;12862:169;;;13013:6;-1:-1:-1;13006:13:0;;-1:-1:-1;13006:13:0;12862:169;-1:-1:-1;;;;;13435:22:0;;13448:9;13435:22;;;;:78;;;13461:18;-1:-1:-1;;;;;13461:33:0;;13495:6;13503:9;13461:52;;;;;;;;;;;;;-1:-1:-1;;;;;13461:52:0;;;;;;-1:-1:-1;;;;;13461:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13461:52:0;13435:78;13431:124;;;13537:6;-1:-1:-1;13530:13:0;;-1:-1:-1;13530:13:0;13431:124;-1:-1:-1;13574:9:0;-1:-1:-1;12669:922:0;:::o;51378:488::-;51502:10;51494:44;;;;;-1:-1:-1;;;51494:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51549:14;51566:13;;;:9;:13;;;;;;51610:14;;;51643:18;;;51635:57;;;;;-1:-1:-1;;;51635:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51703:13;;;;:9;:13;;;;;;;;:25;;;;51832:9;:13;;;;;-1:-1:-1;;;;;51832:17:0;;;;;;;;;-1:-1:-1;51832:17:0;;;:26;;;;;;;51378:488::o;51874:706::-;52016:5;52025:1;52016:10;52008:49;;;;;-1:-1:-1;;;52008:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52076:11;;;;:7;:11;;;;;;:16;52068:58;;;;;-1:-1:-1;;;52068:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52139:11;;;;:7;:11;;;;;-1:-1:-1;;;;;52153:20:0;;52139:34;;52191:7;52186:387;;52215:20;52238:29;:2;:27;:29::i;:::-;52436:23;;;;:9;:23;;;;;;;;52434:25;;;;;;;;;52534:9;:23;;;;;-1:-1:-1;;;;;52534:27:0;;;;;;;;;;52532:29;;;;;;;-1:-1:-1;51874:706:0;;;;:::o;44247:400::-;44561:23;-1:-1:-1;;;;;44470:48:0;;37142:10;44519:12;:10;:12::i;:::-;44533:4;44539:3;44544:6;44552:4;44470:87;;;;;;;;;;;;;-1:-1:-1;;;;;44470:87:0;;;;;;-1:-1:-1;;;;;44470:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62601:564;62664:13;62694:10;62690:53;;-1:-1:-1;62721:10:0;;;;;;;;;;;;;;;;;;;62690:53;62768:5;62753:12;62809:78;62816:9;;62809:78;;62842:8;;62873:2;62865:10;;;;62809:78;;;62897:19;62929:6;62919:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62919:17:0;-1:-1:-1;62991:5:0;;-1:-1:-1;62897:39:0;-1:-1:-1;;;62963:10:0;;63007:119;63014:9;;63007:119;;63084:2;63077:4;:9;63071:2;:16;63058:31;;63040:6;63047:7;;;;;;;63040:15;;;;;;;;;;;:49;;;;;;;;;;-1:-1:-1;63112:2:0;63104:10;;;;63007:119;;;-1:-1:-1;63150:6:0;62601:564;-1:-1:-1;;;;62601:564:0:o;53784:446::-;53969:2;-1:-1:-1;;;;;53961:10:0;:4;-1:-1:-1;;;;;53961:10:0;;53957:266;;54062:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;54062:29:0;;;;;;;;;;;:39;;;;;;;54174:27;;;;;;;:37;;;;;;;53784:446::o;6292:892::-;6418:5;6443:19;-1:-1:-1;;;;;6443:17:0;;;:19::i;:::-;6435:58;;;;;-1:-1:-1;;;6435:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6567:12;6581:17;6602:6;-1:-1:-1;;;;;6602:11:0;6614:8;6602:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6602:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6566:57;;;;6638:7;6634:543;;;6666:11;;:16;6662:124;;6722:4;6711:24;;;;;;;;;;;;;;;-1:-1:-1;6711:24:0;6703:67;;;;;-1:-1:-1;;;6703:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6634:543;;;6877:11;;6873:97;;6914:40;;;-1:-1:-1;;;6914:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6873:97;7101:4;7095:11;7146:4;7139;7135:2;7131:13;7124:27;10782:526;11265:23;11269:14;11265:23;11252:37;11248:2;11244:46;;11219:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://d77b226555abdc3eaeb897b36079c6aba265c6dea8b9f1b2079a1553b5e712b6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.