Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
EmblemVault
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.13; pragma experimental ABIEncoderV2; import "./SafeMath.sol"; import "./ERC165.sol"; import "./HasRegistration.sol"; import "./IHandlerCallback.sol"; import "./IsBypassable.sol"; import "./Clonable.sol"; import "./Stream.sol"; import "./ERC2981Royalties.sol"; import "./EventableERC721.sol"; import "operator-filter-registry/src/upgradeable/OperatorFiltererUpgradeable.sol"; library AddressUtils { function isContract( address _addr ) internal view returns (bool addressCheck) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(_addr) } // solhint-disable-line addressCheck = (codehash != 0x0 && codehash != accountHash); } } contract NFToken is ERC165, HasRegistration, EventableERC721, OperatorFiltererUpgradeable { using SafeMath for uint256; using AddressUtils for address; /** * List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant ZERO_ADDRESS = "003001"; string constant NOT_VALID_NFT = "003002"; string constant NOT_OWNER_OR_OPERATOR = "003003"; string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004"; string constant NOT_ABLE_TO_RECEIVE_NFT = "003005"; string constant NFT_ALREADY_EXISTS = "003006"; string constant NOT_OWNER = "003007"; string constant IS_OWNER = "003008"; /** * @dev Magic value of a smart contract that can recieve NFT. * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). */ bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; /** * @dev A mapping from NFT ID to the address that owns it. */ mapping (uint256 => address) internal idToOwner; /** * @dev Mapping from NFT ID to approved address. */ mapping (uint256 => address) internal idToApproval; /** * @dev Mapping from owner address to count of his tokens. */ mapping (address => uint256) private ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @dev Guarantees that the msg.sender is an owner or operator of the given NFT. * @param _tokenId ID of the NFT to validate. */ modifier canOperate( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _msgSender() || ownerToOperators[tokenOwner][_msgSender()], NOT_OWNER_OR_OPERATOR); _; } /** * @dev Guarantees that the msg.sender is allowed to transfer NFT. * @param _tokenId ID of the NFT to transfer. */ modifier canTransfer(uint256 _tokenId) { bool _canBypass = canBypass(); bool hasOldBalance; address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == _msgSender() || idToApproval[_tokenId] == _msgSender() || ownerToOperators[tokenOwner][_msgSender()] || _canBypass, NOT_OWNER_APPROVED_OR_OPERATOR ); _; } modifier validNFToken( uint256 _tokenId ) { require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT); _; } function makeEvents(address[] calldata _from, address[] calldata _to, uint256[] calldata tokenIds) public onlyOwner override { EventableERC721.makeEvents(_from, _to, tokenIds); } function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external override { _safeTransferFrom(_from, _to, _tokenId, _data); } function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external override { _safeTransferFrom(_from, _to, _tokenId, ""); } function transferFrom(address _from, address _to, uint256 _tokenId) external override onlyAllowedOperatorApproval(_from) canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); _transfer(_to, _tokenId); } function approve( address _approved, uint256 _tokenId ) external override onlyAllowedOperatorApproval(_approved) canOperate(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner, IS_OWNER); idToApproval[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } function setApprovalForAll( address _operator, bool _approved ) onlyAllowedOperatorApproval(_operator) external override { ownerToOperators[_msgSender()][_operator] = _approved; emit ApprovalForAll(_msgSender(), _operator, _approved); } function balanceOf( address _owner ) external override view returns (uint256) { require(_owner != address(0), ZERO_ADDRESS); return _getOwnerNFTCount(_owner); } function ownerOf( uint256 _tokenId ) external override view returns (address _owner) { _owner = idToOwner[_tokenId]; require(_owner != address(0), NOT_VALID_NFT); } function getApproved( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (address) { return idToApproval[_tokenId]; } function isApprovedForAll( address _owner, address _operator ) external override view returns (bool) { return ownerToOperators[_owner][_operator]; } /** * @dev Actually preforms the transfer. * @notice Does NO checks. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) internal { address from = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(from, _tokenId); _addNFToken(_to, _tokenId); if (registeredOfType[3].length > 0 && registeredOfType[3][0] != address(0)) { IHandlerCallback(registeredOfType[3][0]).executeCallbacks(from, _to, _tokenId, IHandlerCallback.CallbackType.TRANSFER); } emit Transfer(from, _to, _tokenId); } function _mint( address _to, uint256 _tokenId ) internal virtual { require(_to != address(0), ZERO_ADDRESS); require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); _addNFToken(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } function _burn( uint256 _tokenId ) internal virtual validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(tokenOwner, _tokenId); emit Transfer(tokenOwner, address(0), _tokenId); } function _removeNFToken( address _from, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from] - 1; delete idToOwner[_tokenId]; } function _addNFToken(address _to,uint256 _tokenId) internal virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(1); } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage (gas optimization) of owner nft count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal virtual view returns (uint256) { return ownerToNFTokenCount[_owner]; } function _safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) private onlyAllowedOperatorApproval(_from) canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(_msgSender(), _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT); } } /** * @dev Clears the current approval of a given NFT ID. * @param _tokenId ID of the NFT to be transferred. */ function _clearApproval( uint256 _tokenId ) private { if (idToApproval[_tokenId] != address(0)) { delete idToApproval[_tokenId]; } } } abstract contract NFTokenEnumerableMetadata is NFToken, ERC721Metadata, ERC721Enumerable { string internal nftName; string internal nftSymbol; string internal nftContractMetadataUri; mapping (uint256 => string) internal idToUri; mapping (uint256 => string) internal idToPayload; bool initialized; function name() external override view returns (string memory _name) { _name = nftName; } /** * @dev Returns an abbreviated name for NFTokens. * @return _symbol Representing symbol. */ function symbol() external override view returns (string memory _symbol) { _symbol = nftSymbol; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function tokenURI( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (string memory) { return idToUri[_tokenId]; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function tokenPayload( uint256 _tokenId ) external view validNFToken(_tokenId) returns (string memory) { return idToPayload[_tokenId]; } /** * @dev Set a distinct URI (RFC 3986) for a given NFT ID. * @notice This is an internal function which should be called from user-implemented external * function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _tokenId Id for which we want URI. * @param _uri String representing RFC 3986 URI. */ function _setTokenUri( uint256 _tokenId, string memory _uri ) internal validNFToken(_tokenId) { idToUri[_tokenId] = _uri; } function _setTokenPayload( uint256 _tokenId, string memory _payload ) internal validNFToken(_tokenId) { idToPayload[_tokenId] = _payload; } /** * List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant INVALID_INDEX = "005007"; /** * @dev Array of all NFT IDs. */ uint256[] internal tokens; /** * @dev Mapping from token ID to its index in global tokens array. */ mapping(uint256 => uint256) internal idToIndex; /** * @dev Mapping from owner to list of owned NFT IDs. */ mapping(address => uint256[]) internal ownerToIds; /** * @dev Mapping from NFT ID to its index in the owner tokens list. */ mapping(uint256 => uint256) internal idToOwnerIndex; /** * @dev Returns the count of all existing NFTokens. * @return Total supply of NFTs. */ function totalSupply() external override view returns (uint256) { return tokens.length; } /** * @dev Returns NFT ID by its index. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external override view returns (uint256) { require(_index < tokens.length, INVALID_INDEX); return tokens[_index]; } /** * @dev returns the n-th NFT ID from a list of owner's tokens. * @param _owner Token owner's address. * @param _index Index number representing n-th token in owner's list of tokens. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external override view returns (uint256) { require(_index < ownerToIds[_owner].length, INVALID_INDEX); return ownerToIds[_owner][_index]; } /** * @dev Mints a new NFT. * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal override virtual { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length - 1; } /** * @dev Burns a NFT. * @notice This is an internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal override virtual { super._burn(_tokenId); if (bytes(idToUri[_tokenId]).length != 0) { delete idToUri[_tokenId]; } if (bytes(idToPayload[_tokenId]).length != 0) { delete idToPayload[_tokenId]; } uint256 tokenIndex = idToIndex[_tokenId]; uint256 lastTokenIndex = tokens.length - 1; uint256 lastToken = tokens[lastTokenIndex]; tokens[tokenIndex] = lastToken; tokens.pop(); // This wastes gas if you are burning the last token but saves a little gas if you are not. idToIndex[lastToken] = tokenIndex; idToIndex[_tokenId] = 0; } /** * @dev Removes a NFT from an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); delete idToOwner[_tokenId]; uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId]; uint256 lastTokenIndex = ownerToIds[_from].length - 1; if (lastTokenIndex != tokenToRemoveIndex) { uint256 lastToken = ownerToIds[_from][lastTokenIndex]; ownerToIds[_from][tokenToRemoveIndex] = lastToken; idToOwnerIndex[lastToken] = tokenToRemoveIndex; } ownerToIds[_from].pop(); } /** * @dev Assignes a new NFT to an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToIds[_to].push(_tokenId); idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage(gas optimization) of owner nft count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount(address _owner) internal override virtual view returns (uint256) { return ownerToIds[_owner].length; // UpgradableERC721.balanceOfHook(_owner, ownerToIds); } } /** * @dev This is an example contract implementation of NFToken with metadata extension. */ contract EmblemVault is NFTokenEnumerableMetadata, Clonable, ERC2981Royalties { address payable public streamAddress; function initialize() public override initializer { __Ownable_init(); nftName = "Emblem Vault V2"; nftSymbol = "Emblem.pro"; _registerInterface(0x5b5e139f); // ERC721Metadata _registerInterface(0x780e9d63); // ERC721Enumerable _registerInterface(0x80ac58cd); // ERC721 _registerInterface(0x2a55205a); // ERC2981 initializeERC165(); streamAddress = payable(address(new Stream())); Stream(streamAddress).initialize(); OwnableUpgradeable(streamAddress).transferOwnership(_msgSender()); isClaimable = true; // __OperatorFilterer_init(0x9dC5EE2D52d014f8b81D662FA8f4CA525F27cD6b, true); } // function upgrade() public initializer { // __OperatorFilterer_init(0x9dC5EE2D52d014f8b81D662FA8f4CA525F27cD6b, true); // } function updateStreamAddress(address _streamAddress) public onlyOwner { streamAddress = payable(_streamAddress); } function changeName(string calldata _name, string calldata _symbol) public onlyOwner { nftName = _name; nftSymbol = _symbol; } /** * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. * @param _uri String representing RFC 3986 URI. */ function mint( address _to, uint256 _tokenId, string calldata _uri, string calldata _payload) public onlyOwner { super._mint(_to, _tokenId); super._setTokenUri(_tokenId, _uri); super._setTokenPayload(_tokenId, _payload); if (registeredOfType[3].length > 0 && registeredOfType[3][0] == _msgSender()) { IHandlerCallback(_msgSender()).executeCallbacks(address(0), _to, _tokenId, IHandlerCallback.CallbackType.MINT); } } function burn(uint256 _tokenId) external canTransfer(_tokenId) { super._burn(_tokenId); if (registeredOfType[3].length > 0 && registeredOfType[3][0] != address(0)) { IHandlerCallback(registeredOfType[3][0]).executeCallbacks(_msgSender(), address(0), _tokenId, IHandlerCallback.CallbackType.BURN); } } function contractURI() public view returns (string memory) { return nftContractMetadataUri; } event UpdatedContractURI(string _from, string _to); function updateContractURI(string memory uri) public onlyOwner { emit UpdatedContractURI(nftContractMetadataUri, uri); nftContractMetadataUri = uri; } function getOwnerNFTCount(address _owner) public view returns (uint256) { return NFTokenEnumerableMetadata._getOwnerNFTCount(_owner); } function updateTokenUri( uint256 _tokenId, string memory _uri ) public validNFToken(_tokenId) onlyOwner { idToUri[_tokenId] = _uri; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; interface IClonable { function initialize() external; function version() external returns(uint256); } abstract contract Clonable { function initialize() public virtual; function version() public pure virtual returns (uint256) { return 1; } }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; contract ERC165 { mapping(bytes4 => bool) private supportedInterfaces; function initializeERC165() internal { require(supportedInterfaces[0x01ffc9a7] == false, "Already Registered"); _registerInterface(0x01ffc9a7); } function supportsInterface(bytes4 interfaceId) public view returns (bool) { return supportedInterfaces[interfaceId]; } function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); supportedInterfaces[interfaceId] = true; } } // interface IERC1155Receiver { // function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns(bytes4); // function onERC1155BatchReceived(address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external returns(bytes4); // } // interface IERC1155MetadataURI { // function uri(uint256 id) external view returns (string memory); // }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './IERC2981Royalties.sol'; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './ERC2981Base.sol'; import './OwnableUpgradeable.sol'; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 /// @dev This implementation has the same royalties for each and every tokens abstract contract ERC2981Royalties is ERC2981Base { RoyaltyInfo private _contractRoyalties; mapping(uint256 => RoyaltyInfo) private _individualRoyalties; /// @dev Sets token royalties /// @param tokenId the token id fir which we register the royalties /// @param recipient recipient of the royalties /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0) function setTokenRoyalty(uint256 tokenId, address recipient, uint256 value) public override { require(msg.sender == OwnableUpgradeable(address(this)).owner(), "Not Owner"); require(value <= 10000, 'ERC2981Royalties: Too high'); if (tokenId == 0) { _contractRoyalties = RoyaltyInfo(recipient, uint24(value)); } else { _individualRoyalties[tokenId] = RoyaltyInfo(recipient, uint24(value)); } } function royaltyInfo(uint256 tokenId, uint256 value) public view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _individualRoyalties[tokenId].recipient != address(0)? _individualRoyalties[tokenId]: _contractRoyalties; receiver = royalties.recipient; royaltyAmount = (value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; interface ERC721Enumerable { /** * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an * assigned and queryable owner not equal to the zero address. * @return Total supply of NFTs. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, * representing invalid NFTs. * @param _owner An address where we are interested in NFTs owned by them. * @param _index A counter less than `balanceOf(_owner)`. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256); } /** * @dev Optional metadata extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Metadata { /** * @dev Returns a descriptive name for a collection of NFTs in this contract. * @return _name Representing name. */ function name() external view returns (string memory _name); /** * @dev Returns a abbreviated name for a collection of NFTs in this contract. * @return _symbol Representing symbol. */ function symbol() external view returns (string memory _symbol); /** * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file * that conforms to the "ERC721 Metadata JSON Schema". * @return URI of _tokenId. */ function tokenURI(uint256 _tokenId) external view returns (string memory); } /** * @dev ERC-721 interface for accepting safe transfers. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721TokenReceiver { function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes calldata _data ) external returns(bytes4); } interface IEventableERC721 { function makeEvents(address[] calldata _from, address[] calldata _to, uint256[] calldata tokenIds) external; } /** * @dev ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface IERC721 { event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external; function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; function transferFrom( address _from, address _to, uint256 _tokenId ) external; function approve( address _approved, uint256 _tokenId ) external; function setApprovalForAll( address _operator, bool _approved ) external; function balanceOf( address _owner ) external view returns (uint256); function ownerOf( uint256 _tokenId ) external view returns (address); function getApproved( uint256 _tokenId ) external view returns (address); function isApprovedForAll( address _owner, address _operator ) external view returns (bool); } abstract contract EventableERC721 is IEventableERC721, IERC721 { function makeEvents(address[] calldata _from, address[] calldata _to, uint256[] calldata tokenIds) public virtual override { _handleEventFromLoops(_from, _to, tokenIds); } function _handleEventFromLoops(address[] calldata _from, address[] calldata _to, uint256[] calldata amounts) internal { for (uint i=0; i < _from.length; i++) { if (amounts.length == _from.length && amounts.length == _to.length) { _handleEventEmits(_from[i], _to[i], makeSingleArray(amounts, i)); } else if (amounts.length == _from.length && amounts.length != _to.length) { _handleEventToLoops(_from[i], _to, makeSingleArray(amounts, i)); } else { _handleEventToLoops(_from[i], _to, amounts); } } } function _handleEventToLoops(address _from, address[] calldata _to, uint256[] memory amounts) internal { for (uint i=0; i < _to.length; i++) { if (amounts.length == _to.length) { _handleEventEmits(_from, _to[i], makeSingleArray(amounts, i)); } else { _handleEventEmits(_from, _to[i], amounts); } } } function _handleEventEmits(address _from, address _to, uint256[] memory amounts) internal { for (uint i=0; i < amounts.length; i++) { emit Transfer(_from, _to, amounts[i]); } } function makeSingleArray(uint256[] memory amount, uint index) internal pure returns (uint256[] memory) { uint256[] memory arr = new uint256[](1); arr[0] = amount[index]; return arr; } }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; import "./IsBypassable.sol"; contract HasRegistration is IsBypassable { mapping(address => uint256) public registeredContracts; // 0 EMPTY, 1 ERC1155, 2 ERC721, 3 HANDLER, 4 ERC20, 5 BALANCE, 6 CLAIM, 7 UNKNOWN, 8 FACTORY, 9 STAKING, 10 BYPASS mapping(uint256 => address[]) internal registeredOfType; modifier isRegisteredContract(address _contract) { require(registeredContracts[_contract] > 0, "Contract is not registered"); _; } modifier isRegisteredContractOrOwner(address _contract) { require(registeredContracts[_contract] > 0 || owner() == _msgSender(), "Contract is not registered nor Owner"); _; } function registerContract(address _contract, uint _type) public isRegisteredContractOrOwner(_msgSender()) { registeredContracts[_contract] = _type; registeredOfType[_type].push(_contract); } function unregisterContract(address _contract, uint256 index) public onlyOwner isRegisteredContract(_contract) { address[] storage arr = registeredOfType[registeredContracts[_contract]]; arr[index] = arr[arr.length - 1]; arr.pop(); delete registeredContracts[_contract]; } function isRegistered(address _contract, uint256 _type) public view returns (bool) { return registeredContracts[_contract] == _type; } function getAllRegisteredContractsOfType(uint256 _type) public view returns (address[] memory) { return registeredOfType[_type]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC2981Royalties { function setTokenRoyalty(uint256 tokenId, address recipient, uint256 value) external; function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; interface IHandlerCallback { enum CallbackType { MINT, TRANSFER, CLAIM, BURN, FALLBACK } struct Callback { address vault; address registrant; address target; bytes4 targetFunction; bool canRevert; } function executeCallbacksInternal(address _from, address _to, uint256 tokenId, CallbackType _type) external; function executeCallbacks(address _from, address _to, uint256 tokenId, CallbackType _type) external; function executeStoredCallbacksInternal(address _nftAddress, address _from, address _to, uint256 tokenId, IHandlerCallback.CallbackType _type) external; }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; import "./IsClaimable.sol"; // import "operator-filter-registry/src/upgradeable/OperatorFiltererUpgradeable.sol"; abstract contract IsBypassable is IsClaimable { bool public byPassable; mapping(address => mapping(bytes4 => bool)) public byPassableFunction; mapping(address => mapping(uint256 => bool)) byPassableIds; modifier onlyOwner virtual override { bool _canBypass = byPassable && byPassableFunction[_msgSender()][msg.sig]; require(owner() == _msgSender() || _canBypass, "Not owner or able to bypass"); _; } modifier onlyOwnerOrBypassWithId(uint256 id) { require (owner() == _msgSender() || (id != 0 && byPassableIds[_msgSender()][id] ), "Invalid id"); _; } function canBypass() internal view returns(bool) { return (byPassable && byPassableFunction[_msgSender()][msg.sig]); } function canBypassForTokenId(uint256 id) internal view returns(bool) { return (byPassable && canBypass() && byPassableIds[_msgSender()][id]); } function toggleBypassability() public onlyOwner { byPassable = !byPassable; } function addBypassRule(address who, bytes4 functionSig, uint256 id) public onlyOwner { byPassableFunction[who][functionSig] = true; if (id != 0) { byPassableIds[who][id] = true; } } function removeBypassRule(address who, bytes4 functionSig, uint256 id) public onlyOwner { byPassableFunction[who][functionSig] = false; if (id !=0) { byPassableIds[who][id] = true; } } }
// SPDX-License-Identifier: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; import "./OwnableUpgradeable.sol"; abstract contract IsClaimable is OwnableUpgradeable { bool public isClaimable; function toggleClaimable() public onlyOwner { isClaimable = !isClaimable; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; return c; } }
///////////////////////////////////////////////////////////////////////////////////// // // SPDX-License-Identifier: MIT // // ███ ███ ██████ ███ ██ ███████ ██ ██ ██████ ██ ██████ ███████ // ████ ████ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ // ██ ████ ██ ██ ██ ██ ██ ██ █████ ████ ██████ ██ ██████ █████ // ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ // ██ ██ ██████ ██ ████ ███████ ██ ██ ██ ██ ███████ // // ███████ ████████ ██████ ███████ █████ ███ ███ // ██ ██ ██ ██ ██ ██ ██ ████ ████ // ███████ ██ ██████ █████ ███████ ██ ████ ██ // ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ // ███████ ██ ██ ██ ███████ ██ ██ ██ ██ // // https://moneypipe.xyz // ///////////////////////////////////////////////////////////////////////////////////// pragma solidity ^0.8.4; // import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "./OwnableUpgradeable.sol"; contract Stream is OwnableUpgradeable { Member[] private _members; struct Member { address account; uint32 value; uint32 total; } function initialize() initializer public { __Ownable_init(); // for(uint i=0; i<m.length; i++) { // _members.push(m[i]); // } } function addMembers(Member[] calldata m) public onlyOwner { for(uint i=0; i<m.length; i++) { _members.push(m[i]); } } function addMember(Member calldata m) public onlyOwner { _members.push(m); } function removeMember(uint256 index) public onlyOwner { _members[index] = _members[_members.length - 1]; _members.pop(); } receive () external payable { require(_members.length > 0, "1"); for(uint i=0; i<_members.length; i++) { Member memory member = _members[i]; _transfer(member.account, msg.value * member.value / member.total); } } function members() external view returns (Member[] memory) { return _members; } // adopted from https://github.com/lexDAO/Kali/blob/main/contracts/libraries/SafeTransferLib.sol error TransferFailed(); function _transfer(address to, uint256 amount) internal { bool callStatus; assembly { callStatus := call(gas(), to, amount, 0, 0, 0, 0) } if (!callStatus) revert TransferFailed(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "../IOperatorFilterRegistry.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; abstract contract OperatorFiltererUpgradeable is Initializable { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); function __OperatorFilterer_init(address subscriptionOrRegistrantToCopy, bool subscribe) internal onlyInitializing { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isRegistered(address(this))) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } }
{ "optimizer": { "enabled": true, "runs": 1 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_from","type":"string"},{"indexed":false,"internalType":"string","name":"_to","type":"string"}],"name":"UpdatedContractURI","type":"event"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"functionSig","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"addBypassRule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"byPassable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"byPassableFunction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"getAllRegisteredContractsOfType","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnerNFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"makeEvents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"registerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"registeredContracts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"functionSig","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"removeBypassRule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"streamAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBypassability","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenPayload","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"unregisterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_streamAddress","type":"address"}],"name":"updateStreamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614b00806100206000396000f3fe608060405234801561001057600080fd5b506004361061021a5760003560e01c806301ffc9a71461021f57806306fdde0314610261578063081812fc14610276578063095ea7b314610296578063152f0eb5146102ab57806318160ddd146102be5780631986166f146102d05780631beab0f6146102e357806323b872dd146102f65780632a55205a146103095780632adbc37d1461033b5780632b5173cd146103435780632cf1dacb146103555780632f745c59146103685780632fb102cf1461037b57806330477d361461038e57806340897bbe146103a157806342842e0e146103a957806342966c68146103bc5780634f6ccce7146103cf57806354fd4d50146103e25780636352211e146103e957806370a08231146103fc578063715018a61461040f578063736cd42d1461041757806374478bb31461042a5780637b74297d146104375780637e5b1e24146104575780638129fc1c1461046a57806386575e40146104725780638da5cb5b1461048557806395d89b411461048d5780639713c807146104955780639ad95232146104a8578063a06617cd146104bb578063a22cb465146104db578063a8f1602c146104ee578063b88d4fde1461051b578063bd7f4c8d1461052e578063c87b56dd14610541578063d31af48414610554578063e565fef314610567578063e8a3d4851461057a578063e985e9c514610582578063edf68280146105be578063f2fde38b146105ec575b600080fd5b61024c61022d3660046135ff565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102696105ff565b6040516102589190613670565b610289610284366004613683565b610691565b604051610258919061369c565b6102a96102a43660046136c5565b610713565b005b6102a96102b93660046136c5565b61095e565b6075545b604051908152602001610258565b6102a96102de3660046136f1565b610a30565b6102a96102f13660046136c5565b610b1b565b6102a9610304366004613732565b610cf1565b61031c610317366004613762565b610f28565b604080516001600160a01b039093168352602083019190915201610258565b6102a9610fb3565b60665461024c90610100900460ff1681565b6102a96103633660046136f1565b611049565b6102c26103763660046136c5565b611130565b6102a96103893660046137cc565b6111c7565b607b54610289906001600160a01b031681565b6102a961139a565b6102a96103b7366004613732565b611427565b6102a96103ca366004613683565b611447565b6102c26103dd366004613683565b61161d565b60016102c2565b6102896103f7366004613683565b611685565b6102c261040a366004613857565b6116dd565b6102a9611734565b6102a9610425366004613857565b6117b9565b60665461024c9060ff1681565b61044a610445366004613683565b611854565b6040516102589190613874565b6102a9610465366004613963565b6118c0565b6102a9611985565b6102a9610480366004613997565b611c46565b610289611cdf565b610269611cee565b6102a96104a3366004613a02565b611cfd565b6102696104b6366004613683565b611ea4565b6102c26104c9366004613857565b60696020526000908152604090205481565b6102a96104e9366004613a37565b611f9f565b61024c6104fc3660046136c5565b6001600160a01b03919091166000908152606960205260409020541490565b6102a9610529366004613a70565b6120b5565b6102c261053c366004613857565b6120f7565b61026961054f366004613683565b612102565b6102a9610562366004613ae2565b612177565b6102a9610575366004613b62565b612268565b6102696122ee565b61024c610590366004613be9565b6001600160a01b039182166000908152606e6020908152604080832093909416825291909152205460ff1690565b61024c6105cc366004613c17565b606760209081526000928352604080842090915290825290205460ff1681565b6102a96105fa366004613857565b6122fd565b6060606f805461060e90613c45565b80601f016020809104026020016040519081016040528092919081815260200182805461063a90613c45565b80156106875780601f1061065c57610100808354040283529160200191610687565b820191906000526020600020905b81548152906001019060200180831161066a57829003601f168201915b5050505050905090565b6000818152606b60209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166106f15760405162461bcd60e51b81526004016106e89190613670565b60405180910390fd5b506000838152606c60205260409020546001600160a01b031691505b50919050565b816daaeb6d7670e522a718067333cd4e3b156107bc57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061075c9030908590600401613c79565b602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190613c93565b6107bc5780604051633b79c77360e21b81526004016106e8919061369c565b6000828152606b602052604090205482906001600160a01b03163381148061080757506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906108445760405162461bcd60e51b81526004016106e89190613670565b506000848152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b031661089e5760405162461bcd60e51b81526004016106e89190613670565b506000858152606b6020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b039081169190881682036108fd5760405162461bcd60e51b81526004016106e89190613670565b506000868152606c602052604080822080546001600160a01b0319166001600160a01b038b811691821790925591518993918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050505050565b3360008181526069602052604090205415158061098a57503361097f611cdf565b6001600160a01b0316145b6109e25760405162461bcd60e51b8152602060048201526024808201527f436f6e7472616374206973206e6f742072656769737465726564206e6f72204f6044820152633bb732b960e11b60648201526084016106e8565b506001600160a01b039091166000818152606960209081526040808320859055938252606a8152928120805460018101825590825292902090910180546001600160a01b0319169091179055565b606654600090610100900460ff168015610a6f575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610a7a611cdf565b6001600160a01b03161480610a8c5750805b610aa85760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191660011790558115610b15576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff191660011790555b50505050565b606654600090610100900460ff168015610b5a575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610b65611cdf565b6001600160a01b03161480610b775750805b610b935760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b0383166000908152606960205260409020548390610bf75760405162461bcd60e51b815260206004820152601a60248201527910dbdb9d1c9858dd081a5cc81b9bdd081c9959da5cdd195c995960321b60448201526064016106e8565b6001600160a01b0384166000908152606960209081526040808320548352606a909152902080548190610c2c90600190613cfb565b81548110610c3c57610c3c613d12565b9060005260206000200160009054906101000a90046001600160a01b0316818581548110610c6c57610c6c613d12565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610caa57610caa613d28565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b039690961681526069909552505060408320929092555050565b826daaeb6d7670e522a718067333cd4e3b15610d9a57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610d3a9030908590600401613c79565b602060405180830381865afa158015610d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7b9190613c93565b610d9a5780604051633b79c77360e21b81526004016106e8919061369c565b816000610da56123e7565b6000838152606b6020526040812054919250906001600160a01b031633811480610de557506000848152606c60205260409020546001600160a01b031633145b80610e1357506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b80610e1b5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e585760405162461bcd60e51b81526004016106e89190613670565b506000868152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528791906001600160a01b0316610eb25760405162461bcd60e51b81526004016106e89190613670565b506000878152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908b168214610f115760405162461bcd60e51b81526004016106e89190613670565b50610f1c898961242b565b50505050505050505050565b6000828152607a6020526040812054819081906001600160a01b0316610f4f576079610f5e565b6000858152607a602052604090205b6040805180820190915290546001600160a01b038116808352600160a01b90910462ffffff166020830181905290945090915061271090610f9f9086613d3e565b610fa99190613d5d565b9150509250929050565b606654600090610100900460ff168015610ff2575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610ffd611cdf565b6001600160a01b0316148061100f5750805b61102b5760405162461bcd60e51b81526004016106e890613cb0565b506066805461ff001981166101009182900460ff1615909102179055565b606654600090610100900460ff168015611088575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611093611cdf565b6001600160a01b031614806110a55750805b6110c15760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191690558115610b15576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff1916600117905550505050565b6001600160a01b0382166000908152607760209081526040808320548151808301909252600682526530303530303760d01b928201929092529083106111895760405162461bcd60e51b81526004016106e89190613670565b506001600160a01b03831660009081526077602052604090208054839081106111b4576111b4613d12565b9060005260206000200154905092915050565b606654600090610100900460ff168015611206575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611211611cdf565b6001600160a01b031614806112235750805b61123f5760405162461bcd60e51b81526004016106e890613cb0565b611249878761259e565b6112898686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125fe92505050565b6112c98684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267792505050565b6003600052606a602052600080516020614a8b833981519152541580159061132f575060036000908152606a602052600080516020614a8b833981519152805433929061131857611318613d12565b6000918252602090912001546001600160a01b0316145b156113915760405163b68c437960e01b8152339063b68c43799061135e906000908b908b908390600401613d7f565b600060405180830381600087803b15801561137857600080fd5b505af115801561138c573d6000803e3d6000fd5b505050505b50505050505050565b606654600090610100900460ff1680156113d9575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336113e4611cdf565b6001600160a01b031614806113f65750805b6114125760405162461bcd60e51b81526004016106e890613cb0565b506066805460ff19811660ff90911615179055565b611442838383604051806020016040528060008152506126f0565b505050565b8060006114526123e7565b6000838152606b6020526040812054919250906001600160a01b03163381148061149257506000848152606c60205260409020546001600160a01b031633145b806114c057506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b806114c85750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115055760405162461bcd60e51b81526004016106e89190613670565b5061150f85612a4e565b6003600052606a602052600080516020614a8b8339815191525415801590611575575060036000908152606a602052600080516020614a8b8339815191528054829061155d5761155d613d12565b6000918252602090912001546001600160a01b031614155b156116165760036000908152606a602052600080516020614a8b83398151915280549091906115a6576115a6613d12565b600091825260208220015460405163b68c437960e01b81526001600160a01b039091169163b68c4379916115e39133918a90600390600401613d7f565b600060405180830381600087803b1580156115fd57600080fd5b505af1158015611611573d6000803e3d6000fd5b505050505b5050505050565b60755460408051808201909152600681526530303530303760d01b6020820152600091831061165f5760405162461bcd60e51b81526004016106e89190613670565b506075828154811061167357611673613d12565b90600052602060002001549050919050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161070d5760405162461bcd60e51b81526004016106e89190613670565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166117245760405162461bcd60e51b81526004016106e89190613670565b5061172e82612b70565b92915050565b606654600090610100900460ff168015611773575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361177e611cdf565b6001600160a01b031614806117905750805b6117ac5760405162461bcd60e51b81526004016106e890613cb0565b6117b66000612b8b565b50565b606654600090610100900460ff1680156117f8575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611803611cdf565b6001600160a01b031614806118155750805b6118315760405162461bcd60e51b81526004016106e890613cb0565b50607b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152606a60209081526040918290208054835181840281018401909452808452606093928301828280156118b457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611896575b50505050509050919050565b606654600090610100900460ff1680156118ff575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361190a611cdf565b6001600160a01b0316148061191c5750805b6119385760405162461bcd60e51b81526004016106e890613cb0565b7fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce60718360405161196a929190613dcb565b60405180910390a18151611442906071906020850190613499565b600154610100900460ff16158080156119a257506001805460ff16105b806119bb5750303b1580156119bb57506001805460ff16145b611a1e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106e8565b6001805460ff1916811790558015611a40576001805461ff0019166101001790555b611a48612bdd565b60408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b6020909201918252611a7e91606f91613499565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b6020909201918252611ab091607091613499565b50611ac1635b5e139f60e01b612c0e565b611ad163780e9d6360e01b612c0e565b611ae16380ac58cd60e01b612c0e565b611af163152a902d60e11b612c0e565b611af9612c8c565b604051611b059061351d565b604051809103906000f080158015611b21573d6000803e3d6000fd5b50607b80546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b5050607b5460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150611bc090339060040161369c565b600060405180830381600087803b158015611bda57600080fd5b505af1158015611bee573d6000803e3d6000fd5b50506066805460ff19166001179055505080156117b6576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b606654600090610100900460ff168015611c85575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611c90611cdf565b6001600160a01b03161480611ca25750805b611cbe5760405162461bcd60e51b81526004016106e890613cb0565b611cca606f868661352a565b50611cd76070848461352a565b505050505050565b6034546001600160a01b031690565b60606070805461060e90613c45565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f9190613e86565b6001600160a01b0316336001600160a01b031614611dab5760405162461bcd60e51b81526020600482015260096024820152682737ba1027bbb732b960b91b60448201526064016106e8565b612710811115611dfa5760405162461bcd60e51b815260206004820152601a60248201527908aa48664727062a4def2c2d8e8d2cae67440a8dede40d0d2ced60331b60448201526064016106e8565b82600003611e4d57604080518082019091526001600160a01b03831680825262ffffff8316602090920182905260798054600160a01b9093026001600160b81b0319909316909117919091179055505050565b6040805180820182526001600160a01b03938416815262ffffff92831660208083019182526000968752607a905291909420935184549151909216600160a01b026001600160b81b03199091169190921617179055565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611eff5760405162461bcd60e51b81526004016106e89190613670565b5060008381526073602052604090208054611f1990613c45565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4590613c45565b8015611f925780601f10611f6757610100808354040283529160200191611f92565b820191906000526020600020905b815481529060010190602001808311611f7557829003601f168201915b5050505050915050919050565b816daaeb6d7670e522a718067333cd4e3b1561204857604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490611fe89030908590600401613c79565b602060405180830381865afa158015612005573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120299190613c93565b6120485780604051633b79c77360e21b81526004016106e8919061369c565b336000818152606e602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61161685858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f092505050565b600061172e82612b70565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b031661215d5760405162461bcd60e51b81526004016106e89190613670565b5060008381526072602052604090208054611f1990613c45565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166121d05760405162461bcd60e51b81526004016106e89190613670565b50606654600090610100900460ff168015612210575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361221b611cdf565b6001600160a01b0316148061222d5750805b6122495760405162461bcd60e51b81526004016106e890613cb0565b6000848152607260209081526040909120845161161692860190613499565b606654600090610100900460ff1680156122a7575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336122b2611cdf565b6001600160a01b031614806122c45750805b6122e05760405162461bcd60e51b81526004016106e890613cb0565b611391878787878787612d13565b60606071805461060e90613c45565b606654600090610100900460ff16801561233c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612347611cdf565b6001600160a01b031614806123595750805b6123755760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b0382166123da5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e8565b6123e382612b8b565b5050565b606654600090610100900460ff168015612426575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905090565b6000818152606b60205260409020546001600160a01b031661244c82612d21565b6124568183612d5c565b6124608383612edc565b6003600052606a602052600080516020614a8b83398151915254158015906124c6575060036000908152606a602052600080516020614a8b833981519152805482906124ae576124ae613d12565b6000918252602090912001546001600160a01b031614155b1561256a5760036000908152606a602052600080516020614a8b83398151915280549091906124f7576124f7613d12565b60009182526020909120015460405163b68c437960e01b81526001600160a01b039091169063b68c43799061253790849087908790600190600401613d7f565b600060405180830381600087803b15801561255157600080fd5b505af1158015612565573d6000803e3d6000fd5b505050505b81836001600160a01b0316826001600160a01b0316600080516020614aab83398151915260405160405180910390a4505050565b6125a88282612f9f565b607580546001818101835560008390527f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910183905590546125eb9190613cfb565b6000918252607660205260409091205550565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126575760405162461bcd60e51b81526004016106e89190613670565b5060008381526072602090815260409091208351610b1592850190613499565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126d05760405162461bcd60e51b81526004016106e89190613670565b5060008381526073602090815260409091208351610b1592850190613499565b836daaeb6d7670e522a718067333cd4e3b1561279957604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906127399030908590600401613c79565b602060405180830381865afa158015612756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277a9190613c93565b6127995780604051633b79c77360e21b81526004016106e8919061369c565b8260006127a46123e7565b6000838152606b6020526040812054919250906001600160a01b0316338114806127e457506000848152606c60205260409020546001600160a01b031633145b8061281257506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b8061281a5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906128575760405162461bcd60e51b81526004016106e89190613670565b506000878152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528891906001600160a01b03166128b15760405162461bcd60e51b81526004016106e89190613670565b506000888152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908c1682146129105760405162461bcd60e51b81526004016106e89190613670565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038b166129555760405162461bcd60e51b81526004016106e89190613670565b506129608a8a61242b565b6129728a6001600160a01b0316613070565b1561138c5760006001600160a01b038b1663150b7a02338e8d8d6040518563ffffffff1660e01b81526004016129ab9493929190613ea3565b6020604051808303816000875af11580156129ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ee9190613ee0565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14612a3f5760405162461bcd60e51b81526004016106e89190613670565b50505050505050505050505050565b612a57816130ac565b60008181526072602052604090208054612a7090613c45565b159050612a8e576000818152607260205260408120612a8e9161359e565b60008181526073602052604090208054612aa790613c45565b159050612ac5576000818152607360205260408120612ac59161359e565b600081815260766020526040812054607554909190612ae690600190613cfb565b9050600060758281548110612afd57612afd613d12565b906000526020600020015490508060758481548110612b1e57612b1e613d12565b6000918252602090912001556075805480612b3b57612b3b613d28565b600082815260208082208301600019908101839055909201909255918152607690915260408082209390935592835250812055565b6001600160a01b031660009081526077602052604090205490565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600154610100900460ff16612c045760405162461bcd60e51b81526004016106e890613efd565b612c0c61315c565b565b6001600160e01b03198082169003612c675760405162461bcd60e51b815260206004820152601c60248201527b115490cc4d8d4e881a5b9d985b1a59081a5b9d195c999858d9481a5960221b60448201526064016106e8565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6301ffc9a760e01b60009081526020527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c55460ff1615612d035760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e48149959da5cdd195c995960721b60448201526064016106e8565b612c0c6301ffc9a760e01b612c0e565b611cd786868686868661318c565b6000818152606c60205260409020546001600160a01b0316156117b6576000908152606c6020526040902080546001600160a01b0319169055565b6000818152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03848116911614612db75760405162461bcd60e51b81526004016106e89190613670565b506000818152606b6020908152604080832080546001600160a01b031916905560788252808320546001600160a01b03861684526077909252822054909190612e0290600190613cfb565b9050818114612e99576001600160a01b0384166000908152607760205260408120805483908110612e3557612e35613d12565b906000526020600020015490508060776000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612e7957612e79613d12565b600091825260208083209091019290925591825260789052604090208290555b6001600160a01b0384166000908152607760205260409020805480612ec057612ec0613d28565b6001900381819060005260206000200160009055905550505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615612f335760405162461bcd60e51b81526004016106e89190613670565b506000818152606b6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452607783529083208054600181810183558286529385200185905592529054612f8c9190613cfb565b6000918252607860205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316612fe35760405162461bcd60e51b81526004016106e89190613670565b506000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561303b5760405162461bcd60e51b81526004016106e89190613670565b506130468282612edc565b60405181906001600160a01b03841690600090600080516020614aab833981519152908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906130a45750808214155b949350505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b03166131055760405162461bcd60e51b81526004016106e89190613670565b506000828152606b60205260409020546001600160a01b031661312783612d21565b6131318184612d5c565b60405183906000906001600160a01b03841690600080516020614aab833981519152908390a4505050565b600154610100900460ff166131835760405162461bcd60e51b81526004016106e890613efd565b612c0c33612b8b565b60005b858110156113915781861480156131a557508184145b156132435761323e8787838181106131bf576131bf613d12565b90506020020160208101906131d49190613857565b8686848181106131e6576131e6613d12565b90506020020160208101906131fb9190613857565b61323986868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061333d915050565b6133a2565b61332b565b81861480156132525750818414155b156132c65761323e87878381811061326c5761326c613d12565b90506020020160208101906132819190613857565b86866132c187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061333d915050565b613408565b61332b8787838181106132db576132db613d12565b90506020020160208101906132f09190613857565b868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061340892505050565b8061333581613f48565b91505061318f565b604080516001808252818301909252606091600091906020808301908036833701905050905083838151811061337557613375613d12565b60200260200101518160008151811061339057613390613d12565b60209081029190910101529392505050565b60005b8151811015610b15578181815181106133c0576133c0613d12565b6020026020010151836001600160a01b0316856001600160a01b0316600080516020614aab83398151915260405160405180910390a48061340081613f48565b9150506133a5565b60005b82811015611616578151839003613456576134518585858481811061343257613432613d12565b90506020020160208101906134479190613857565b613239858561333d565b613487565b6134878585858481811061346c5761346c613d12565b90506020020160208101906134819190613857565b846133a2565b8061349181613f48565b91505061340b565b8280546134a590613c45565b90600052602060002090601f0160209004810192826134c7576000855561350d565b82601f106134e057805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350d5782518255916020019190600101906134f2565b506135199291506135d4565b5090565b610b2980613f6283390190565b82805461353690613c45565b90600052602060002090601f016020900481019282613558576000855561350d565b82601f106135715782800160ff1982351617855561350d565b8280016001018555821561350d579182015b8281111561350d578235825591602001919060010190613583565b5080546135aa90613c45565b6000825580601f106135ba575050565b601f0160209004906000526020600020908101906117b691905b5b8082111561351957600081556001016135d5565b6001600160e01b0319811681146117b657600080fd5b60006020828403121561361157600080fd5b813561361c816135e9565b9392505050565b6000815180845260005b818110156136495760208185018101518683018201520161362d565b8181111561365b576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061361c6020830184613623565b60006020828403121561369557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146117b657600080fd5b600080604083850312156136d857600080fd5b82356136e3816136b0565b946020939093013593505050565b60008060006060848603121561370657600080fd5b8335613711816136b0565b92506020840135613721816135e9565b929592945050506040919091013590565b60008060006060848603121561374757600080fd5b8335613752816136b0565b92506020840135613721816136b0565b6000806040838503121561377557600080fd5b50508035926020909101359150565b60008083601f84011261379657600080fd5b5081356001600160401b038111156137ad57600080fd5b6020830191508360208285010111156137c557600080fd5b9250929050565b600080600080600080608087890312156137e557600080fd5b86356137f0816136b0565b95506020870135945060408701356001600160401b038082111561381357600080fd5b61381f8a838b01613784565b9096509450606089013591508082111561383857600080fd5b5061384589828a01613784565b979a9699509497509295939492505050565b60006020828403121561386957600080fd5b813561361c816136b0565b6020808252825182820181905260009190848201906040850190845b818110156138b55783516001600160a01b031683529284019291840191600101613890565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126138e857600080fd5b81356001600160401b0380821115613902576139026138c1565b604051601f8301601f19908116603f0116810190828211818310171561392a5761392a6138c1565b8160405283815286602085880101111561394357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561397557600080fd5b81356001600160401b0381111561398b57600080fd5b6130a4848285016138d7565b600080600080604085870312156139ad57600080fd5b84356001600160401b03808211156139c457600080fd5b6139d088838901613784565b909650945060208701359150808211156139e957600080fd5b506139f687828801613784565b95989497509550505050565b600080600060608486031215613a1757600080fd5b833592506020840135613721816136b0565b80151581146117b657600080fd5b60008060408385031215613a4a57600080fd5b8235613a55816136b0565b91506020830135613a6581613a29565b809150509250929050565b600080600080600060808688031215613a8857600080fd5b8535613a93816136b0565b94506020860135613aa3816136b0565b93506040860135925060608601356001600160401b03811115613ac557600080fd5b613ad188828901613784565b969995985093965092949392505050565b60008060408385031215613af557600080fd5b8235915060208301356001600160401b03811115613b1257600080fd5b610fa9858286016138d7565b60008083601f840112613b3057600080fd5b5081356001600160401b03811115613b4757600080fd5b6020830191508360208260051b85010111156137c557600080fd5b60008060008060008060608789031215613b7b57600080fd5b86356001600160401b0380821115613b9257600080fd5b613b9e8a838b01613b1e565b90985096506020890135915080821115613bb757600080fd5b613bc38a838b01613b1e565b90965094506040890135915080821115613bdc57600080fd5b5061384589828a01613b1e565b60008060408385031215613bfc57600080fd5b8235613c07816136b0565b91506020830135613a65816136b0565b60008060408385031215613c2a57600080fd5b8235613c35816136b0565b91506020830135613a65816135e9565b600181811c90821680613c5957607f821691505b60208210810361070d57634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b600060208284031215613ca557600080fd5b815161361c81613a29565b6020808252601b908201527a4e6f74206f776e6572206f722061626c6520746f2062797061737360281b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613d0d57613d0d613ce5565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615613d5857613d58613ce5565b500290565b600082613d7a57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b03858116825284166020820152604081018390526080810160058310613dbc57634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b60408152600080845481600182811c915080831680613deb57607f831692505b60208084108203613e0a57634e487b7160e01b86526022600452602486fd5b6040880184905260608801828015613e295760018114613e3a57613e65565b60ff19871682528282019750613e65565b60008c81526020902060005b87811015613e5f57815484820152908601908401613e46565b83019850505b5050878603818901525050505050613e7d8185613623565b95945050505050565b600060208284031215613e9857600080fd5b815161361c816136b0565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ed690830184613623565b9695505050505050565b600060208284031215613ef257600080fd5b815161361c816135e9565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060018201613f5a57613f5a613ce5565b506001019056fe608060405234801561001057600080fd5b50610b09806100206000396000f3fe60806040526004361061006f5760003560e01c8063715018a6146101545780638129fc1c146101695780638da5cb5b1461017e578063932fe1d5146101b0578063a1a74aae146101d0578063bdd4d18d146101f0578063d71ab4b714610212578063f2fde38b1461023257600080fd5b3661014f576065546100ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b60005b60655481101561014d576000606582815481106100ce576100ce6107b9565b60009182526020918290206040805160608101825292909101546001600160a01b03811680845263ffffffff600160a01b83048116958501869052600160c01b90920490911691830182905291935061013a9261012b90346107e5565b6101359190610804565b610252565b508061014581610826565b9150506100af565b005b600080fd5b34801561016057600080fd5b5061014d610283565b34801561017557600080fd5b5061014d6102be565b34801561018a57600080fd5b506101936103cf565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101bc57600080fd5b5061014d6101cb36600461083f565b6103de565b3480156101dc57600080fd5b5061014d6101eb3660046108b3565b61046d565b3480156101fc57600080fd5b50610205610580565b6040516101a791906108cc565b34801561021e57600080fd5b5061014d61022d366004610938565b610607565b34801561023e57600080fd5b5061014d61024d366004610965565b610674565b600080600080600085875af190508061027e576040516312171d8360e31b815260040160405180910390fd5b505050565b3361028c6103cf565b6001600160a01b0316146102b25760405162461bcd60e51b81526004016100a390610989565b6102bc600061070d565b565b600054610100900460ff16158080156102de5750600054600160ff909116105b806102f85750303b1580156102f8575060005460ff166001145b61035b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100a3565b6000805460ff19166001179055801561037e576000805461ff0019166101001790555b61038661075f565b80156103cc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6033546001600160a01b031690565b336103e76103cf565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016100a390610989565b60005b8181101561027e57606583838381811061042c5761042c6107b9565b8354600181018555600094855260209094206060909102929092019291909101905061045882826109da565b5050808061046590610826565b915050610410565b336104766103cf565b6001600160a01b03161461049c5760405162461bcd60e51b81526004016100a390610989565b606580546104ac90600190610a5b565b815481106104bc576104bc6107b9565b90600052602060002001606582815481106104d9576104d96107b9565b600091825260209091208254910180546001600160a01b039092166001600160a01b031983168117825583546001600160c01b031990931617600160a01b9283900463ffffffff90811690930217808255925463ffffffff60c01b19909316600160c01b93849004909216909202179055606580548061055b5761055b610a72565b600082815260209020810160001990810180546001600160e01b031916905501905550565b60606065805480602002602001604051908101604052809291908181526020016000905b828210156105fe57600084815260209081902060408051606081018252918501546001600160a01b038116835263ffffffff600160a01b8204811684860152600160c01b90910416908201528252600190920191016105a4565b50505050905090565b336106106103cf565b6001600160a01b0316146106365760405162461bcd60e51b81526004016100a390610989565b6065805460018101825560009190915281907f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70161027e82826109da565b3361067d6103cf565b6001600160a01b0316146106a35760405162461bcd60e51b81526004016100a390610989565b6001600160a01b0381166107085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100a3565b6103cc815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107865760405162461bcd60e51b81526004016100a390610a88565b6102bc600054610100900460ff166107b05760405162461bcd60e51b81526004016100a390610a88565b6102bc3361070d565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156107ff576107ff6107cf565b500290565b60008261082157634e487b7160e01b600052601260045260246000fd5b500490565b600060018201610838576108386107cf565b5060010190565b6000806020838503121561085257600080fd5b82356001600160401b038082111561086957600080fd5b818501915085601f83011261087d57600080fd5b81358181111561088c57600080fd5b8660206060830285010111156108a157600080fd5b60209290920196919550909350505050565b6000602082840312156108c557600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561092b57815180516001600160a01b031685528681015163ffffffff90811688870152908601511685850152606090930192908501906001016108e9565b5091979650505050505050565b60006060828403121561094a57600080fd5b50919050565b6001600160a01b03811681146103cc57600080fd5b60006020828403121561097757600080fd5b813561098281610950565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000813563ffffffff811681146109d457600080fd5b92915050565b81356109e581610950565b81546001600160a01b031981166001600160a01b0392909216918217835563ffffffff60a01b610a17602086016109be565b60a01b16808360018060c01b031984161717845563ffffffff60c01b610a3f604087016109be565b60c01b168363ffffffff60e01b84161782171784555050505050565b600082821015610a6d57610a6d6107cf565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220735586bc6f7a7c9de0a44b8fc942dbe287de905a1f341ea0afe599796e67c78b64736f6c634300080d0033165f0fc496c6f74e1376579ffc36bcfc90ef4779c44b9232cf0d606db3cc69d1ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201689a53a2b127f2241ac1db9f1aed44a4803465125954b5502fd900ef15edf7f64736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021a5760003560e01c806301ffc9a71461021f57806306fdde0314610261578063081812fc14610276578063095ea7b314610296578063152f0eb5146102ab57806318160ddd146102be5780631986166f146102d05780631beab0f6146102e357806323b872dd146102f65780632a55205a146103095780632adbc37d1461033b5780632b5173cd146103435780632cf1dacb146103555780632f745c59146103685780632fb102cf1461037b57806330477d361461038e57806340897bbe146103a157806342842e0e146103a957806342966c68146103bc5780634f6ccce7146103cf57806354fd4d50146103e25780636352211e146103e957806370a08231146103fc578063715018a61461040f578063736cd42d1461041757806374478bb31461042a5780637b74297d146104375780637e5b1e24146104575780638129fc1c1461046a57806386575e40146104725780638da5cb5b1461048557806395d89b411461048d5780639713c807146104955780639ad95232146104a8578063a06617cd146104bb578063a22cb465146104db578063a8f1602c146104ee578063b88d4fde1461051b578063bd7f4c8d1461052e578063c87b56dd14610541578063d31af48414610554578063e565fef314610567578063e8a3d4851461057a578063e985e9c514610582578063edf68280146105be578063f2fde38b146105ec575b600080fd5b61024c61022d3660046135ff565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102696105ff565b6040516102589190613670565b610289610284366004613683565b610691565b604051610258919061369c565b6102a96102a43660046136c5565b610713565b005b6102a96102b93660046136c5565b61095e565b6075545b604051908152602001610258565b6102a96102de3660046136f1565b610a30565b6102a96102f13660046136c5565b610b1b565b6102a9610304366004613732565b610cf1565b61031c610317366004613762565b610f28565b604080516001600160a01b039093168352602083019190915201610258565b6102a9610fb3565b60665461024c90610100900460ff1681565b6102a96103633660046136f1565b611049565b6102c26103763660046136c5565b611130565b6102a96103893660046137cc565b6111c7565b607b54610289906001600160a01b031681565b6102a961139a565b6102a96103b7366004613732565b611427565b6102a96103ca366004613683565b611447565b6102c26103dd366004613683565b61161d565b60016102c2565b6102896103f7366004613683565b611685565b6102c261040a366004613857565b6116dd565b6102a9611734565b6102a9610425366004613857565b6117b9565b60665461024c9060ff1681565b61044a610445366004613683565b611854565b6040516102589190613874565b6102a9610465366004613963565b6118c0565b6102a9611985565b6102a9610480366004613997565b611c46565b610289611cdf565b610269611cee565b6102a96104a3366004613a02565b611cfd565b6102696104b6366004613683565b611ea4565b6102c26104c9366004613857565b60696020526000908152604090205481565b6102a96104e9366004613a37565b611f9f565b61024c6104fc3660046136c5565b6001600160a01b03919091166000908152606960205260409020541490565b6102a9610529366004613a70565b6120b5565b6102c261053c366004613857565b6120f7565b61026961054f366004613683565b612102565b6102a9610562366004613ae2565b612177565b6102a9610575366004613b62565b612268565b6102696122ee565b61024c610590366004613be9565b6001600160a01b039182166000908152606e6020908152604080832093909416825291909152205460ff1690565b61024c6105cc366004613c17565b606760209081526000928352604080842090915290825290205460ff1681565b6102a96105fa366004613857565b6122fd565b6060606f805461060e90613c45565b80601f016020809104026020016040519081016040528092919081815260200182805461063a90613c45565b80156106875780601f1061065c57610100808354040283529160200191610687565b820191906000526020600020905b81548152906001019060200180831161066a57829003601f168201915b5050505050905090565b6000818152606b60209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166106f15760405162461bcd60e51b81526004016106e89190613670565b60405180910390fd5b506000838152606c60205260409020546001600160a01b031691505b50919050565b816daaeb6d7670e522a718067333cd4e3b156107bc57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061075c9030908590600401613c79565b602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190613c93565b6107bc5780604051633b79c77360e21b81526004016106e8919061369c565b6000828152606b602052604090205482906001600160a01b03163381148061080757506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906108445760405162461bcd60e51b81526004016106e89190613670565b506000848152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b031661089e5760405162461bcd60e51b81526004016106e89190613670565b506000858152606b6020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b039081169190881682036108fd5760405162461bcd60e51b81526004016106e89190613670565b506000868152606c602052604080822080546001600160a01b0319166001600160a01b038b811691821790925591518993918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050505050565b3360008181526069602052604090205415158061098a57503361097f611cdf565b6001600160a01b0316145b6109e25760405162461bcd60e51b8152602060048201526024808201527f436f6e7472616374206973206e6f742072656769737465726564206e6f72204f6044820152633bb732b960e11b60648201526084016106e8565b506001600160a01b039091166000818152606960209081526040808320859055938252606a8152928120805460018101825590825292902090910180546001600160a01b0319169091179055565b606654600090610100900460ff168015610a6f575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610a7a611cdf565b6001600160a01b03161480610a8c5750805b610aa85760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191660011790558115610b15576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff191660011790555b50505050565b606654600090610100900460ff168015610b5a575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610b65611cdf565b6001600160a01b03161480610b775750805b610b935760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b0383166000908152606960205260409020548390610bf75760405162461bcd60e51b815260206004820152601a60248201527910dbdb9d1c9858dd081a5cc81b9bdd081c9959da5cdd195c995960321b60448201526064016106e8565b6001600160a01b0384166000908152606960209081526040808320548352606a909152902080548190610c2c90600190613cfb565b81548110610c3c57610c3c613d12565b9060005260206000200160009054906101000a90046001600160a01b0316818581548110610c6c57610c6c613d12565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610caa57610caa613d28565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b039690961681526069909552505060408320929092555050565b826daaeb6d7670e522a718067333cd4e3b15610d9a57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610d3a9030908590600401613c79565b602060405180830381865afa158015610d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7b9190613c93565b610d9a5780604051633b79c77360e21b81526004016106e8919061369c565b816000610da56123e7565b6000838152606b6020526040812054919250906001600160a01b031633811480610de557506000848152606c60205260409020546001600160a01b031633145b80610e1357506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b80610e1b5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e585760405162461bcd60e51b81526004016106e89190613670565b506000868152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528791906001600160a01b0316610eb25760405162461bcd60e51b81526004016106e89190613670565b506000878152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908b168214610f115760405162461bcd60e51b81526004016106e89190613670565b50610f1c898961242b565b50505050505050505050565b6000828152607a6020526040812054819081906001600160a01b0316610f4f576079610f5e565b6000858152607a602052604090205b6040805180820190915290546001600160a01b038116808352600160a01b90910462ffffff166020830181905290945090915061271090610f9f9086613d3e565b610fa99190613d5d565b9150509250929050565b606654600090610100900460ff168015610ff2575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610ffd611cdf565b6001600160a01b0316148061100f5750805b61102b5760405162461bcd60e51b81526004016106e890613cb0565b506066805461ff001981166101009182900460ff1615909102179055565b606654600090610100900460ff168015611088575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611093611cdf565b6001600160a01b031614806110a55750805b6110c15760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191690558115610b15576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff1916600117905550505050565b6001600160a01b0382166000908152607760209081526040808320548151808301909252600682526530303530303760d01b928201929092529083106111895760405162461bcd60e51b81526004016106e89190613670565b506001600160a01b03831660009081526077602052604090208054839081106111b4576111b4613d12565b9060005260206000200154905092915050565b606654600090610100900460ff168015611206575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611211611cdf565b6001600160a01b031614806112235750805b61123f5760405162461bcd60e51b81526004016106e890613cb0565b611249878761259e565b6112898686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506125fe92505050565b6112c98684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267792505050565b6003600052606a602052600080516020614a8b833981519152541580159061132f575060036000908152606a602052600080516020614a8b833981519152805433929061131857611318613d12565b6000918252602090912001546001600160a01b0316145b156113915760405163b68c437960e01b8152339063b68c43799061135e906000908b908b908390600401613d7f565b600060405180830381600087803b15801561137857600080fd5b505af115801561138c573d6000803e3d6000fd5b505050505b50505050505050565b606654600090610100900460ff1680156113d9575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336113e4611cdf565b6001600160a01b031614806113f65750805b6114125760405162461bcd60e51b81526004016106e890613cb0565b506066805460ff19811660ff90911615179055565b611442838383604051806020016040528060008152506126f0565b505050565b8060006114526123e7565b6000838152606b6020526040812054919250906001600160a01b03163381148061149257506000848152606c60205260409020546001600160a01b031633145b806114c057506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b806114c85750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115055760405162461bcd60e51b81526004016106e89190613670565b5061150f85612a4e565b6003600052606a602052600080516020614a8b8339815191525415801590611575575060036000908152606a602052600080516020614a8b8339815191528054829061155d5761155d613d12565b6000918252602090912001546001600160a01b031614155b156116165760036000908152606a602052600080516020614a8b83398151915280549091906115a6576115a6613d12565b600091825260208220015460405163b68c437960e01b81526001600160a01b039091169163b68c4379916115e39133918a90600390600401613d7f565b600060405180830381600087803b1580156115fd57600080fd5b505af1158015611611573d6000803e3d6000fd5b505050505b5050505050565b60755460408051808201909152600681526530303530303760d01b6020820152600091831061165f5760405162461bcd60e51b81526004016106e89190613670565b506075828154811061167357611673613d12565b90600052602060002001549050919050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161070d5760405162461bcd60e51b81526004016106e89190613670565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166117245760405162461bcd60e51b81526004016106e89190613670565b5061172e82612b70565b92915050565b606654600090610100900460ff168015611773575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361177e611cdf565b6001600160a01b031614806117905750805b6117ac5760405162461bcd60e51b81526004016106e890613cb0565b6117b66000612b8b565b50565b606654600090610100900460ff1680156117f8575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611803611cdf565b6001600160a01b031614806118155750805b6118315760405162461bcd60e51b81526004016106e890613cb0565b50607b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152606a60209081526040918290208054835181840281018401909452808452606093928301828280156118b457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611896575b50505050509050919050565b606654600090610100900460ff1680156118ff575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361190a611cdf565b6001600160a01b0316148061191c5750805b6119385760405162461bcd60e51b81526004016106e890613cb0565b7fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce60718360405161196a929190613dcb565b60405180910390a18151611442906071906020850190613499565b600154610100900460ff16158080156119a257506001805460ff16105b806119bb5750303b1580156119bb57506001805460ff16145b611a1e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106e8565b6001805460ff1916811790558015611a40576001805461ff0019166101001790555b611a48612bdd565b60408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b6020909201918252611a7e91606f91613499565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b6020909201918252611ab091607091613499565b50611ac1635b5e139f60e01b612c0e565b611ad163780e9d6360e01b612c0e565b611ae16380ac58cd60e01b612c0e565b611af163152a902d60e11b612c0e565b611af9612c8c565b604051611b059061351d565b604051809103906000f080158015611b21573d6000803e3d6000fd5b50607b80546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b5050607b5460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150611bc090339060040161369c565b600060405180830381600087803b158015611bda57600080fd5b505af1158015611bee573d6000803e3d6000fd5b50506066805460ff19166001179055505080156117b6576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b606654600090610100900460ff168015611c85575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611c90611cdf565b6001600160a01b03161480611ca25750805b611cbe5760405162461bcd60e51b81526004016106e890613cb0565b611cca606f868661352a565b50611cd76070848461352a565b505050505050565b6034546001600160a01b031690565b60606070805461060e90613c45565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5f9190613e86565b6001600160a01b0316336001600160a01b031614611dab5760405162461bcd60e51b81526020600482015260096024820152682737ba1027bbb732b960b91b60448201526064016106e8565b612710811115611dfa5760405162461bcd60e51b815260206004820152601a60248201527908aa48664727062a4def2c2d8e8d2cae67440a8dede40d0d2ced60331b60448201526064016106e8565b82600003611e4d57604080518082019091526001600160a01b03831680825262ffffff8316602090920182905260798054600160a01b9093026001600160b81b0319909316909117919091179055505050565b6040805180820182526001600160a01b03938416815262ffffff92831660208083019182526000968752607a905291909420935184549151909216600160a01b026001600160b81b03199091169190921617179055565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611eff5760405162461bcd60e51b81526004016106e89190613670565b5060008381526073602052604090208054611f1990613c45565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4590613c45565b8015611f925780601f10611f6757610100808354040283529160200191611f92565b820191906000526020600020905b815481529060010190602001808311611f7557829003601f168201915b5050505050915050919050565b816daaeb6d7670e522a718067333cd4e3b1561204857604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490611fe89030908590600401613c79565b602060405180830381865afa158015612005573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120299190613c93565b6120485780604051633b79c77360e21b81526004016106e8919061369c565b336000818152606e602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61161685858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f092505050565b600061172e82612b70565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b031661215d5760405162461bcd60e51b81526004016106e89190613670565b5060008381526072602052604090208054611f1990613c45565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166121d05760405162461bcd60e51b81526004016106e89190613670565b50606654600090610100900460ff168015612210575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361221b611cdf565b6001600160a01b0316148061222d5750805b6122495760405162461bcd60e51b81526004016106e890613cb0565b6000848152607260209081526040909120845161161692860190613499565b606654600090610100900460ff1680156122a7575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336122b2611cdf565b6001600160a01b031614806122c45750805b6122e05760405162461bcd60e51b81526004016106e890613cb0565b611391878787878787612d13565b60606071805461060e90613c45565b606654600090610100900460ff16801561233c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612347611cdf565b6001600160a01b031614806123595750805b6123755760405162461bcd60e51b81526004016106e890613cb0565b6001600160a01b0382166123da5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e8565b6123e382612b8b565b5050565b606654600090610100900460ff168015612426575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905090565b6000818152606b60205260409020546001600160a01b031661244c82612d21565b6124568183612d5c565b6124608383612edc565b6003600052606a602052600080516020614a8b83398151915254158015906124c6575060036000908152606a602052600080516020614a8b833981519152805482906124ae576124ae613d12565b6000918252602090912001546001600160a01b031614155b1561256a5760036000908152606a602052600080516020614a8b83398151915280549091906124f7576124f7613d12565b60009182526020909120015460405163b68c437960e01b81526001600160a01b039091169063b68c43799061253790849087908790600190600401613d7f565b600060405180830381600087803b15801561255157600080fd5b505af1158015612565573d6000803e3d6000fd5b505050505b81836001600160a01b0316826001600160a01b0316600080516020614aab83398151915260405160405180910390a4505050565b6125a88282612f9f565b607580546001818101835560008390527f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910183905590546125eb9190613cfb565b6000918252607660205260409091205550565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126575760405162461bcd60e51b81526004016106e89190613670565b5060008381526072602090815260409091208351610b1592850190613499565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126d05760405162461bcd60e51b81526004016106e89190613670565b5060008381526073602090815260409091208351610b1592850190613499565b836daaeb6d7670e522a718067333cd4e3b1561279957604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906127399030908590600401613c79565b602060405180830381865afa158015612756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277a9190613c93565b6127995780604051633b79c77360e21b81526004016106e8919061369c565b8260006127a46123e7565b6000838152606b6020526040812054919250906001600160a01b0316338114806127e457506000848152606c60205260409020546001600160a01b031633145b8061281257506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b8061281a5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906128575760405162461bcd60e51b81526004016106e89190613670565b506000878152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528891906001600160a01b03166128b15760405162461bcd60e51b81526004016106e89190613670565b506000888152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908c1682146129105760405162461bcd60e51b81526004016106e89190613670565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038b166129555760405162461bcd60e51b81526004016106e89190613670565b506129608a8a61242b565b6129728a6001600160a01b0316613070565b1561138c5760006001600160a01b038b1663150b7a02338e8d8d6040518563ffffffff1660e01b81526004016129ab9493929190613ea3565b6020604051808303816000875af11580156129ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ee9190613ee0565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14612a3f5760405162461bcd60e51b81526004016106e89190613670565b50505050505050505050505050565b612a57816130ac565b60008181526072602052604090208054612a7090613c45565b159050612a8e576000818152607260205260408120612a8e9161359e565b60008181526073602052604090208054612aa790613c45565b159050612ac5576000818152607360205260408120612ac59161359e565b600081815260766020526040812054607554909190612ae690600190613cfb565b9050600060758281548110612afd57612afd613d12565b906000526020600020015490508060758481548110612b1e57612b1e613d12565b6000918252602090912001556075805480612b3b57612b3b613d28565b600082815260208082208301600019908101839055909201909255918152607690915260408082209390935592835250812055565b6001600160a01b031660009081526077602052604090205490565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600154610100900460ff16612c045760405162461bcd60e51b81526004016106e890613efd565b612c0c61315c565b565b6001600160e01b03198082169003612c675760405162461bcd60e51b815260206004820152601c60248201527b115490cc4d8d4e881a5b9d985b1a59081a5b9d195c999858d9481a5960221b60448201526064016106e8565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6301ffc9a760e01b60009081526020527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c55460ff1615612d035760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e48149959da5cdd195c995960721b60448201526064016106e8565b612c0c6301ffc9a760e01b612c0e565b611cd786868686868661318c565b6000818152606c60205260409020546001600160a01b0316156117b6576000908152606c6020526040902080546001600160a01b0319169055565b6000818152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03848116911614612db75760405162461bcd60e51b81526004016106e89190613670565b506000818152606b6020908152604080832080546001600160a01b031916905560788252808320546001600160a01b03861684526077909252822054909190612e0290600190613cfb565b9050818114612e99576001600160a01b0384166000908152607760205260408120805483908110612e3557612e35613d12565b906000526020600020015490508060776000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612e7957612e79613d12565b600091825260208083209091019290925591825260789052604090208290555b6001600160a01b0384166000908152607760205260409020805480612ec057612ec0613d28565b6001900381819060005260206000200160009055905550505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615612f335760405162461bcd60e51b81526004016106e89190613670565b506000818152606b6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452607783529083208054600181810183558286529385200185905592529054612f8c9190613cfb565b6000918252607860205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316612fe35760405162461bcd60e51b81526004016106e89190613670565b506000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561303b5760405162461bcd60e51b81526004016106e89190613670565b506130468282612edc565b60405181906001600160a01b03841690600090600080516020614aab833981519152908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906130a45750808214155b949350505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b03166131055760405162461bcd60e51b81526004016106e89190613670565b506000828152606b60205260409020546001600160a01b031661312783612d21565b6131318184612d5c565b60405183906000906001600160a01b03841690600080516020614aab833981519152908390a4505050565b600154610100900460ff166131835760405162461bcd60e51b81526004016106e890613efd565b612c0c33612b8b565b60005b858110156113915781861480156131a557508184145b156132435761323e8787838181106131bf576131bf613d12565b90506020020160208101906131d49190613857565b8686848181106131e6576131e6613d12565b90506020020160208101906131fb9190613857565b61323986868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061333d915050565b6133a2565b61332b565b81861480156132525750818414155b156132c65761323e87878381811061326c5761326c613d12565b90506020020160208101906132819190613857565b86866132c187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061333d915050565b613408565b61332b8787838181106132db576132db613d12565b90506020020160208101906132f09190613857565b868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061340892505050565b8061333581613f48565b91505061318f565b604080516001808252818301909252606091600091906020808301908036833701905050905083838151811061337557613375613d12565b60200260200101518160008151811061339057613390613d12565b60209081029190910101529392505050565b60005b8151811015610b15578181815181106133c0576133c0613d12565b6020026020010151836001600160a01b0316856001600160a01b0316600080516020614aab83398151915260405160405180910390a48061340081613f48565b9150506133a5565b60005b82811015611616578151839003613456576134518585858481811061343257613432613d12565b90506020020160208101906134479190613857565b613239858561333d565b613487565b6134878585858481811061346c5761346c613d12565b90506020020160208101906134819190613857565b846133a2565b8061349181613f48565b91505061340b565b8280546134a590613c45565b90600052602060002090601f0160209004810192826134c7576000855561350d565b82601f106134e057805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350d5782518255916020019190600101906134f2565b506135199291506135d4565b5090565b610b2980613f6283390190565b82805461353690613c45565b90600052602060002090601f016020900481019282613558576000855561350d565b82601f106135715782800160ff1982351617855561350d565b8280016001018555821561350d579182015b8281111561350d578235825591602001919060010190613583565b5080546135aa90613c45565b6000825580601f106135ba575050565b601f0160209004906000526020600020908101906117b691905b5b8082111561351957600081556001016135d5565b6001600160e01b0319811681146117b657600080fd5b60006020828403121561361157600080fd5b813561361c816135e9565b9392505050565b6000815180845260005b818110156136495760208185018101518683018201520161362d565b8181111561365b576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061361c6020830184613623565b60006020828403121561369557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146117b657600080fd5b600080604083850312156136d857600080fd5b82356136e3816136b0565b946020939093013593505050565b60008060006060848603121561370657600080fd5b8335613711816136b0565b92506020840135613721816135e9565b929592945050506040919091013590565b60008060006060848603121561374757600080fd5b8335613752816136b0565b92506020840135613721816136b0565b6000806040838503121561377557600080fd5b50508035926020909101359150565b60008083601f84011261379657600080fd5b5081356001600160401b038111156137ad57600080fd5b6020830191508360208285010111156137c557600080fd5b9250929050565b600080600080600080608087890312156137e557600080fd5b86356137f0816136b0565b95506020870135945060408701356001600160401b038082111561381357600080fd5b61381f8a838b01613784565b9096509450606089013591508082111561383857600080fd5b5061384589828a01613784565b979a9699509497509295939492505050565b60006020828403121561386957600080fd5b813561361c816136b0565b6020808252825182820181905260009190848201906040850190845b818110156138b55783516001600160a01b031683529284019291840191600101613890565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126138e857600080fd5b81356001600160401b0380821115613902576139026138c1565b604051601f8301601f19908116603f0116810190828211818310171561392a5761392a6138c1565b8160405283815286602085880101111561394357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561397557600080fd5b81356001600160401b0381111561398b57600080fd5b6130a4848285016138d7565b600080600080604085870312156139ad57600080fd5b84356001600160401b03808211156139c457600080fd5b6139d088838901613784565b909650945060208701359150808211156139e957600080fd5b506139f687828801613784565b95989497509550505050565b600080600060608486031215613a1757600080fd5b833592506020840135613721816136b0565b80151581146117b657600080fd5b60008060408385031215613a4a57600080fd5b8235613a55816136b0565b91506020830135613a6581613a29565b809150509250929050565b600080600080600060808688031215613a8857600080fd5b8535613a93816136b0565b94506020860135613aa3816136b0565b93506040860135925060608601356001600160401b03811115613ac557600080fd5b613ad188828901613784565b969995985093965092949392505050565b60008060408385031215613af557600080fd5b8235915060208301356001600160401b03811115613b1257600080fd5b610fa9858286016138d7565b60008083601f840112613b3057600080fd5b5081356001600160401b03811115613b4757600080fd5b6020830191508360208260051b85010111156137c557600080fd5b60008060008060008060608789031215613b7b57600080fd5b86356001600160401b0380821115613b9257600080fd5b613b9e8a838b01613b1e565b90985096506020890135915080821115613bb757600080fd5b613bc38a838b01613b1e565b90965094506040890135915080821115613bdc57600080fd5b5061384589828a01613b1e565b60008060408385031215613bfc57600080fd5b8235613c07816136b0565b91506020830135613a65816136b0565b60008060408385031215613c2a57600080fd5b8235613c35816136b0565b91506020830135613a65816135e9565b600181811c90821680613c5957607f821691505b60208210810361070d57634e487b7160e01b600052602260045260246000fd5b6001600160a01b0392831681529116602082015260400190565b600060208284031215613ca557600080fd5b815161361c81613a29565b6020808252601b908201527a4e6f74206f776e6572206f722061626c6520746f2062797061737360281b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613d0d57613d0d613ce5565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615613d5857613d58613ce5565b500290565b600082613d7a57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b03858116825284166020820152604081018390526080810160058310613dbc57634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b60408152600080845481600182811c915080831680613deb57607f831692505b60208084108203613e0a57634e487b7160e01b86526022600452602486fd5b6040880184905260608801828015613e295760018114613e3a57613e65565b60ff19871682528282019750613e65565b60008c81526020902060005b87811015613e5f57815484820152908601908401613e46565b83019850505b5050878603818901525050505050613e7d8185613623565b95945050505050565b600060208284031215613e9857600080fd5b815161361c816136b0565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ed690830184613623565b9695505050505050565b600060208284031215613ef257600080fd5b815161361c816135e9565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060018201613f5a57613f5a613ce5565b506001019056fe608060405234801561001057600080fd5b50610b09806100206000396000f3fe60806040526004361061006f5760003560e01c8063715018a6146101545780638129fc1c146101695780638da5cb5b1461017e578063932fe1d5146101b0578063a1a74aae146101d0578063bdd4d18d146101f0578063d71ab4b714610212578063f2fde38b1461023257600080fd5b3661014f576065546100ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b60005b60655481101561014d576000606582815481106100ce576100ce6107b9565b60009182526020918290206040805160608101825292909101546001600160a01b03811680845263ffffffff600160a01b83048116958501869052600160c01b90920490911691830182905291935061013a9261012b90346107e5565b6101359190610804565b610252565b508061014581610826565b9150506100af565b005b600080fd5b34801561016057600080fd5b5061014d610283565b34801561017557600080fd5b5061014d6102be565b34801561018a57600080fd5b506101936103cf565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101bc57600080fd5b5061014d6101cb36600461083f565b6103de565b3480156101dc57600080fd5b5061014d6101eb3660046108b3565b61046d565b3480156101fc57600080fd5b50610205610580565b6040516101a791906108cc565b34801561021e57600080fd5b5061014d61022d366004610938565b610607565b34801561023e57600080fd5b5061014d61024d366004610965565b610674565b600080600080600085875af190508061027e576040516312171d8360e31b815260040160405180910390fd5b505050565b3361028c6103cf565b6001600160a01b0316146102b25760405162461bcd60e51b81526004016100a390610989565b6102bc600061070d565b565b600054610100900460ff16158080156102de5750600054600160ff909116105b806102f85750303b1580156102f8575060005460ff166001145b61035b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100a3565b6000805460ff19166001179055801561037e576000805461ff0019166101001790555b61038661075f565b80156103cc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6033546001600160a01b031690565b336103e76103cf565b6001600160a01b03161461040d5760405162461bcd60e51b81526004016100a390610989565b60005b8181101561027e57606583838381811061042c5761042c6107b9565b8354600181018555600094855260209094206060909102929092019291909101905061045882826109da565b5050808061046590610826565b915050610410565b336104766103cf565b6001600160a01b03161461049c5760405162461bcd60e51b81526004016100a390610989565b606580546104ac90600190610a5b565b815481106104bc576104bc6107b9565b90600052602060002001606582815481106104d9576104d96107b9565b600091825260209091208254910180546001600160a01b039092166001600160a01b031983168117825583546001600160c01b031990931617600160a01b9283900463ffffffff90811690930217808255925463ffffffff60c01b19909316600160c01b93849004909216909202179055606580548061055b5761055b610a72565b600082815260209020810160001990810180546001600160e01b031916905501905550565b60606065805480602002602001604051908101604052809291908181526020016000905b828210156105fe57600084815260209081902060408051606081018252918501546001600160a01b038116835263ffffffff600160a01b8204811684860152600160c01b90910416908201528252600190920191016105a4565b50505050905090565b336106106103cf565b6001600160a01b0316146106365760405162461bcd60e51b81526004016100a390610989565b6065805460018101825560009190915281907f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70161027e82826109da565b3361067d6103cf565b6001600160a01b0316146106a35760405162461bcd60e51b81526004016100a390610989565b6001600160a01b0381166107085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100a3565b6103cc815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107865760405162461bcd60e51b81526004016100a390610a88565b6102bc600054610100900460ff166107b05760405162461bcd60e51b81526004016100a390610a88565b6102bc3361070d565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156107ff576107ff6107cf565b500290565b60008261082157634e487b7160e01b600052601260045260246000fd5b500490565b600060018201610838576108386107cf565b5060010190565b6000806020838503121561085257600080fd5b82356001600160401b038082111561086957600080fd5b818501915085601f83011261087d57600080fd5b81358181111561088c57600080fd5b8660206060830285010111156108a157600080fd5b60209290920196919550909350505050565b6000602082840312156108c557600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561092b57815180516001600160a01b031685528681015163ffffffff90811688870152908601511685850152606090930192908501906001016108e9565b5091979650505050505050565b60006060828403121561094a57600080fd5b50919050565b6001600160a01b03811681146103cc57600080fd5b60006020828403121561097757600080fd5b813561098281610950565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000813563ffffffff811681146109d457600080fd5b92915050565b81356109e581610950565b81546001600160a01b031981166001600160a01b0392909216918217835563ffffffff60a01b610a17602086016109be565b60a01b16808360018060c01b031984161717845563ffffffff60c01b610a3f604087016109be565b60c01b168363ffffffff60e01b84161782171784555050505050565b600082821015610a6d57610a6d6107cf565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea2646970667358221220735586bc6f7a7c9de0a44b8fc942dbe287de905a1f341ea0afe599796e67c78b64736f6c634300080d0033165f0fc496c6f74e1376579ffc36bcfc90ef4779c44b9232cf0d606db3cc69d1ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201689a53a2b127f2241ac1db9f1aed44a4803465125954b5502fd900ef15edf7f64736f6c634300080d0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.