Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
NFT
Overview
Max Total Supply
5,000
Holders
2,974
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:
BenjiBananasMembershipPassNFT
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-14 */ // Sources flattened with hardhat v2.6.4 https://hardhat.org // File contracts/token/erc1155/BenjiBananasMembershipPassNFT.sol /** *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/BenjiBananasMembershipPassNFT.sol pragma solidity >=0.7.6 <0.8.0; // solhint-disable-next-line max-line-length /** * @title BenjiBananasMembershipPassNFT */ contract BenjiBananasMembershipPassNFT 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
60c06040523480156200001157600080fd5b50604051620039b6380380620039b6833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633908117825560405190918491849184918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606091821b811660a05291901b16608052620000ad81620000b6565b50505062000102565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b60805160601c60a05160601c61387b6200013b600039806112255280612fc35250806112605280612f88528061301b525061387b6000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d70578063e985e9c514610d8d578063f242432a14610dbb578063f2fde38b14610e84576101c3565b8063bd85b03914610c28578063c3666c3614610c45578063c7778baa14610d53576101c3565b806398650275116100d35780639865027514610baf578063a22cb46514610bb7578063aa271e1a14610be5578063adebf6f214610c0b576101c3565b80638053493414610a4e5780638da5cb5b14610b81578063983b2d5614610b89576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146107f55780636352211e146108b557806373c8a958146108d25780637e518ec8146109e0576101c3565b8063510b51581461078e578063572b6c05146107c75780635b2bd79e146107ed576101c3565b80630e89341c116101a25780630e89341c146103fb578063124d91e51461048d5780632eb2c2d6146104bf5780634e1273f414610680576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610eaa565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f75565b604080519115158252519081900360200190f35b6103f96004803603608081101561025757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460208302840111600160201b831117156102b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038557600080fd5b82018360208201111561039757600080fd5b803590602001918460018302840111600160201b831117156103b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fa2945050505050565b005b6104186004803603602081101561041157600080fd5b5035610fc4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045257818101518382015260200161043a565b50505050905090810190601f16801561047f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360608110156104a357600080fd5b506001600160a01b038135169060208101359060400135610fcf565b6103f9600480360360a08110156104d557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460208302840111600160201b8311171561053b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058a57600080fd5b82018360208201111561059c57600080fd5b803590602001918460208302840111600160201b831117156105bd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460018302840111600160201b8311171561063f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061110e945050505050565b61073e6004803603604081101561069657600080fd5b810190602081018135600160201b8111156106b057600080fd5b8201836020820111156106c257600080fd5b803590602001918460208302840111600160201b831117156106e357600080fd5b919390929091602081019035600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460208302840111600160201b8311171561073357600080fd5b509092509050611122565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561077a578181015183820152602001610762565b505050509050019250505060405180910390f35b6107ab600480360360208110156107a457600080fd5b5035611216565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107dd57600080fd5b50356001600160a01b0316611221565b61041861129a565b6103f96004803603608081101561080b57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561084157600080fd5b82018360208201111561085357600080fd5b803590602001918460018302840111600160201b8311171561087457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611328945050505050565b6107ab600480360360208110156108cb57600080fd5b503561133f565b6103f9600480360360608110156108e857600080fd5b810190602081018135600160201b81111561090257600080fd5b82018360208201111561091457600080fd5b803590602001918460208302840111600160201b8311171561093557600080fd5b919390929091602081019035600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460208302840111600160201b8311171561098557600080fd5b919390929091602081019035600160201b8111156109a257600080fd5b8201836020820111156109b457600080fd5b803590602001918460208302840111600160201b831117156109d557600080fd5b5090925090506113a9565b6103f9600480360360208110156109f657600080fd5b810190602081018135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b50909250905061149b565b6103f960048036036060811015610a6457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a8e57600080fd5b820183602082011115610aa057600080fd5b803590602001918460208302840111600160201b83111715610ac157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611517945050505050565b6107ab6117ca565b6103f960048036036020811015610b9f57600080fd5b50356001600160a01b03166117da565b6103f96117f1565b6103f960048036036040811015610bcd57600080fd5b506001600160a01b038135169060200135151561184f565b61022d60048036036020811015610bfb57600080fd5b50356001600160a01b0316611930565b61022d60048036036020811015610c2157600080fd5b5035611945565b6101f460048036036020811015610c3e57600080fd5b5035611950565b6103f960048036036060811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b919390929091602081019035600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460208302840111600160201b83111715610cf857600080fd5b919390929091602081019035600160201b811115610d1557600080fd5b820183602082011115610d2757600080fd5b803590602001918460208302840111600160201b83111715610d4857600080fd5b5090925090506119a6565b6101f460048036036020811015610d6957600080fd5b5035611aee565b6103f960048036036020811015610d8657600080fd5b5035611b4b565b61022d60048036036040811015610da357600080fd5b506001600160a01b0381358116916020013516611b5f565b6103f9600480360360a0811015610dd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e1057600080fd5b820183602082011115610e2257600080fd5b803590602001918460018302840111600160201b83111715610e4357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b6103f960048036036020811015610e9a57600080fd5b50356001600160a01b0316611d01565b60006001600160a01b038316610f07576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f1082611d5a565b15610f4a576000828152600460205260409020546001600160a01b03848116911614610f3d576000610f40565b60015b60ff169050610f6f565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216630a216a2b60e31b1480610f9a5750610f9a82611d7b565b90505b919050565b610fb2610fad611da0565b611daf565b610fbe84848484611e1c565b50505050565b6060610f9a826120ee565b6000610fd9611da0565b9050610fe584826121c1565b611024576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b61102d8361220f565b156110425761103d848484612219565b6110aa565b61104b83611d5a565b1561105d5761103d848484600061231a565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61111b8585858585612440565b5050505050565b6060838214611166576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008467ffffffffffffffff8111801561117f57600080fd5b506040519080825280602002602001820160405280156111a9578160200160208202803683370190505b50905060005b80861461120c576111ed8787838181106111c557fe5b905060200201356001600160a01b03168686848181106111e157fe5b90506020020135610eaa565b8282815181106111f957fe5b60209081029190910101526001016111af565b5095945050505050565b6000610f9a82612718565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f9a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b505050505081565b611333610fad611da0565b610fbe84848484612791565b6000818152600460205260408120546001600160a01b038116610f9a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b6113b96113b4611da0565b6128a0565b8483811480156113c857508082145b611419576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114915761148988888381811061143257fe5b905060200201356001600160a01b031685858481811061144e57fe5b9050602002013588888581811061146157fe5b905060200201356001600160a01b03166001600160a01b031661295d9092919063ffffffff16565b60010161141c565b5050505050505050565b6114a66113b4611da0565b6114b260068383613764565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b81518151811461155c576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b6000611566611da0565b905061157285826121c1565b6115b1576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146116a55760008782815181106115cc57fe5b6020026020010151905060008783815181106115e457fe5b602002602001015190506115f78261220f565b1561160c576116078a8383612219565b61169b565b61161582611d5a565b1561105d576116278a8383600161231a565b6000611632836129b4565b9050856116455780955060019450611699565b8581146116925760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611699565b8460010194505b505b50506001016115b7565b5081156116e75760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561176d578181015183820152602001611755565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117ac578181015183820152602001611794565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b6117e56113b4611da0565b6117ee816129c1565b50565b60006117fb611da0565b905061180681611daf565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000611859611da0565b9050806001600160a01b0316836001600160a01b031614156118c2576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610f9a8261220f565b600061195b82611d5a565b15611991576000828152600460205260409020546001600160a01b031615611984576001611987565b60005b60ff169050610f9d565b50600081815260036020526040902054610f9d565b6119b16113b4611da0565b8483811480156119c057508082145b611a11576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461149157858582818110611a2757fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611a5257fe5b905060200201356001600160a01b0316878786818110611a6e57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611acb57600080fd5b505af1158015611adf573d6000803e3d6000fd5b50505050806001019050611a14565b6000611af982611d5a565b611b42576040805162461bcd60e51b8152602060048201526015602482015274125b9d995b9d1bdc9e4e881b9bdd08185b88139195605a1b604482015290519081900360640190fd5b610f9a826129b4565b611b566113b4611da0565b6117ee81612a0d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611b97611da0565b90506001600160a01b038516611bf4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611bfe86826121c1565b611c3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b611c468461220f565b15611c5c57611c5786868686612b41565b611c78565b611c6584611d5a565b1561105d57611c57868686866000612c57565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611ce7856001600160a01b0316612d7d565b15611cf957611cf98686868686612d83565b505050505050565b611d0c6113b4611da0565b600080546001600160a01b0319166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000600160ff1b821615801590610f9a5750506001600160e01b0316151590565b60006001600160e01b0319821663921ed8d160e01b1480610f9a5750610f9a82612ef4565b6000611daa612f78565b905090565b6001600160a01b03811660009081526007602052604090205460ff166117ee576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611e71576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b825182518114611eb6576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008060005b838114611fa8576000878281518110611ed157fe5b602002602001015190506000878381518110611ee957fe5b60200260200101519050611efc8261220f565b15611f1157611f0c8a83836130d8565b611f9e565b611f1a82611d5a565b1561105d57611f2c8a838360016131c2565b6000611f37836129b4565b905085611f4a5780955060019450611f9c565b858114611f955760008681526002602090815260408083206001600160a01b038f16845282528083208054890190559782526003905295909520805490940190935560019284611f9c565b8460010194505b505b5050600101611ebc565b508115611fe85760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000611ffc611da0565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561206c578181015183820152602001612054565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156120ab578181015183820152602001612093565b5050505090500194505050505060405180910390a46120d2876001600160a01b0316612d7d565b156120e5576120e56000888888886132e1565b50505050505050565b606060066120fb83613446565b60405160200180838054600181600116156101000203166002900480156121595780601f10612137576101008083540402835291820191612159565b820191906000526020600020905b815481529060010190602001808311612145575b5050825160208401908083835b602083106121855780518252601f199092019160209182019101612166565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061220857506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b600160ff1b161590565b80612263576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0387168452909152902054818110156122db576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b8160011461236c576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b038581169116146123d5576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b600083815260046020526040902061dead60f01b905580610fbe5760006123fb846129b4565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b03841661249b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b8251825181146124e0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60006124ea611da0565b90506124f687826121c1565b612535576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146125fd57600088828151811061255057fe5b60200260200101519050600088838151811061256857fe5b6020026020010151905061257b8261220f565b156125915761258c8c8c8484612b41565b6125f3565b61259a82611d5a565b1561105d576125ad8c8c84846001612c57565b60006125b8836129b4565b9050856125cb57809550600194506125f1565b8581146125ea576125de8d8d8888613521565b809550600194506125f1565b8460010194505b505b505060010161253b565b5081156126105761261089898484613521565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561269557818101518382015260200161267d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126d45781810151838201526020016126bc565b5050505090500194505050505060405180910390a46126fb886001600160a01b0316612d7d565b1561270d5761270d89898989896132e1565b505050505050505050565b600061272382611d5a565b15612775576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166127e6576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b6127ef8361220f565b15612804576127ff8484846130d8565b61281f565b61280d83611d5a565b1561105d576127ff84848460006131c2565b6001600160a01b0384166000612833611da0565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a461288d846001600160a01b0316612d7d565b15610fbe57610fbe600085858585612d83565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50516001600160a01b038281169116146117ee576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129af908490613575565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612a1681611d5a565b15612a68576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612ad2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612ada611da0565b600082815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055612b0f8161220f565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612b8b576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612c03576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461111b5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612ca9576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612d12576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061111b576000612d3c846129b4565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b63f23a6e6160e01b6001600160a01b03851663f23a6e61612da2611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578181015183820152602001612e04565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b505050506040513d6020811015612e9657600080fd5b50516001600160e01b0319161461111b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982166301ffc9a760e01b1480612f2557506001600160e01b03198216636cdb3d1360e11b145b80612f4057506001600160e01b031982166303a24d0760e21b145b80612f5b57506001600160e01b031982166304e72e2360e11b145b80610f9a5750506001600160e01b03191663bd85b03960e01b1490565b60003381612f84613758565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480612ff757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156130055791506117d79050565b6001600160a01b03821632148015906130c457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d60208110156130c157600080fd5b50515b156130d25791506117d79050565b50905090565b80613122576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b600082815260036020526040902054818101818111613188576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b81600114613214576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b60008381526004602052604090205415613275576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610fbe57600061329f846129b4565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b63bc197c8160e01b6001600160a01b03851663bc197c81613300611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613379578181015183820152602001613361565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156133b85781810151838201526020016133a0565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156133f45781810151838201526020016133dc565b50505050905090810190601f1680156134215780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015612e6c57600080fd5b60608161346b57506040805180820190915260018152600360fc1b6020820152610f9d565b8160005b811561348357600101600a8204915061346f565b60008167ffffffffffffffff8111801561349c57600080fd5b506040519080825280601f01601f1916602001820160405280156134c7576020820181803683370190505b50859350905060001982015b831561351857600a840660300160f81b828280600190039350815181106134f657fe5b60200101906001600160f81b031916908160001a905350600a840493506134d3565b50949350505050565b826001600160a01b0316846001600160a01b031614610fbe5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816135886001600160a01b038216612d7d565b6135d9576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106136165780518252601f1990920191602091820191016135f7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081156136fc578051156136f7578080602001905160208110156136a457600080fd5b50516136f7576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61111b565b805161374f576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261379a57600085556137e0565b82601f106137b35782800160ff198235161785556137e0565b828001600101855582156137e0579182015b828111156137e05782358255916020019190600101906137c5565b506137ec9291506137f0565b5090565b5b808211156137ec57600081556001016137f156fe496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000496e76656e746f72793a20696e636f6e73697374656e74206172726179730000a26469706673582212208f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e209064736f6c63430007060033000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d70578063e985e9c514610d8d578063f242432a14610dbb578063f2fde38b14610e84576101c3565b8063bd85b03914610c28578063c3666c3614610c45578063c7778baa14610d53576101c3565b806398650275116100d35780639865027514610baf578063a22cb46514610bb7578063aa271e1a14610be5578063adebf6f214610c0b576101c3565b80638053493414610a4e5780638da5cb5b14610b81578063983b2d5614610b89576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146107f55780636352211e146108b557806373c8a958146108d25780637e518ec8146109e0576101c3565b8063510b51581461078e578063572b6c05146107c75780635b2bd79e146107ed576101c3565b80630e89341c116101a25780630e89341c146103fb578063124d91e51461048d5780632eb2c2d6146104bf5780634e1273f414610680576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610eaa565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f75565b604080519115158252519081900360200190f35b6103f96004803603608081101561025757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460208302840111600160201b831117156102b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038557600080fd5b82018360208201111561039757600080fd5b803590602001918460018302840111600160201b831117156103b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fa2945050505050565b005b6104186004803603602081101561041157600080fd5b5035610fc4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045257818101518382015260200161043a565b50505050905090810190601f16801561047f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360608110156104a357600080fd5b506001600160a01b038135169060208101359060400135610fcf565b6103f9600480360360a08110156104d557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460208302840111600160201b8311171561053b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058a57600080fd5b82018360208201111561059c57600080fd5b803590602001918460208302840111600160201b831117156105bd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460018302840111600160201b8311171561063f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061110e945050505050565b61073e6004803603604081101561069657600080fd5b810190602081018135600160201b8111156106b057600080fd5b8201836020820111156106c257600080fd5b803590602001918460208302840111600160201b831117156106e357600080fd5b919390929091602081019035600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460208302840111600160201b8311171561073357600080fd5b509092509050611122565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561077a578181015183820152602001610762565b505050509050019250505060405180910390f35b6107ab600480360360208110156107a457600080fd5b5035611216565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107dd57600080fd5b50356001600160a01b0316611221565b61041861129a565b6103f96004803603608081101561080b57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561084157600080fd5b82018360208201111561085357600080fd5b803590602001918460018302840111600160201b8311171561087457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611328945050505050565b6107ab600480360360208110156108cb57600080fd5b503561133f565b6103f9600480360360608110156108e857600080fd5b810190602081018135600160201b81111561090257600080fd5b82018360208201111561091457600080fd5b803590602001918460208302840111600160201b8311171561093557600080fd5b919390929091602081019035600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460208302840111600160201b8311171561098557600080fd5b919390929091602081019035600160201b8111156109a257600080fd5b8201836020820111156109b457600080fd5b803590602001918460208302840111600160201b831117156109d557600080fd5b5090925090506113a9565b6103f9600480360360208110156109f657600080fd5b810190602081018135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b50909250905061149b565b6103f960048036036060811015610a6457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a8e57600080fd5b820183602082011115610aa057600080fd5b803590602001918460208302840111600160201b83111715610ac157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611517945050505050565b6107ab6117ca565b6103f960048036036020811015610b9f57600080fd5b50356001600160a01b03166117da565b6103f96117f1565b6103f960048036036040811015610bcd57600080fd5b506001600160a01b038135169060200135151561184f565b61022d60048036036020811015610bfb57600080fd5b50356001600160a01b0316611930565b61022d60048036036020811015610c2157600080fd5b5035611945565b6101f460048036036020811015610c3e57600080fd5b5035611950565b6103f960048036036060811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b919390929091602081019035600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460208302840111600160201b83111715610cf857600080fd5b919390929091602081019035600160201b811115610d1557600080fd5b820183602082011115610d2757600080fd5b803590602001918460208302840111600160201b83111715610d4857600080fd5b5090925090506119a6565b6101f460048036036020811015610d6957600080fd5b5035611aee565b6103f960048036036020811015610d8657600080fd5b5035611b4b565b61022d60048036036040811015610da357600080fd5b506001600160a01b0381358116916020013516611b5f565b6103f9600480360360a0811015610dd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e1057600080fd5b820183602082011115610e2257600080fd5b803590602001918460018302840111600160201b83111715610e4357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b6103f960048036036020811015610e9a57600080fd5b50356001600160a01b0316611d01565b60006001600160a01b038316610f07576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f1082611d5a565b15610f4a576000828152600460205260409020546001600160a01b03848116911614610f3d576000610f40565b60015b60ff169050610f6f565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216630a216a2b60e31b1480610f9a5750610f9a82611d7b565b90505b919050565b610fb2610fad611da0565b611daf565b610fbe84848484611e1c565b50505050565b6060610f9a826120ee565b6000610fd9611da0565b9050610fe584826121c1565b611024576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b61102d8361220f565b156110425761103d848484612219565b6110aa565b61104b83611d5a565b1561105d5761103d848484600061231a565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61111b8585858585612440565b5050505050565b6060838214611166576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008467ffffffffffffffff8111801561117f57600080fd5b506040519080825280602002602001820160405280156111a9578160200160208202803683370190505b50905060005b80861461120c576111ed8787838181106111c557fe5b905060200201356001600160a01b03168686848181106111e157fe5b90506020020135610eaa565b8282815181106111f957fe5b60209081029190910101526001016111af565b5095945050505050565b6000610f9a82612718565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f9a57507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b505050505081565b611333610fad611da0565b610fbe84848484612791565b6000818152600460205260408120546001600160a01b038116610f9a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b6113b96113b4611da0565b6128a0565b8483811480156113c857508082145b611419576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114915761148988888381811061143257fe5b905060200201356001600160a01b031685858481811061144e57fe5b9050602002013588888581811061146157fe5b905060200201356001600160a01b03166001600160a01b031661295d9092919063ffffffff16565b60010161141c565b5050505050505050565b6114a66113b4611da0565b6114b260068383613764565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b81518151811461155c576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b6000611566611da0565b905061157285826121c1565b6115b1576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146116a55760008782815181106115cc57fe5b6020026020010151905060008783815181106115e457fe5b602002602001015190506115f78261220f565b1561160c576116078a8383612219565b61169b565b61161582611d5a565b1561105d576116278a8383600161231a565b6000611632836129b4565b9050856116455780955060019450611699565b8581146116925760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611699565b8460010194505b505b50506001016115b7565b5081156116e75760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561176d578181015183820152602001611755565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117ac578181015183820152602001611794565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b6117e56113b4611da0565b6117ee816129c1565b50565b60006117fb611da0565b905061180681611daf565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000611859611da0565b9050806001600160a01b0316836001600160a01b031614156118c2576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610f9a8261220f565b600061195b82611d5a565b15611991576000828152600460205260409020546001600160a01b031615611984576001611987565b60005b60ff169050610f9d565b50600081815260036020526040902054610f9d565b6119b16113b4611da0565b8483811480156119c057508082145b611a11576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461149157858582818110611a2757fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611a5257fe5b905060200201356001600160a01b0316878786818110611a6e57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611acb57600080fd5b505af1158015611adf573d6000803e3d6000fd5b50505050806001019050611a14565b6000611af982611d5a565b611b42576040805162461bcd60e51b8152602060048201526015602482015274125b9d995b9d1bdc9e4e881b9bdd08185b88139195605a1b604482015290519081900360640190fd5b610f9a826129b4565b611b566113b4611da0565b6117ee81612a0d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611b97611da0565b90506001600160a01b038516611bf4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611bfe86826121c1565b611c3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b611c468461220f565b15611c5c57611c5786868686612b41565b611c78565b611c6584611d5a565b1561105d57611c57868686866000612c57565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611ce7856001600160a01b0316612d7d565b15611cf957611cf98686868686612d83565b505050505050565b611d0c6113b4611da0565b600080546001600160a01b0319166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000600160ff1b821615801590610f9a5750506001600160e01b0316151590565b60006001600160e01b0319821663921ed8d160e01b1480610f9a5750610f9a82612ef4565b6000611daa612f78565b905090565b6001600160a01b03811660009081526007602052604090205460ff166117ee576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611e71576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b825182518114611eb6576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008060005b838114611fa8576000878281518110611ed157fe5b602002602001015190506000878381518110611ee957fe5b60200260200101519050611efc8261220f565b15611f1157611f0c8a83836130d8565b611f9e565b611f1a82611d5a565b1561105d57611f2c8a838360016131c2565b6000611f37836129b4565b905085611f4a5780955060019450611f9c565b858114611f955760008681526002602090815260408083206001600160a01b038f16845282528083208054890190559782526003905295909520805490940190935560019284611f9c565b8460010194505b505b5050600101611ebc565b508115611fe85760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000611ffc611da0565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561206c578181015183820152602001612054565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156120ab578181015183820152602001612093565b5050505090500194505050505060405180910390a46120d2876001600160a01b0316612d7d565b156120e5576120e56000888888886132e1565b50505050505050565b606060066120fb83613446565b60405160200180838054600181600116156101000203166002900480156121595780601f10612137576101008083540402835291820191612159565b820191906000526020600020905b815481529060010190602001808311612145575b5050825160208401908083835b602083106121855780518252601f199092019160209182019101612166565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061220857506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b600160ff1b161590565b80612263576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0387168452909152902054818110156122db576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b8160011461236c576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b038581169116146123d5576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b600083815260046020526040902061dead60f01b905580610fbe5760006123fb846129b4565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b03841661249b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b8251825181146124e0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60006124ea611da0565b90506124f687826121c1565b612535576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146125fd57600088828151811061255057fe5b60200260200101519050600088838151811061256857fe5b6020026020010151905061257b8261220f565b156125915761258c8c8c8484612b41565b6125f3565b61259a82611d5a565b1561105d576125ad8c8c84846001612c57565b60006125b8836129b4565b9050856125cb57809550600194506125f1565b8581146125ea576125de8d8d8888613521565b809550600194506125f1565b8460010194505b505b505060010161253b565b5081156126105761261089898484613521565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561269557818101518382015260200161267d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126d45781810151838201526020016126bc565b5050505090500194505050505060405180910390a46126fb886001600160a01b0316612d7d565b1561270d5761270d89898989896132e1565b505050505050505050565b600061272382611d5a565b15612775576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166127e6576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b6127ef8361220f565b15612804576127ff8484846130d8565b61281f565b61280d83611d5a565b1561105d576127ff84848460006131c2565b6001600160a01b0384166000612833611da0565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a461288d846001600160a01b0316612d7d565b15610fbe57610fbe600085858585612d83565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50516001600160a01b038281169116146117ee576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129af908490613575565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612a1681611d5a565b15612a68576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612ad2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612ada611da0565b600082815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055612b0f8161220f565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612b8b576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612c03576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461111b5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612ca9576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612d12576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061111b576000612d3c846129b4565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b63f23a6e6160e01b6001600160a01b03851663f23a6e61612da2611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578181015183820152602001612e04565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b505050506040513d6020811015612e9657600080fd5b50516001600160e01b0319161461111b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982166301ffc9a760e01b1480612f2557506001600160e01b03198216636cdb3d1360e11b145b80612f4057506001600160e01b031982166303a24d0760e21b145b80612f5b57506001600160e01b031982166304e72e2360e11b145b80610f9a5750506001600160e01b03191663bd85b03960e01b1490565b60003381612f84613758565b90507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b03161480612ff757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156130055791506117d79050565b6001600160a01b03821632148015906130c457507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d60208110156130c157600080fd5b50515b156130d25791506117d79050565b50905090565b80613122576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b600082815260036020526040902054818101818111613188576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b81600114613214576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b60008381526004602052604090205415613275576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610fbe57600061329f846129b4565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b63bc197c8160e01b6001600160a01b03851663bc197c81613300611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613379578181015183820152602001613361565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156133b85781810151838201526020016133a0565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156133f45781810151838201526020016133dc565b50505050905090810190601f1680156134215780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015612e6c57600080fd5b60608161346b57506040805180820190915260018152600360fc1b6020820152610f9d565b8160005b811561348357600101600a8204915061346f565b60008167ffffffffffffffff8111801561349c57600080fd5b506040519080825280601f01601f1916602001820160405280156134c7576020820181803683370190505b50859350905060001982015b831561351857600a840660300160f81b828280600190039350815181106134f657fe5b60200101906001600160f81b031916908160001a905350600a840493506134d3565b50949350505050565b826001600160a01b0316846001600160a01b031614610fbe5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816135886001600160a01b038216612d7d565b6135d9576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106136165780518252601f1990920191602091820191016135f7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081156136fc578051156136f7578080602001905160208110156136a457600080fd5b50516136f7576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61111b565b805161374f576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261379a57600085556137e0565b82601f106137b35782800160ff198235161785556137e0565b828001600101855582156137e0579182015b828111156137e05782358255916020019190600101906137c5565b506137ec9291506137f0565b5090565b5b808211156137ec57600081556001016137f156fe496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000496e76656e746f72793a20696e636f6e73697374656e74206172726179730000a26469706673582212208f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e209064736f6c63430007060033
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
65689:3427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38761:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38761:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;66278:214;;;;;;;;;;;;;;;;-1:-1:-1;66278:214:0;-1:-1:-1;;;;;;66278:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68336:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0:i;:::-;;66672:114;;;;;;;;;;;;;;;;-1:-1:-1;66672:114:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55427:572;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55427:572:0;;;;;;;;;;;;;:::i;46435:329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0:i;39136:445::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;-1:-1:-1;39136:445:0;;-1:-1:-1;39136:445:0;-1:-1:-1;39136:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66971:128;;;;;;;;;;;;;;;;-1:-1:-1;66971:128:0;;:::i;:::-;;;;-1:-1:-1;;;;;66971:128:0;;;;;;;;;;;;;;12643:195;;;;;;;;;;;;;;;;-1:-1:-1;12643:195:0;-1:-1:-1;;;;;12643:195:0;;:::i;63611:29::-;;;:::i;67997:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67997:231:0;;-1:-1:-1;67997:231:0;;-1:-1:-1;;;;;67997:231:0:i;40740:239::-;;;;;;;;;;;;;;;;-1:-1:-1;40740:239:0;;:::i;8738:492::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;-1:-1:-1;8738:492:0;;-1:-1:-1;8738:492:0;-1:-1:-1;8738:492:0;:::i;63649:218::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63649:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63649:218:0;;;;;;;;;;-1:-1:-1;63649:218:0;;-1:-1:-1;63649:218:0;-1:-1:-1;63649:218:0;:::i;56054:1804::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56054:1804:0;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56054:1804:0;;;;;;;;-1:-1:-1;56054:1804:0;;-1:-1:-1;;;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56054:1804:0;;-1:-1:-1;56054:1804:0;;-1:-1:-1;;;;;56054:1804:0:i;3093:96::-;;;:::i;64776:123::-;;;;;;;;;;;;;;;;-1:-1:-1;64776:123:0;-1:-1:-1;;;;;64776:123:0;;:::i;65020:190::-;;;:::i;39619:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39619:306:0;;;;;;;;;;:::i;64407:40::-;;;;;;;;;;;;;;;;-1:-1:-1;64407:40:0;-1:-1:-1;;;;;64407:40:0;;:::i;40307:124::-;;;;;;;;;;;;;;;;-1:-1:-1;40307:124:0;;:::i;41168:267::-;;;;;;;;;;;;;;;;-1:-1:-1;41168:267:0;;:::i;10056:522::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;-1:-1:-1;10056:522:0;;-1:-1:-1;10056:522:0;-1:-1:-1;10056:522:0;:::i;40478:215::-;;;;;;;;;;;;;;;;-1:-1:-1;40478:215:0;;:::i;67609:149::-;;;;;;;;;;;;;;;;-1:-1:-1;67609:149:0;;:::i;39963:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39963:166:0;;;;;;;;;;:::i;45577:811::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45577:811:0;;-1:-1:-1;45577:811:0;;-1:-1:-1;;;;;45577:811:0:i;3436:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3436:201:0;-1:-1:-1;;;;;3436:201:0;;:::i;38761:328::-;38845:7;-1:-1:-1;;;;;38873:19:0;;38865:55;;;;;-1:-1:-1;;;38865:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38937:23;:2;:21;:23::i;:::-;38933:109;;;39000:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;38984:38:0;;;;;;:46;;39029:1;38984:46;;;39025:1;38984:46;38977:53;;;;;;38933:109;-1:-1:-1;39061:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39061:20:0;;;;;;;;;;38761:328;;;;;:::o;66278:214::-;66363:4;-1:-1:-1;;;;;;66387:57:0;;-1:-1:-1;;;66387:57:0;;:97;;;66448:36;66472:11;66448:23;:36::i;:::-;66380:104;;66278:214;;;;:::o;68336:263::-;68515:28;68530:12;:10;:12::i;:::-;68515:14;:28::i;:::-;68554:37;68569:2;68573:3;68578:6;68586:4;68554:14;:37::i;:::-;68336:263;;;;:::o;66672:114::-;66737:13;66770:8;66775:2;66770:4;:8::i;55427:572::-;55555:14;55572:12;:10;:12::i;:::-;55555:29;;55603:27;55617:4;55623:6;55603:13;:27::i;:::-;55595:70;;;;;-1:-1:-1;;;55595:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55595:70:0;;;;;;;;;;;;;;;55682:20;:2;:18;:20::i;:::-;55678:245;;;55719:30;55733:4;55739:2;55743:5;55719:13;:30::i;:::-;55678:245;;;55771:23;:2;:21;:23::i;:::-;55767:156;;;55811:32;55820:4;55826:2;55830:5;55837;55811:8;:32::i;55767:156::-;55876:35;;;-1:-1:-1;;;55876:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55767:156;55977:1;-1:-1:-1;;;;;55940:51:0;55963:4;-1:-1:-1;;;;;55940:51:0;55955:6;-1:-1:-1;;;;;55940:51:0;;55981:2;55985:5;55940:51;;;;;;;;;;;;;;;;;;;;;;;;55427:572;;;;:::o;46435:329::-;46705:51;46728:4;46734:2;46738:3;46743:6;46751:4;46705:22;:51::i;:::-;46435:329;;;;;:::o;39136:445::-;39251:16;39288:27;;;39280:70;;;;;-1:-1:-1;;;39280:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39280:70:0;;;;;;;;;;;;;;;39363:25;39405:6;39391:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39391:28:0;;39363:56;;39437:9;39432:114;39452:18;;;39432:114;;39506:28;39516:6;;39523:1;39516:9;;;;;;;;;;;;;-1:-1:-1;;;;;39516:9:0;39527:3;;39531:1;39527:6;;;;;;;;;;;;;39506:9;:28::i;:::-;39492:8;39501:1;39492:11;;;;;;;;;;;;;;;;;:42;39472:3;;39432:114;;;-1:-1:-1;39565:8:0;39136:445;-1:-1:-1;;;;;39136:445:0:o;66971:128::-;67042:7;67069:22;67078:12;67069:8;:22::i;12643:195::-;12730:4;12767:19;-1:-1:-1;;;;;12754:32:0;:9;-1:-1:-1;;;;;12754:32:0;;:76;;;;12811:18;-1:-1:-1;;;;;12790:40:0;:9;-1:-1:-1;;;;;12790:40:0;;12747:83;;12643:195;;;:::o;63611:29::-;;;;;;;;;;;;;;;-1:-1:-1;;63611:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67997:231::-;68151:28;68166:12;:10;:12::i;68151:28::-;68190:30;68200:2;68204;68208:5;68215:4;68190:9;:30::i;40740:239::-;40810:7;40862:14;;;:7;:14;;;;;;-1:-1:-1;;;;;40897:19:0;;40889:59;;;;;-1:-1:-1;;;40889:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8738:492;8907:31;8925:12;:10;:12::i;:::-;8907:17;:31::i;:::-;8966:8;9000:23;;;:51;;;;-1:-1:-1;9027:24:0;;;9000:51;8992:90;;;;;-1:-1:-1;;;8992:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9098:9;9093:130;9118:6;9113:1;:11;9093:130;;9146:65;9187:8;;9196:1;9187:11;;;;;;;;;;;;;-1:-1:-1;;;;;9187:11:0;9200:7;;9208:1;9200:10;;;;;;;;;;;;;9160:6;;9167:1;9160:9;;;;;;;;;;;;;-1:-1:-1;;;;;9160:9:0;-1:-1:-1;;;;;9146:40:0;;;:65;;;;;:::i;:::-;9126:3;;9093:130;;;;8738:492;;;;;;;:::o;63649:218::-;63731:31;63749:12;:10;:12::i;63731:31::-;63773:34;:15;63791:16;;63773:34;:::i;:::-;;63823:36;63842:16;;63823:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63823:36:0;;;;;;;;-1:-1:-1;63823:36:0;;-1:-1:-1;;;;63823:36:0;63649:218;;:::o;56054:1804::-;56224:10;;56263:13;;56253:23;;56245:66;;;;;-1:-1:-1;;;56245:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56245:66:0;;;;;;;;;;;;;;;56324:14;56341:12;:10;:12::i;:::-;56324:29;;56372:27;56386:4;56392:6;56372:13;:27::i;:::-;56364:70;;;;;-1:-1:-1;;;56364:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56364:70:0;;;;;;;;;;;;;;;56447:22;56480:25;56521:9;56516:1088;56537:6;56532:1;:11;56516:1088;;56565:10;56578:3;56582:1;56578:6;;;;;;;;;;;;;;56565:19;;56599:13;56615:6;56622:1;56615:9;;;;;;;;;;;;;;56599:25;;56643:20;:2;:18;:20::i;:::-;56639:954;;;56684:30;56698:4;56704:2;56708:5;56684:13;:30::i;:::-;56639:954;;;56740:23;:2;:21;:23::i;:::-;56736:857;;;56784:31;56793:4;56799:2;56803:5;56810:4;56784:8;:31::i;:::-;56834:24;56861:29;:2;:27;:29::i;:::-;56834:56;-1:-1:-1;56913:19:0;56909:593;;56974:16;56957:33;;57033:1;57013:21;;56909:593;;;57107:14;57087:16;:34;57083:400;;57150:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57150:31:0;;;;;;;;;:52;;;;;;;57229:25;;;:9;:25;;;;;;:46;;;;;;;;;-1:-1:-1;;57319:16:0;57083:400;;;57440:19;;;;;57083:400;56736:857;;-1:-1:-1;;56545:3:0;;56516:1088;;;-1:-1:-1;57620:19:0;;57616:165;;57656:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57656:31:0;;;;;;;;;:52;;;;;;;57723:25;;;:9;:25;;;;;:46;;;;;;;57616:165;57834:1;-1:-1:-1;;;;;57798:52:0;57820:4;-1:-1:-1;;;;;57798:52:0;57812:6;-1:-1:-1;;;;;57798:52:0;;57838:3;57843:6;57798:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56054:1804;;;;;;;:::o;3093:96::-;3148:7;3175:6;-1:-1:-1;;;;;3175:6:0;3093:96;;:::o;64776:123::-;64830:31;64848:12;:10;:12::i;64830:31::-;64872:19;64883:7;64872:10;:19::i;:::-;64776:123;:::o;65020:190::-;65064:15;65082:12;:10;:12::i;:::-;65064:30;;65105:23;65120:7;65105:14;:23::i;:::-;-1:-1:-1;;;;;65139:17:0;;65159:5;65139:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;65139:25:0;;;65180:22;;;65159:5;65180:22;65020:190;:::o;39619:306::-;39714:14;39731:12;:10;:12::i;:::-;39714:29;;39774:6;-1:-1:-1;;;;;39762:18:0;:8;-1:-1:-1;;;;;39762:18:0;;;39754:55;;;;;-1:-1:-1;;;39754:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39820:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;39820:39:0;;;;;;;;;;39875:42;;;;;;;;;;;;;;;;;39619:306;;;:::o;64407:40::-;;;;;;;;;;;;;;;:::o;40307:124::-;40379:4;40403:20;:2;:18;:20::i;41168:267::-;41241:7;41265:23;:2;:21;:23::i;:::-;41261:167;;;41353:1;41328:11;;;:7;:11;;;;;;-1:-1:-1;;;;;41312:43:0;;:51;;41362:1;41312:51;;;41358:1;41312:51;41305:58;;;;;;41261:167;-1:-1:-1;41403:13:0;;;;:9;:13;;;;;;41396:20;;10056:522;10230:31;10248:12;:10;:12::i;10230:31::-;10289:8;10323:26;;;:55;;;;-1:-1:-1;10353:25:0;;;10323:55;10315:94;;;;;-1:-1:-1;;;10315:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10425:9;10420:151;10445:6;10440:1;:11;10420:151;;10492:9;;10502:1;10492:12;;;;;;;;;;;;;-1:-1:-1;;;;;10492:12:0;-1:-1:-1;;;;;10473:45:0;;10527:4;10534:8;;10543:1;10534:11;;;;;;;;;;;;;-1:-1:-1;;;;;10534:11:0;10547:8;;10556:1;10547:11;;;;;;;;;;;;;10473:86;;;;;;;;;;;;;-1:-1:-1;;;;;10473:86:0;;;;;;-1:-1:-1;;;;;10473:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10453:3;;;;;10420:151;;40478:215;40555:7;40583:26;:5;:24;:26::i;:::-;40575:60;;;;;-1:-1:-1;;;40575:60:0;;;;;;;;;;;;-1:-1:-1;;;40575:60:0;;;;;;;;;;;;;;;40653:32;:5;:30;:32::i;67609:149::-;67677:31;67695:12;:10;:12::i;67677:31::-;67719;67737:12;67719:17;:31::i;39963:166::-;-1:-1:-1;;;;;40089:22:0;;;40065:4;40089:22;;;:10;:22;;;;;;;;:32;;;;;;;;;;;;;;;39963:166::o;45577:811::-;45762:14;45779:12;:10;:12::i;:::-;45762:29;-1:-1:-1;;;;;;45810:16:0;;45802:56;;;;;-1:-1:-1;;;45802:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45877:27;45891:4;45897:6;45877:13;:27::i;:::-;45869:70;;;;;-1:-1:-1;;;45869:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45869:70:0;;;;;;;;;;;;;;;45956:20;:2;:18;:20::i;:::-;45952:261;;;45993:38;46011:4;46017:2;46021;46025:5;45993:17;:38::i;:::-;45952:261;;;46053:23;:2;:21;:23::i;:::-;46049:164;;;46093:40;46106:4;46112:2;46116;46120:5;46127;46093:12;:40::i;46049:164::-;46259:2;-1:-1:-1;;;;;46230:43:0;46253:4;-1:-1:-1;;;;;46230:43:0;46245:6;-1:-1:-1;;;;;46230:43:0;;46263:2;46267:5;46230:43;;;;;;;;;;;;;;;;;;;;;;;;46288:15;:2;-1:-1:-1;;;;;46288:13:0;;:15::i;:::-;46284:97;;;46320:49;46343:4;46349:2;46353;46357:5;46364:4;46320:22;:49::i;:::-;45577:811;;;;;;:::o;3436:201::-;3516:31;3534:12;:10;:12::i;3516:31::-;3558:6;:17;;-1:-1:-1;;;;;;3558:17:0;-1:-1:-1;;;;;3558:17:0;;;;;;;;;3591:38;;3558:17;;3612:6;;;3591:38;;3558:6;3591:38;3436:201;:::o;17841:140::-;17904:4;-1:-1:-1;;;17928:12:0;;:17;;;;:45;;-1:-1:-1;;;;;;;17949:19:0;:24;;;17841:140::o;55026:215::-;55111:4;-1:-1:-1;;;;;;55135:58:0;;-1:-1:-1;;;55135:58:0;;:98;;;55197:36;55221:11;55197:23;:36::i;68738:185::-;68843:15;68878:37;:35;:37::i;:::-;68871:44;;68738:185;:::o;65218:128::-;-1:-1:-1;;;;;65292:17:0;;;;;;:8;:17;;;;;;;;65284:54;;;;;-1:-1:-1;;;65284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49500:1880;-1:-1:-1;;;;;49681:16:0;;49673:52;;;;;-1:-1:-1;;;49673:52:0;;;;;;;;;;;;-1:-1:-1;;;49673:52:0;;;;;;;;;;;;;;;49753:10;;49792:13;;49782:23;;49774:66;;;;;-1:-1:-1;;;49774:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;49774:66:0;;;;;;;;;;;;;;;49853:22;49886:25;49927:9;49922:1082;49943:6;49938:1;:11;49922:1082;;49971:10;49984:3;49988:1;49984:6;;;;;;;;;;;;;;49971:19;;50005:13;50021:6;50028:1;50021:9;;;;;;;;;;;;;;50005:25;;50049:20;:2;:18;:20::i;:::-;50045:948;;;50090:28;50104:2;50108;50112:5;50090:13;:28::i;:::-;50045:948;;;50144:23;:2;:21;:23::i;:::-;50140:853;;;50188:29;50197:2;50201;50205:5;50212:4;50188:8;:29::i;:::-;50236:24;50263:29;:2;:27;:29::i;:::-;50236:56;-1:-1:-1;50315:19:0;50311:591;;50376:16;50359:33;;50435:1;50415:21;;50311:591;;;50509:14;50489:16;:34;50485:398;;50552:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50552:29:0;;;;;;;;;:50;;;;;;50629:25;;;:9;:25;;;;;;:46;;;;;;;;-1:-1:-1;;50719:16:0;50485:398;;;50840:19;;;;;50485:398;50140:853;;-1:-1:-1;;49951:3:0;;49922:1082;;;-1:-1:-1;51020:19:0;;51016:163;;51056:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;51056:29:0;;;;;;;;;:50;;;;;;51121:25;;;:9;:25;;;;;:46;;;;;;51016:163;-1:-1:-1;;;;;51196:56:0;;51232:1;51210:12;:10;:12::i;:::-;-1:-1:-1;;;;;51196:56:0;;51240:3;51245:6;51196:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51267:15;:2;-1:-1:-1;;;;;51267:13:0;;:15::i;:::-;51263:110;;;51299:62;51335:1;51339:2;51343:3;51348:6;51356:4;51299:27;:62::i;:::-;49500:1880;;;;;;;:::o;63875:161::-;63932:13;63989:15;64006:20;:2;:18;:20::i;:::-;63972:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63972:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63972:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63958:70;;63875:161;;;:::o;42926:160::-;43010:4;43043:6;-1:-1:-1;;;;;43035:14:0;:4;-1:-1:-1;;;;;43035:14:0;;43034:44;;;-1:-1:-1;;;;;;43054:16:0;;;;;;;:10;:16;;;;;;;;:24;;;;;;;;;;;;43034:44;43027:51;42926:160;-1:-1:-1;;;42926:160:0:o;17724:109::-;-1:-1:-1;;;17808:12:0;:17;;17724:109::o;57997:397::-;58123:10;58115:44;;;;;-1:-1:-1;;;58115:44:0;;;;;;;;;;;;-1:-1:-1;;;58115:44:0;;;;;;;;;;;;;;;58170:15;58188:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58188:19:0;;;;;;;;;;58226:16;;;;58218:58;;;;;-1:-1:-1;;;58218:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58287:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58287:19:0;;;;;;;;;;;58309:15;;;;58287:37;;;58364:13;;;:9;:13;;;;;:22;;;;;;;;57997:397::o;58402:618::-;58546:5;58555:1;58546:10;58538:49;;;;;-1:-1:-1;;;58538:49:0;;;;;;;;;;;;-1:-1:-1;;;58538:49:0;;;;;;;;;;;;;;;58630:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;58606:37:0;;;;;;58598:74;;;;;-1:-1:-1;;;58598:74:0;;;;;;;;;;;;-1:-1:-1;;;58598:74:0;;;;;;;;;;;;;;;58683:11;;;;:7;:11;;;;;-1:-1:-1;;;58683:30:0;;58731:7;58726:287;;58755:20;58778:29;:2;:27;:29::i;:::-;58899:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;58899:29:0;;;;;;;;;58897:31;;-1:-1:-1;;58897:31:0;;;;;;58978:23;;;:9;:23;;;;;58976:25;;;;;;;-1:-1:-1;58402:618:0;;;;:::o;46903:1942::-;-1:-1:-1;;;;;47107:16:0;;47099:56;;;;;-1:-1:-1;;;47099:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47183:10;;47222:13;;47212:23;;47204:66;;;;;-1:-1:-1;;;47204:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47204:66:0;;;;;;;;;;;;;;;47281:14;47298:12;:10;:12::i;:::-;47281:29;;47329:27;47343:4;47349:6;47329:13;:27::i;:::-;47321:70;;;;;-1:-1:-1;;;47321:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47321:70:0;;;;;;;;;;;;;;;47404:22;47437:25;47478:9;47473:1052;47494:6;47489:1;:11;47473:1052;;47522:10;47535:3;47539:1;47535:6;;;;;;;;;;;;;;47522:19;;47556:13;47572:6;47579:1;47572:9;;;;;;;;;;;;;;47556:25;;47600:20;:2;:18;:20::i;:::-;47596:918;;;47641:38;47659:4;47665:2;47669;47673:5;47641:17;:38::i;:::-;47596:918;;;47705:23;:2;:21;:23::i;:::-;47701:813;;;47749:39;47762:4;47768:2;47772;47776:5;47783:4;47749:12;:39::i;:::-;47807:24;47834:29;:2;:27;:29::i;:::-;47807:56;-1:-1:-1;47886:19:0;47882:541;;47947:16;47930:33;;48006:1;47986:21;;47882:541;;;48080:14;48060:16;:34;48056:348;;48123:73;48152:4;48158:2;48162:14;48178:17;48123:28;:73::i;:::-;48240:16;48223:33;;48303:1;48283:21;;48056:348;;;48361:19;;;;;48056:348;47701:813;;-1:-1:-1;;47502:3:0;;47473:1052;;;-1:-1:-1;48541:19:0;;48537:125;;48577:73;48606:4;48612:2;48616:14;48632:17;48577:28;:73::i;:::-;48707:2;-1:-1:-1;;;;;48679:44:0;48701:4;-1:-1:-1;;;;;48679:44:0;48693:6;-1:-1:-1;;;;;48679:44:0;;48711:3;48716:6;48679:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48738:15;:2;-1:-1:-1;;;;;48738:13:0;;:15::i;:::-;48734:104;;;48770:56;48798:4;48804:2;48808:3;48813:6;48821:4;48770:27;:56::i;:::-;46903:1942;;;;;;;;;:::o;42280:214::-;42351:7;42380:33;:12;:31;:33::i;:::-;42379:34;42371:74;;;;;-1:-1:-1;;;42371:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42463:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;42463:23:0;;42280:214::o;48853:639::-;-1:-1:-1;;;;;49001:16:0;;48993:52;;;;;-1:-1:-1;;;48993:52:0;;;;;;;;;;;;-1:-1:-1;;;48993:52:0;;;;;;;;;;;;;;;49062:20;:2;:18;:20::i;:::-;49058:241;;;49099:28;49113:2;49117;49121:5;49099:13;:28::i;:::-;49058:241;;;49149:23;:2;:21;:23::i;:::-;49145:154;;;49189:30;49198:2;49202;49206:5;49213;49189:8;:30::i;49145:154::-;-1:-1:-1;;;;;49316:55:0;;49353:1;49331:12;:10;:12::i;:::-;-1:-1:-1;;;;;49316:55:0;;49361:2;49365:5;49316:55;;;;;;;;;;;;;;;;;;;;;;;;49386:15;:2;-1:-1:-1;;;;;49386:13:0;;:15::i;:::-;49382:103;;;49418:55;49449:1;49453:2;49457;49461:5;49468:4;49418:22;:55::i;3768:138::-;3859:4;-1:-1:-1;;;;;3859:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3859:12:0;-1:-1:-1;;;;;3848:23:0;;;;;;3840:58;;;;;-1:-1:-1;;;3840:58:0;;;;;;;;;;;;-1:-1:-1;;;3840:58:0;;;;;;;;;;;;;;5731:229;5893:58;;;-1:-1:-1;;;;;5893:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5893:58:0;-1:-1:-1;;;5893:58:0;;;5858:94;;5886:5;;5858:27;:94::i;:::-;5731:229;;;:::o;17989:134::-;-1:-1:-1;;;;;;18088:27:0;;17989:134::o;65354:125::-;-1:-1:-1;;;;;65411:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;65411:24:0;65431:4;65411:24;;;65451:20;;;65411:17;65451:20;65354:125;:::o;41894:378::-;41980:33;:12;:31;:33::i;:::-;41979:34;41971:74;;;;;-1:-1:-1;;;41971:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42099:1;42064:23;;;:9;:23;;;;;;-1:-1:-1;;;;;42064:23:0;:37;42056:80;;;;;-1:-1:-1;;;42056:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42173:12;:10;:12::i;:::-;42147:23;;;;:9;:23;;;;;:38;;-1:-1:-1;;;;;;42147:38:0;-1:-1:-1;;;;;42147:38:0;;;;;;;;;;42233:30;42147:23;42233:28;:30::i;:::-;42201:63;;42219:12;42201:63;;;;;;;;;;41894:378;:::o;52729:501::-;52880:10;52872:44;;;;;-1:-1:-1;;;52872:44:0;;;;;;;;;;;;-1:-1:-1;;;52872:44:0;;;;;;;;;;;;;;;52927:15;52945:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52945:19:0;;;;;;;;;;52983:16;;;;52975:58;;;;;-1:-1:-1;;;52975:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53056:2;-1:-1:-1;;;;;53048:10:0;:4;-1:-1:-1;;;;;53048:10:0;;53044:179;;53075:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;53075:19:0;;;;;;;;;;;53097:15;;;;53075:37;;;53185:17;;;;;;;:26;;;;;;;52729:501::o;53238:679::-;53407:5;53416:1;53407:10;53399:49;;;;;-1:-1:-1;;;53399:49:0;;;;;;;;;;;;-1:-1:-1;;;53399:49:0;;;;;;;;;;;;;;;53491:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;53467:37:0;;;;;;53459:74;;;;;-1:-1:-1;;;53459:74:0;;;;;;;;;;;;-1:-1:-1;;;53459:74:0;;;;;;;;;;;;;;;53544:11;;;;:7;:11;;;;;-1:-1:-1;;;;;53558:20:0;;53544:34;;53594:7;53589:321;;53618:20;53641:29;:2;:27;:29::i;:::-;53759:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;53759:29:0;;;;;;;;;;;:34;;-1:-1:-1;;53759:34:0;;;53866:27;;;;;;-1:-1:-1;;;53866:27:0;;:32;;-1:-1:-1;53866:32:0;;;-1:-1:-1;53238:679:0:o;4920:387::-;5243:20;5291:8;;;4920:387::o;43569:325::-;-1:-1:-1;;;;;;;;43753:43:0;;37120:10;43797:12;:10;:12::i;:::-;43811:4;43817:2;43821:5;43828:4;43753:80;;;;;;;;;;;;;-1:-1:-1;;;;;43753:80:0;;;;;;-1:-1:-1;;;;;43753:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43753:80:0;-1:-1:-1;;;;;;43753:101:0;;43745:141;;;;;-1:-1:-1;;;43745:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38132:451;38217:4;-1:-1:-1;;;;;;38254:40:0;;-1:-1:-1;;;38254:40:0;;:98;;-1:-1:-1;;;;;;;38311:41:0;;-1:-1:-1;;;38311:41:0;38254:98;:167;;;-1:-1:-1;;;;;;;38369:52:0;;-1:-1:-1;;;38369:52:0;38254:167;:243;;;-1:-1:-1;;;;;;;38438:59:0;;-1:-1:-1;;;38438:59:0;38254:243;:321;;;-1:-1:-1;;;;;;;;38514:61:0;-1:-1:-1;;;38514:61:0;;38132:451::o;12846:922::-;12899:15;12955:10;12899:15;13001:27;:25;:27::i;:::-;12976:52;;13064:18;-1:-1:-1;;;;;13043:40:0;:9;-1:-1:-1;;;;;13043:40:0;;:76;;;;13100:19;-1:-1:-1;;;;;13087:32:0;:9;-1:-1:-1;;;;;13087:32:0;;13043:76;13039:169;;;13190:6;-1:-1:-1;13183:13:0;;-1:-1:-1;13183:13:0;13039:169;-1:-1:-1;;;;;13612:22:0;;13625:9;13612:22;;;;:78;;;13638:18;-1:-1:-1;;;;;13638:33:0;;13672:6;13680:9;13638:52;;;;;;;;;;;;;-1:-1:-1;;;;;13638:52:0;;;;;;-1:-1:-1;;;;;13638:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13638:52:0;13612:78;13608:124;;;13714:6;-1:-1:-1;13707:13:0;;-1:-1:-1;13707:13:0;13608:124;-1:-1:-1;13751:9:0;-1:-1:-1;12846:922:0;:::o;51519:488::-;51643:10;51635:44;;;;;-1:-1:-1;;;51635:44:0;;;;;;;;;;;;-1:-1:-1;;;51635:44:0;;;;;;;;;;;;;;;51690:14;51707:13;;;:9;:13;;;;;;51751:14;;;51784:18;;;51776:57;;;;;-1:-1:-1;;;51776:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51844:13;;;;:9;:13;;;;;;;;:25;;;;51973:9;:13;;;;;-1:-1:-1;;;;;51973:17:0;;;;;;;;;-1:-1:-1;51973:17:0;;;:26;;;;;;;51519:488::o;52015:706::-;52157:5;52166:1;52157:10;52149:49;;;;;-1:-1:-1;;;52149:49:0;;;;;;;;;;;;-1:-1:-1;;;52149:49:0;;;;;;;;;;;;;;;52217:11;;;;:7;:11;;;;;;:16;52209:58;;;;;-1:-1:-1;;;52209:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52280:11;;;;:7;:11;;;;;-1:-1:-1;;;;;52294:20:0;;52280:34;;52332:7;52327:387;;52356:20;52379:29;:2;:27;:29::i;:::-;52577:23;;;;:9;:23;;;;;;;;52575:25;;;;;;;;;52675:9;:23;;;;;-1:-1:-1;;;;;52675:27:0;;;;;;;;;;52673:29;;;;;;;-1:-1:-1;52015:706:0;;;;:::o;44390:400::-;-1:-1:-1;;;;;;;;44613:48:0;;37285:10;44662:12;:10;:12::i;:::-;44676:4;44682:3;44687:6;44695:4;44613:87;;;;;;;;;;;;;-1:-1:-1;;;;;44613:87:0;;;;;;-1:-1:-1;;;;;44613:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62732:564;62795:13;62825:10;62821:53;;-1:-1:-1;62852:10:0;;;;;;;;;;;;-1:-1:-1;;;62852:10:0;;;;;;62821:53;62899:5;62884:12;62940:78;62947:9;;62940:78;;62973:8;;63004:2;62996:10;;;;62940:78;;;63028:19;63060:6;63050:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63050:17:0;-1:-1:-1;63122:5:0;;-1:-1:-1;63028:39:0;-1:-1:-1;;;63094:10:0;;63138:119;63145:9;;63138:119;;63215:2;63208:4;:9;63202:2;:16;63189:31;;63171:6;63178:7;;;;;;;63171:15;;;;;;;;;;;:49;-1:-1:-1;;;;;63171:49:0;;;;;;;;-1:-1:-1;63243:2:0;63235:10;;;;63138:119;;;-1:-1:-1;63281:6:0;62732:564;-1:-1:-1;;;;62732:564:0:o;53925:446::-;54110:2;-1:-1:-1;;;;;54102:10:0;:4;-1:-1:-1;;;;;54102:10:0;;54098:266;;54203:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;54203:29:0;;;;;;;;;;;:39;;;;;;;54315:27;;;;;;;:37;;;;;;;53925:446::o;6487:892::-;6613:5;6638:19;-1:-1:-1;;;;;6638:17:0;;;:19::i;:::-;6630:58;;;;;-1:-1:-1;;;6630:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6762:12;6776:17;6797:6;-1:-1:-1;;;;;6797:11:0;6809:8;6797:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6797:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6761:57;;;;6833:7;6829:543;;;6861:11;;:16;6857:124;;6917:4;6906:24;;;;;;;;;;;;;;;-1:-1:-1;6906:24:0;6898:67;;;;;-1:-1:-1;;;6898:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6829:543;;;7072:11;;7068:97;;7109:40;;;-1:-1:-1;;;7109:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7068:97;7296:4;7290:11;7341:4;7334;7330:2;7326:13;7319:27;10969:526;-1:-1:-1;;11456:14:0;11452:23;11439:37;11435:2;11431:46;;11406:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://8f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e2090
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.