Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 17518436 | 377 days ago | IN | Create: EmblemVault | 0 ETH | 0.0616639 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
EmblemVault
Compiler Version
v0.8.4+commit.c7e474f2
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.4; 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 = canBypassForTokenId(_tokenId); 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; } 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 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: 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: CLOSED - Pending Licensing Audit pragma solidity ^0.8.4; import "./IsClaimable.sol"; abstract contract IsBypassable is IsClaimable { bool byPassable; mapping(address => mapping(bytes4 => bool)) 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; 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: 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; 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; 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: 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.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: MIT pragma solidity ^0.8.4; import {IOperatorFilterRegistry} from "../IOperatorFilterRegistry.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@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); } } _; } }
// 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 // 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: MIT // OpenZeppelin Contracts (last updated v4.7.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. Equivalent to `reinitializer(1)`. */ 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. * * `initializer` is equivalent to `reinitializer(1)`, so 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. * * 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. */ 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. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 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; 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: MIT pragma solidity ^0.8.4; 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); }
{ "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":[{"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
608060405234801561001057600080fd5b50614c3a806100206000396000f3fe608060405234801561001057600080fd5b50600436106102045760003560e01c806301ffc9a71461020957806306fdde031461024b578063081812fc14610260578063095ea7b314610280578063152f0eb51461029557806318160ddd146102a85780631986166f146102ba5780631beab0f6146102cd57806323b872dd146102e05780632a55205a146102f35780632adbc37d146103255780632cf1dacb1461032d5780632f745c59146103405780632fb102cf1461035357806330477d361461036657806340897bbe1461037957806342842e0e1461038157806342966c68146103945780634f6ccce7146103a757806354fd4d50146103ba5780636352211e146103c157806370a08231146103d4578063715018a6146103e7578063736cd42d146103ef57806374478bb3146104025780637b74297d1461040f5780637e5b1e241461042f5780638129fc1c1461044257806386575e401461044a5780638da5cb5b1461045d57806395d89b41146104655780639713c8071461046d5780639ad9523214610480578063a06617cd14610493578063a22cb465146104b3578063a8f1602c146104c6578063b88d4fde146104f3578063bd7f4c8d14610506578063c87b56dd14610519578063d31af4841461052c578063e565fef31461053f578063e8a3d48514610552578063e985e9c51461055a578063f2fde38b14610596575b600080fd5b610236610217366004613b74565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102536105a9565b6040516102429190613e2e565b61027361026e366004613c46565b61063b565b6040516102429190613d2a565b61029361028e366004613a22565b6106bd565b005b6102936102a3366004613a22565b610918565b6075545b604051908152602001610242565b6102936102c83660046139f3565b6109ea565b6102936102db366004613a22565b610ad5565b6102936102ee366004613916565b610cd5565b610306610301366004613cbe565b610f1c565b604080516001600160a01b039093168352602083019190915201610242565b610293610fa7565b61029361033b3660046139f3565b61103d565b6102ac61034e366004613a22565b611124565b610293610361366004613a4d565b6111c9565b607b54610273906001600160a01b031681565b6102936113aa565b61029361038f366004613916565b611437565b6102936103a2366004613c46565b611457565b6102ac6103b5366004613c46565b61164a565b60016102ac565b6102736103cf366004613c46565b6116c0565b6102ac6103e236600461389f565b611718565b61029361176f565b6102936103fd36600461389f565b6117f4565b6066546102369060ff1681565b61042261041d366004613c46565b61188f565b6040516102429190613de1565b61029361043d366004613c14565b6118fb565b6102936119c0565b610293610458366004613bac565b611c81565b610273611d1a565b610253611d29565b61029361047b366004613c5e565b611d38565b61025361048e366004613c46565b611eeb565b6102ac6104a136600461389f565b60696020526000908152604090205481565b6102936104c13660046139c6565b611fe6565b6102366104d4366004613a22565b6001600160a01b03919091166000908152606960205260409020541490565b610293610501366004613956565b61210b565b6102ac61051436600461389f565b61214d565b610253610527366004613c46565b612158565b61029361053a366004613c84565b6121cd565b61029361054d366004613ad5565b6122be565b610253612344565b6102366105683660046138de565b6001600160a01b039182166000908152606e6020908152604080832093909416825291909152205460ff1690565b6102936105a436600461389f565b612353565b6060606f80546105b890613fd2565b80601f01602080910402602001604051908101604052809291908181526020018280546105e490613fd2565b80156106315780601f1061060657610100808354040283529160200191610631565b820191906000526020600020905b81548152906001019060200180831161061457829003601f168201915b5050505050905090565b6000818152606b60209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b031661069b5760405162461bcd60e51b81526004016106929190613e2e565b60405180910390fd5b506000838152606c60205260409020546001600160a01b031691505b50919050565b816daaeb6d7670e522a718067333cd4e3b1561077557604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906107069030908590600401613d3e565b60206040518083038186803b15801561071e57600080fd5b505afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190613b58565b6107755780604051633b79c77360e21b81526004016106929190613d2a565b6000828152606b602052604090205482906001600160a01b0316338114806107c057506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906107fd5760405162461bcd60e51b81526004016106929190613e2e565b506000848152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166108575760405162461bcd60e51b81526004016106929190613e2e565b506000858152606b6020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919088168214156108b75760405162461bcd60e51b81526004016106929190613e2e565b506000868152606c602052604080822080546001600160a01b0319166001600160a01b038b811691821790925591518993918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050505050565b33600081815260696020526040902054151580610944575033610939611d1a565b6001600160a01b0316145b61099c5760405162461bcd60e51b8152602060048201526024808201527f436f6e7472616374206973206e6f742072656769737465726564206e6f72204f6044820152633bb732b960e11b6064820152608401610692565b506001600160a01b039091166000818152606960209081526040808320859055938252606a8152928120805460018101825590825292902090910180546001600160a01b0319169091179055565b606654600090610100900460ff168015610a29575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610a34611d1a565b6001600160a01b03161480610a465750805b610a625760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191660011790558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff191660011790555b50505050565b606654600090610100900460ff168015610b14575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610b1f611d1a565b6001600160a01b03161480610b315750805b610b4d5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0383166000908152606960205260409020548390610bb15760405162461bcd60e51b815260206004820152601a60248201527910dbdb9d1c9858dd081a5cc81b9bdd081c9959da5cdd195c995960321b6044820152606401610692565b6001600160a01b0384166000908152606960209081526040808320548352606a909152902080548190610be690600190613fbb565b81548110610c0457634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316818581548110610c4257634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610c8e57634e487b7160e01b600052603160045260246000fd5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b039690961681526069909552505060408320929092555050565b826daaeb6d7670e522a718067333cd4e3b15610d8d57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610d1e9030908590600401613d3e565b60206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190613b58565b610d8d5780604051633b79c77360e21b81526004016106929190613d2a565b816000610d998261243d565b6000838152606b6020526040812054919250906001600160a01b031633811480610dd957506000848152606c60205260409020546001600160a01b031633145b80610e0757506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b80610e0f5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e4c5760405162461bcd60e51b81526004016106929190613e2e565b506000868152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528791906001600160a01b0316610ea65760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908b168214610f055760405162461bcd60e51b81526004016106929190613e2e565b50610f108989612482565b50505050505050505050565b6000828152607a6020526040812054819081906001600160a01b0316610f43576079610f52565b6000858152607a602052604090205b6040805180820190915290546001600160a01b038116808352600160a01b90910462ffffff166020830181905290945090915061271090610f939086613f9c565b610f9d9190613f7c565b9150509250929050565b606654600090610100900460ff168015610fe6575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610ff1611d1a565b6001600160a01b031614806110035750805b61101f5760405162461bcd60e51b815260040161069290613efc565b506066805461ff001981166101009182900460ff1615909102179055565b606654600090610100900460ff16801561107c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611087611d1a565b6001600160a01b031614806110995750805b6110b55760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191690558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff1916600117905550505050565b6001600160a01b0382166000908152607760209081526040808320548151808301909252600682526530303530303760d01b9282019290925290831061117d5760405162461bcd60e51b81526004016106929190613e2e565b506001600160a01b03831660009081526077602052604090208054839081106111b657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b606654600090610100900460ff168015611208575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611213611d1a565b6001600160a01b031614806112255750805b6112415760405162461bcd60e51b815260040161069290613efc565b61124b8787612611565b61128b8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267192505050565b6112cb8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126ea92505050565b6003600052606a602052600080516020614bc5833981519152541580159061133f575060036000908152606a602052600080516020614bc5833981519152805433929061132857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b156113a15760405163b68c437960e01b8152339063b68c43799061136e906000908b908b908390600401613d95565b600060405180830381600087803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b505050505b50505050505050565b606654600090610100900460ff1680156113e9575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336113f4611d1a565b6001600160a01b031614806114065750805b6114225760405162461bcd60e51b815260040161069290613efc565b506066805460ff19811660ff90911615179055565b61145283838360405180602001604052806000815250612763565b505050565b8060006114638261243d565b6000838152606b6020526040812054919250906001600160a01b0316338114806114a357506000848152606c60205260409020546001600160a01b031633145b806114d157506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b806114d95750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115165760405162461bcd60e51b81526004016106929190613e2e565b5061152085612ae0565b6003600052606a602052600080516020614bc58339815191525415801590611594575060036000908152606a602052600080516020614bc58339815191528054829061157c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156116435760036000908152606a602052600080516020614bc583398151915280549091906115d357634e487b7160e01b600052603260045260246000fd5b600091825260208220015460405163b68c437960e01b81526001600160a01b039091169163b68c4379916116109133918a90600390600401613d95565b600060405180830381600087803b15801561162a57600080fd5b505af115801561163e573d6000803e3d6000fd5b505050505b5050505050565b60755460408051808201909152600681526530303530303760d01b6020820152600091831061168c5760405162461bcd60e51b81526004016106929190613e2e565b50607582815481106116ae57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816106b75760405162461bcd60e51b81526004016106929190613e2e565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b03831661175f5760405162461bcd60e51b81526004016106929190613e2e565b5061176982612c2c565b92915050565b606654600090610100900460ff1680156117ae575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336117b9611d1a565b6001600160a01b031614806117cb5750805b6117e75760405162461bcd60e51b815260040161069290613efc565b6117f16000612c47565b50565b606654600090610100900460ff168015611833575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361183e611d1a565b6001600160a01b031614806118505750805b61186c5760405162461bcd60e51b815260040161069290613efc565b50607b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152606a60209081526040918290208054835181840281018401909452808452606093928301828280156118ef57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118d1575b50505050509050919050565b606654600090610100900460ff16801561193a575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611945611d1a565b6001600160a01b031614806119575750805b6119735760405162461bcd60e51b815260040161069290613efc565b7fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce6071836040516119a5929190613e41565b60405180910390a18151611452906071906020850190613641565b600154610100900460ff16158080156119dd57506001805460ff16105b806119f65750303b1580156119f657506001805460ff16145b611a595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610692565b6001805460ff1916811790558015611a7b576001805461ff0019166101001790555b611a83612c99565b60408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b6020909201918252611ab991606f91613641565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b6020909201918252611aeb91607091613641565b50611afc635b5e139f60e01b612cca565b611b0c63780e9d6360e01b612cca565b611b1c6380ac58cd60e01b612cca565b611b2c63152a902d60e11b612cca565b611b34612d48565b604051611b40906136c5565b604051809103906000f080158015611b5c573d6000803e3d6000fd5b50607b80546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b5050607b5460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150611bfb903390600401613d2a565b600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50506066805460ff19166001179055505080156117f1576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b606654600090610100900460ff168015611cc0575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611ccb611d1a565b6001600160a01b03161480611cdd5750805b611cf95760405162461bcd60e51b815260040161069290613efc565b611d05606f86866136d2565b50611d12607084846136d2565b505050505050565b6034546001600160a01b031690565b6060607080546105b890613fd2565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da991906138c2565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b81526020600482015260096024820152682737ba1027bbb732b960b91b6044820152606401610692565b612710811115611e445760405162461bcd60e51b815260206004820152601a60248201527908aa48664727062a4def2c2d8e8d2cae67440a8dede40d0d2ced60331b6044820152606401610692565b82611e9457604080518082019091526001600160a01b03831680825262ffffff8316602090920182905260798054600160a01b9093026001600160b81b0319909316909117919091179055505050565b6040805180820182526001600160a01b03938416815262ffffff92831660208083019182526000968752607a905291909420935184549151909216600160a01b026001600160b81b03199091169190921617179055565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611f465760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602052604090208054611f6090613fd2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8c90613fd2565b8015611fd95780601f10611fae57610100808354040283529160200191611fd9565b820191906000526020600020905b815481529060010190602001808311611fbc57829003601f168201915b5050505050915050919050565b816daaeb6d7670e522a718067333cd4e3b1561209e57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061202f9030908590600401613d3e565b60206040518083038186803b15801561204757600080fd5b505afa15801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f9190613b58565b61209e5780604051633b79c77360e21b81526004016106929190613d2a565b336000818152606e602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61164385858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276392505050565b600061176982612c2c565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166121b35760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602052604090208054611f6090613fd2565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166122265760405162461bcd60e51b81526004016106929190613e2e565b50606654600090610100900460ff168015612266575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612271611d1a565b6001600160a01b031614806122835750805b61229f5760405162461bcd60e51b815260040161069290613efc565b6000848152607260209081526040909120845161164392860190613641565b606654600090610100900460ff1680156122fd575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612308611d1a565b6001600160a01b0316148061231a5750805b6123365760405162461bcd60e51b815260040161069290613efc565b6113a1878787878787612dcf565b6060607180546105b890613fd2565b606654600090610100900460ff168015612392575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361239d611d1a565b6001600160a01b031614806123af5750805b6123cb5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0382166124305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610692565b61243982612c47565b5050565b606654600090610100900460ff16801561245a575061245a612ddd565b8015611769575050336000908152606860209081526040808320938352929052205460ff1690565b6000818152606b60205260409020546001600160a01b03166124a382612e21565b6124ad8183612e5c565b6124b78383613006565b6003600052606a602052600080516020614bc5833981519152541580159061252b575060036000908152606a602052600080516020614bc58339815191528054829061251357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156125dd5760036000908152606a602052600080516020614bc5833981519152805490919061256a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405163b68c437960e01b81526001600160a01b039091169063b68c4379906125aa90849087908790600190600401613d95565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050505b81836001600160a01b0316826001600160a01b0316600080516020614be583398151915260405160405180910390a4505050565b61261b82826130c9565b607580546001818101835560008390527f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea909101839055905461265e9190613fbb565b6000918252607660205260409091205550565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126ca5760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602090815260409091208351610acf92850190613641565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166127435760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602090815260409091208351610acf92850190613641565b836daaeb6d7670e522a718067333cd4e3b1561281b57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906127ac9030908590600401613d3e565b60206040518083038186803b1580156127c457600080fd5b505afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fc9190613b58565b61281b5780604051633b79c77360e21b81526004016106929190613d2a565b8260006128278261243d565b6000838152606b6020526040812054919250906001600160a01b03163381148061286757506000848152606c60205260409020546001600160a01b031633145b8061289557506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b8061289d5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906128da5760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528891906001600160a01b03166129345760405162461bcd60e51b81526004016106929190613e2e565b506000888152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908c1682146129935760405162461bcd60e51b81526004016106929190613e2e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038b166129d85760405162461bcd60e51b81526004016106929190613e2e565b506129e38a8a612482565b6129f58a6001600160a01b031661319a565b1561139c5760006001600160a01b038b1663150b7a02338e8d8d6040518563ffffffff1660e01b8152600401612a2e9493929190613d58565b602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613b90565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14612ad15760405162461bcd60e51b81526004016106929190613e2e565b50505050505050505050505050565b612ae9816131d6565b60008181526072602052604090208054612b0290613fd2565b159050612b20576000818152607260205260408120612b2091613746565b60008181526073602052604090208054612b3990613fd2565b159050612b57576000818152607360205260408120612b5791613746565b600081815260766020526040812054607554909190612b7890600190613fbb565b9050600060758281548110612b9d57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060758481548110612bcc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556075805480612bf757634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255918152607690915260408082209390935592835250812055565b6001600160a01b031660009081526077602052604090205490565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600154610100900460ff16612cc05760405162461bcd60e51b815260040161069290613f31565b612cc8613286565b565b6001600160e01b03198082161415612d235760405162461bcd60e51b815260206004820152601c60248201527b115490cc4d8d4e881a5b9d985b1a59081a5b9d195c999858d9481a5960221b6044820152606401610692565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6301ffc9a760e01b60009081526020527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c55460ff1615612dbf5760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e48149959da5cdd195c995960721b6044820152606401610692565b612cc86301ffc9a760e01b612cca565b611d128686868686866132b6565b606654600090610100900460ff168015612e1c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905090565b6000818152606c60205260409020546001600160a01b0316156117f1576000908152606c6020526040902080546001600160a01b0319169055565b6000818152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03848116911614612eb75760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b031916905560788252808320546001600160a01b03861684526077909252822054909190612f0290600190613fbb565b9050818114612fb5576001600160a01b0384166000908152607760205260408120805483908110612f4357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060776000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612f9557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925591825260789052604090208290555b6001600160a01b0384166000908152607760205260409020805480612fea57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561305d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526077835290832080546001818101835582865293852001859055925290546130b69190613fbb565b6000918252607860205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661310d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156131655760405162461bcd60e51b81526004016106929190613e2e565b506131708282613006565b60405181906001600160a01b03841690600090600080516020614be5833981519152908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906131ce5750808214155b949350505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b031661322f5760405162461bcd60e51b81526004016106929190613e2e565b506000828152606b60205260409020546001600160a01b031661325183612e21565b61325b8184612e5c565b60405183906000906001600160a01b03841690600080516020614be5833981519152908390a4505050565b600154610100900460ff166132ad5760405162461bcd60e51b815260040161069290613f31565b612cc833612c47565b60005b858110156113a15781861480156132cf57508184145b15613389576133848787838181106132f757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061330c919061389f565b86868481811061332c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613341919061389f565b61337f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061349f915050565b613520565b61348d565b81861480156133985750818414155b1561341a576133848787838181106133c057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906133d5919061389f565b868661341587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061349f915050565b613594565b61348d87878381811061343d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613452919061389f565b868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061359492505050565b8061349781614007565b9150506132b9565b60408051600180825281830190925260609160009190602080830190803683370190505090508383815181106134e557634e487b7160e01b600052603260045260246000fd5b60200260200101518160008151811061350e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101529392505050565b60005b8151811015610acf5781818151811061354c57634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b0316856001600160a01b0316600080516020614be583398151915260405160405180910390a48061358c81614007565b915050613523565b60005b828110156116435781518314156135f0576135eb858585848181106135cc57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906135e1919061389f565b61337f858561349f565b61362f565b61362f8585858481811061361457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613629919061389f565b84613520565b8061363981614007565b915050613597565b82805461364d90613fd2565b90600052602060002090601f01602090048101928261366f57600085556136b5565b82601f1061368857805160ff19168380011785556136b5565b828001600101855582156136b5579182015b828111156136b557825182559160200191906001019061369a565b506136c192915061377c565b5090565b610b3d8061408883390190565b8280546136de90613fd2565b90600052602060002090601f01602090048101928261370057600085556136b5565b82601f106137195782800160ff198235161785556136b5565b828001600101855582156136b5579182015b828111156136b557823582559160200191906001019061372b565b50805461375290613fd2565b6000825580601f10613762575050565b601f0160209004906000526020600020908101906117f191905b5b808211156136c1576000815560010161377d565b60008083601f8401126137a2578081fd5b5081356001600160401b038111156137b8578182fd5b6020830191508360208260051b85010111156137d357600080fd5b9250929050565b60008083601f8401126137eb578182fd5b5081356001600160401b03811115613801578182fd5b6020830191508360208285010111156137d357600080fd5b600082601f830112613829578081fd5b81356001600160401b038082111561384357613843614038565b604051601f8301601f19908116603f0116810190828211818310171561386b5761386b614038565b81604052838152866020858801011115613883578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156138b0578081fd5b81356138bb8161404e565b9392505050565b6000602082840312156138d3578081fd5b81516138bb8161404e565b600080604083850312156138f0578081fd5b82356138fb8161404e565b9150602083013561390b8161404e565b809150509250929050565b60008060006060848603121561392a578081fd5b83356139358161404e565b925060208401356139458161404e565b929592945050506040919091013590565b60008060008060006080868803121561396d578081fd5b85356139788161404e565b945060208601356139888161404e565b93506040860135925060608601356001600160401b038111156139a9578182fd5b6139b5888289016137da565b969995985093965092949392505050565b600080604083850312156139d8578182fd5b82356139e38161404e565b9150602083013561390b81614063565b600080600060608486031215613a07578283fd5b8335613a128161404e565b9250602084013561394581614071565b60008060408385031215613a34578182fd5b8235613a3f8161404e565b946020939093013593505050565b60008060008060008060808789031215613a65578081fd5b8635613a708161404e565b95506020870135945060408701356001600160401b0380821115613a92578283fd5b613a9e8a838b016137da565b90965094506060890135915080821115613ab6578283fd5b50613ac389828a016137da565b979a9699509497509295939492505050565b60008060008060008060608789031215613aed578384fd5b86356001600160401b0380821115613b03578586fd5b613b0f8a838b01613791565b90985096506020890135915080821115613b27578586fd5b613b338a838b01613791565b90965094506040890135915080821115613b4b578384fd5b50613ac389828a01613791565b600060208284031215613b69578081fd5b81516138bb81614063565b600060208284031215613b85578081fd5b81356138bb81614071565b600060208284031215613ba1578081fd5b81516138bb81614071565b60008060008060408587031215613bc1578182fd5b84356001600160401b0380821115613bd7578384fd5b613be3888389016137da565b90965094506020870135915080821115613bfb578384fd5b50613c08878288016137da565b95989497509550505050565b600060208284031215613c25578081fd5b81356001600160401b03811115613c3a578182fd5b6131ce84828501613819565b600060208284031215613c57578081fd5b5035919050565b600080600060608486031215613c72578081fd5b8335925060208401356139458161404e565b60008060408385031215613c96578182fd5b8235915060208301356001600160401b03811115613cb2578182fd5b610f9d85828601613819565b60008060408385031215613cd0578182fd5b50508035926020909101359150565b60008151808452815b81811015613d0457602081850181015186830182015201613ce8565b81811115613d155782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8b90830184613cdf565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080810160058310613dd257634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e225783516001600160a01b031683529284019291840191600101613dfd565b50909695505050505050565b6020815260006138bb6020830184613cdf565b60408152600080845482600182811c915080831680613e6157607f831692505b6020808410821415613e8157634e487b7160e01b87526022600452602487fd5b6040880184905260608801828015613ea05760018114613eb157613edb565b60ff19871682528282019750613edb565b60008c815260209020895b87811015613ed557815484820152908601908401613ebc565b83019850505b5050878603818901525050505050613ef38185613cdf565b95945050505050565b6020808252601b908201527a4e6f74206f776e6572206f722061626c6520746f2062797061737360281b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082613f9757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613fb657613fb6614022565b500290565b600082821015613fcd57613fcd614022565b500390565b600181811c90821680613fe657607f821691505b602082108114156106b757634e487b7160e01b600052602260045260246000fd5b600060001982141561401b5761401b614022565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146117f157600080fd5b80151581146117f157600080fd5b6001600160e01b0319811681146117f157600080fdfe608060405234801561001057600080fd5b50610b1d806100206000396000f3fe60806040526004361061006f5760003560e01c8063715018a6146101635780638129fc1c1461017a5780638da5cb5b1461018f578063932fe1d5146101c1578063a1a74aae146101e1578063bdd4d18d14610201578063d71ab4b714610223578063f2fde38b1461024357600080fd5b3661015e576065546100ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b60005b60655481101561015b576000606582815481106100dc57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160608101825292909101546001600160a01b03811680845263ffffffff600160a01b83048116958501869052600160c01b9092049091169183018290529193506101489261013990346109cf565b61014391906109af565b610263565b508061015381610a05565b9150506100af565b50005b600080fd5b34801561016f57600080fd5b50610178610294565b005b34801561018657600080fd5b506101786102cf565b34801561019b57600080fd5b506101a46103e0565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd57600080fd5b506101786101dc366004610825565b6103ef565b3480156101ed57600080fd5b506101786101fc3660046108ab565b61048c565b34801561020d57600080fd5b506102166105c9565b6040516101b891906108c3565b34801561022f57600080fd5b5061017861023e366004610894565b610650565b34801561024f57600080fd5b5061017861025e366004610802565b6106bd565b600080600080600085875af190508061028f576040516312171d8360e31b815260040160405180910390fd5b505050565b3361029d6103e0565b6001600160a01b0316146102c35760405162461bcd60e51b81526004016100a39061092f565b6102cd6000610756565b565b600054610100900460ff16158080156102ef5750600054600160ff909116105b806103095750303b158015610309575060005460ff166001145b61036c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100a3565b6000805460ff19166001179055801561038f576000805461ff0019166101001790555b6103976107a8565b80156103dd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6033546001600160a01b031690565b336103f86103e0565b6001600160a01b03161461041e5760405162461bcd60e51b81526004016100a39061092f565b60005b8181101561028f57606583838381811061044b57634e487b7160e01b600052603260045260246000fd5b835460018101855560009485526020909420606090910292909201929190910190506104778282610a51565b5050808061048490610a05565b915050610421565b336104956103e0565b6001600160a01b0316146104bb5760405162461bcd60e51b81526004016100a39061092f565b606580546104cb906001906109ee565b815481106104e957634e487b7160e01b600052603260045260246000fd5b906000526020600020016065828154811061051457634e487b7160e01b600052603260045260246000fd5b600091825260209091208254910180546001600160a01b039092166001600160a01b031983168117825583546001600160c01b031990931617600160a01b9283900463ffffffff90811690930217808255925463ffffffff60c01b19909316600160c01b9384900490921690920217905560658054806105a457634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160e01b031916905501905550565b60606065805480602002602001604051908101604052809291908181526020016000905b8282101561064757600084815260209081902060408051606081018252918501546001600160a01b038116835263ffffffff600160a01b8204811684860152600160c01b90910416908201528252600190920191016105ed565b50505050905090565b336106596103e0565b6001600160a01b03161461067f5760405162461bcd60e51b81526004016100a39061092f565b6065805460018101825560009190915281907f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70161028f8282610a51565b336106c66103e0565b6001600160a01b0316146106ec5760405162461bcd60e51b81526004016100a39061092f565b6001600160a01b0381166107515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100a3565b6103dd815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107cf5760405162461bcd60e51b81526004016100a390610964565b6102cd600054610100900460ff166107f95760405162461bcd60e51b81526004016100a390610964565b6102cd33610756565b600060208284031215610813578081fd5b813561081e81610ad2565b9392505050565b60008060208385031215610837578081fd5b82356001600160401b038082111561084d578283fd5b818501915085601f830112610860578283fd5b81358181111561086e578384fd5b866020606083028501011115610882578384fd5b60209290920196919550909350505050565b6000606082840312156108a5578081fd5b50919050565b6000602082840312156108bc578081fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561092257815180516001600160a01b031685528681015163ffffffff90811688870152908601511685850152606090930192908501906001016108e0565b5091979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000826109ca57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156109e9576109e9610a20565b500290565b600082821015610a0057610a00610a20565b500390565b6000600019821415610a1957610a19610a20565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6000813563ffffffff81168114610a4b578182fd5b92915050565b8135610a5c81610ad2565b81546001600160a01b031981166001600160a01b0392909216918217835563ffffffff60a01b610a8e60208601610a36565b60a01b16808360018060c01b031984161717845563ffffffff60c01b610ab660408701610a36565b60c01b168363ffffffff60e01b84161782171784555050505050565b6001600160a01b03811681146103dd57600080fdfea264697066735822122014bc76b7d4091d371911118088e2bf2707a403b33e15cd967edd5236c982bb1b64736f6c63430008040033165f0fc496c6f74e1376579ffc36bcfc90ef4779c44b9232cf0d606db3cc69d1ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203aeb7f1163a18c2fee92fe14647920860da58553ed7ac5ae50406754617d9def64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102045760003560e01c806301ffc9a71461020957806306fdde031461024b578063081812fc14610260578063095ea7b314610280578063152f0eb51461029557806318160ddd146102a85780631986166f146102ba5780631beab0f6146102cd57806323b872dd146102e05780632a55205a146102f35780632adbc37d146103255780632cf1dacb1461032d5780632f745c59146103405780632fb102cf1461035357806330477d361461036657806340897bbe1461037957806342842e0e1461038157806342966c68146103945780634f6ccce7146103a757806354fd4d50146103ba5780636352211e146103c157806370a08231146103d4578063715018a6146103e7578063736cd42d146103ef57806374478bb3146104025780637b74297d1461040f5780637e5b1e241461042f5780638129fc1c1461044257806386575e401461044a5780638da5cb5b1461045d57806395d89b41146104655780639713c8071461046d5780639ad9523214610480578063a06617cd14610493578063a22cb465146104b3578063a8f1602c146104c6578063b88d4fde146104f3578063bd7f4c8d14610506578063c87b56dd14610519578063d31af4841461052c578063e565fef31461053f578063e8a3d48514610552578063e985e9c51461055a578063f2fde38b14610596575b600080fd5b610236610217366004613b74565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102536105a9565b6040516102429190613e2e565b61027361026e366004613c46565b61063b565b6040516102429190613d2a565b61029361028e366004613a22565b6106bd565b005b6102936102a3366004613a22565b610918565b6075545b604051908152602001610242565b6102936102c83660046139f3565b6109ea565b6102936102db366004613a22565b610ad5565b6102936102ee366004613916565b610cd5565b610306610301366004613cbe565b610f1c565b604080516001600160a01b039093168352602083019190915201610242565b610293610fa7565b61029361033b3660046139f3565b61103d565b6102ac61034e366004613a22565b611124565b610293610361366004613a4d565b6111c9565b607b54610273906001600160a01b031681565b6102936113aa565b61029361038f366004613916565b611437565b6102936103a2366004613c46565b611457565b6102ac6103b5366004613c46565b61164a565b60016102ac565b6102736103cf366004613c46565b6116c0565b6102ac6103e236600461389f565b611718565b61029361176f565b6102936103fd36600461389f565b6117f4565b6066546102369060ff1681565b61042261041d366004613c46565b61188f565b6040516102429190613de1565b61029361043d366004613c14565b6118fb565b6102936119c0565b610293610458366004613bac565b611c81565b610273611d1a565b610253611d29565b61029361047b366004613c5e565b611d38565b61025361048e366004613c46565b611eeb565b6102ac6104a136600461389f565b60696020526000908152604090205481565b6102936104c13660046139c6565b611fe6565b6102366104d4366004613a22565b6001600160a01b03919091166000908152606960205260409020541490565b610293610501366004613956565b61210b565b6102ac61051436600461389f565b61214d565b610253610527366004613c46565b612158565b61029361053a366004613c84565b6121cd565b61029361054d366004613ad5565b6122be565b610253612344565b6102366105683660046138de565b6001600160a01b039182166000908152606e6020908152604080832093909416825291909152205460ff1690565b6102936105a436600461389f565b612353565b6060606f80546105b890613fd2565b80601f01602080910402602001604051908101604052809291908181526020018280546105e490613fd2565b80156106315780601f1061060657610100808354040283529160200191610631565b820191906000526020600020905b81548152906001019060200180831161061457829003601f168201915b5050505050905090565b6000818152606b60209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b031661069b5760405162461bcd60e51b81526004016106929190613e2e565b60405180910390fd5b506000838152606c60205260409020546001600160a01b031691505b50919050565b816daaeb6d7670e522a718067333cd4e3b1561077557604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906107069030908590600401613d3e565b60206040518083038186803b15801561071e57600080fd5b505afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190613b58565b6107755780604051633b79c77360e21b81526004016106929190613d2a565b6000828152606b602052604090205482906001600160a01b0316338114806107c057506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906107fd5760405162461bcd60e51b81526004016106929190613e2e565b506000848152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166108575760405162461bcd60e51b81526004016106929190613e2e565b506000858152606b6020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919088168214156108b75760405162461bcd60e51b81526004016106929190613e2e565b506000868152606c602052604080822080546001600160a01b0319166001600160a01b038b811691821790925591518993918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050505050565b33600081815260696020526040902054151580610944575033610939611d1a565b6001600160a01b0316145b61099c5760405162461bcd60e51b8152602060048201526024808201527f436f6e7472616374206973206e6f742072656769737465726564206e6f72204f6044820152633bb732b960e11b6064820152608401610692565b506001600160a01b039091166000818152606960209081526040808320859055938252606a8152928120805460018101825590825292902090910180546001600160a01b0319169091179055565b606654600090610100900460ff168015610a29575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610a34611d1a565b6001600160a01b03161480610a465750805b610a625760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191660011790558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff191660011790555b50505050565b606654600090610100900460ff168015610b14575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610b1f611d1a565b6001600160a01b03161480610b315750805b610b4d5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0383166000908152606960205260409020548390610bb15760405162461bcd60e51b815260206004820152601a60248201527910dbdb9d1c9858dd081a5cc81b9bdd081c9959da5cdd195c995960321b6044820152606401610692565b6001600160a01b0384166000908152606960209081526040808320548352606a909152902080548190610be690600190613fbb565b81548110610c0457634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316818581548110610c4257634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080805480610c8e57634e487b7160e01b600052603160045260246000fd5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b039690961681526069909552505060408320929092555050565b826daaeb6d7670e522a718067333cd4e3b15610d8d57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c617113490610d1e9030908590600401613d3e565b60206040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190613b58565b610d8d5780604051633b79c77360e21b81526004016106929190613d2a565b816000610d998261243d565b6000838152606b6020526040812054919250906001600160a01b031633811480610dd957506000848152606c60205260409020546001600160a01b031633145b80610e0757506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b80610e0f5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e4c5760405162461bcd60e51b81526004016106929190613e2e565b506000868152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528791906001600160a01b0316610ea65760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908b168214610f055760405162461bcd60e51b81526004016106929190613e2e565b50610f108989612482565b50505050505050505050565b6000828152607a6020526040812054819081906001600160a01b0316610f43576079610f52565b6000858152607a602052604090205b6040805180820190915290546001600160a01b038116808352600160a01b90910462ffffff166020830181905290945090915061271090610f939086613f9c565b610f9d9190613f7c565b9150509250929050565b606654600090610100900460ff168015610fe6575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033610ff1611d1a565b6001600160a01b031614806110035750805b61101f5760405162461bcd60e51b815260040161069290613efc565b506066805461ff001981166101009182900460ff1615909102179055565b606654600090610100900460ff16801561107c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611087611d1a565b6001600160a01b031614806110995750805b6110b55760405162461bcd60e51b815260040161069290613efc565b6001600160a01b03841660009081526067602090815260408083206001600160e01b0319871684529091529020805460ff191690558115610acf576001600160a01b03841660009081526068602090815260408083208584529091529020805460ff1916600117905550505050565b6001600160a01b0382166000908152607760209081526040808320548151808301909252600682526530303530303760d01b9282019290925290831061117d5760405162461bcd60e51b81526004016106929190613e2e565b506001600160a01b03831660009081526077602052604090208054839081106111b657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b606654600090610100900460ff168015611208575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611213611d1a565b6001600160a01b031614806112255750805b6112415760405162461bcd60e51b815260040161069290613efc565b61124b8787612611565b61128b8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267192505050565b6112cb8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126ea92505050565b6003600052606a602052600080516020614bc5833981519152541580159061133f575060036000908152606a602052600080516020614bc5833981519152805433929061132857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316145b156113a15760405163b68c437960e01b8152339063b68c43799061136e906000908b908b908390600401613d95565b600060405180830381600087803b15801561138857600080fd5b505af115801561139c573d6000803e3d6000fd5b505050505b50505050505050565b606654600090610100900460ff1680156113e9575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336113f4611d1a565b6001600160a01b031614806114065750805b6114225760405162461bcd60e51b815260040161069290613efc565b506066805460ff19811660ff90911615179055565b61145283838360405180602001604052806000815250612763565b505050565b8060006114638261243d565b6000838152606b6020526040812054919250906001600160a01b0316338114806114a357506000848152606c60205260409020546001600160a01b031633145b806114d157506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b806114d95750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115165760405162461bcd60e51b81526004016106929190613e2e565b5061152085612ae0565b6003600052606a602052600080516020614bc58339815191525415801590611594575060036000908152606a602052600080516020614bc58339815191528054829061157c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156116435760036000908152606a602052600080516020614bc583398151915280549091906115d357634e487b7160e01b600052603260045260246000fd5b600091825260208220015460405163b68c437960e01b81526001600160a01b039091169163b68c4379916116109133918a90600390600401613d95565b600060405180830381600087803b15801561162a57600080fd5b505af115801561163e573d6000803e3d6000fd5b505050505b5050505050565b60755460408051808201909152600681526530303530303760d01b6020820152600091831061168c5760405162461bcd60e51b81526004016106929190613e2e565b50607582815481106116ae57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816106b75760405162461bcd60e51b81526004016106929190613e2e565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b03831661175f5760405162461bcd60e51b81526004016106929190613e2e565b5061176982612c2c565b92915050565b606654600090610100900460ff1680156117ae575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b9050336117b9611d1a565b6001600160a01b031614806117cb5750805b6117e75760405162461bcd60e51b815260040161069290613efc565b6117f16000612c47565b50565b606654600090610100900460ff168015611833575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361183e611d1a565b6001600160a01b031614806118505750805b61186c5760405162461bcd60e51b815260040161069290613efc565b50607b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152606a60209081526040918290208054835181840281018401909452808452606093928301828280156118ef57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118d1575b50505050509050919050565b606654600090610100900460ff16801561193a575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611945611d1a565b6001600160a01b031614806119575750805b6119735760405162461bcd60e51b815260040161069290613efc565b7fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce6071836040516119a5929190613e41565b60405180910390a18151611452906071906020850190613641565b600154610100900460ff16158080156119dd57506001805460ff16105b806119f65750303b1580156119f657506001805460ff16145b611a595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610692565b6001805460ff1916811790558015611a7b576001805461ff0019166101001790555b611a83612c99565b60408051808201909152600f8082526e22b6b13632b6902b30bab63a102b1960891b6020909201918252611ab991606f91613641565b5060408051808201909152600a80825269456d626c656d2e70726f60b01b6020909201918252611aeb91607091613641565b50611afc635b5e139f60e01b612cca565b611b0c63780e9d6360e01b612cca565b611b1c6380ac58cd60e01b612cca565b611b2c63152a902d60e11b612cca565b611b34612d48565b604051611b40906136c5565b604051809103906000f080158015611b5c573d6000803e3d6000fd5b50607b80546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015611bb357600080fd5b505af1158015611bc7573d6000803e3d6000fd5b5050607b5460405163f2fde38b60e01b81526001600160a01b03909116925063f2fde38b9150611bfb903390600401613d2a565b600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50506066805460ff19166001179055505080156117f1576001805461ff00191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b606654600090610100900460ff168015611cc0575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033611ccb611d1a565b6001600160a01b03161480611cdd5750805b611cf95760405162461bcd60e51b815260040161069290613efc565b611d05606f86866136d2565b50611d12607084846136d2565b505050505050565b6034546001600160a01b031690565b6060607080546105b890613fd2565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7157600080fd5b505afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da991906138c2565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b81526020600482015260096024820152682737ba1027bbb732b960b91b6044820152606401610692565b612710811115611e445760405162461bcd60e51b815260206004820152601a60248201527908aa48664727062a4def2c2d8e8d2cae67440a8dede40d0d2ced60331b6044820152606401610692565b82611e9457604080518082019091526001600160a01b03831680825262ffffff8316602090920182905260798054600160a01b9093026001600160b81b0319909316909117919091179055505050565b6040805180820182526001600160a01b03938416815262ffffff92831660208083019182526000968752607a905291909420935184549151909216600160a01b026001600160b81b03199091169190921617179055565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611f465760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602052604090208054611f6090613fd2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8c90613fd2565b8015611fd95780601f10611fae57610100808354040283529160200191611fd9565b820191906000526020600020905b815481529060010190602001808311611fbc57829003601f168201915b5050505050915050919050565b816daaeb6d7670e522a718067333cd4e3b1561209e57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c61711349061202f9030908590600401613d3e565b60206040518083038186803b15801561204757600080fd5b505afa15801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f9190613b58565b61209e5780604051633b79c77360e21b81526004016106929190613d2a565b336000818152606e602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61164385858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276392505050565b600061176982612c2c565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166121b35760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602052604090208054611f6090613fd2565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166122265760405162461bcd60e51b81526004016106929190613e2e565b50606654600090610100900460ff168015612266575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612271611d1a565b6001600160a01b031614806122835750805b61229f5760405162461bcd60e51b815260040161069290613efc565b6000848152607260209081526040909120845161164392860190613641565b606654600090610100900460ff1680156122fd575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905033612308611d1a565b6001600160a01b0316148061231a5750805b6123365760405162461bcd60e51b815260040161069290613efc565b6113a1878787878787612dcf565b6060607180546105b890613fd2565b606654600090610100900460ff168015612392575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b90503361239d611d1a565b6001600160a01b031614806123af5750805b6123cb5760405162461bcd60e51b815260040161069290613efc565b6001600160a01b0382166124305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610692565b61243982612c47565b5050565b606654600090610100900460ff16801561245a575061245a612ddd565b8015611769575050336000908152606860209081526040808320938352929052205460ff1690565b6000818152606b60205260409020546001600160a01b03166124a382612e21565b6124ad8183612e5c565b6124b78383613006565b6003600052606a602052600080516020614bc5833981519152541580159061252b575060036000908152606a602052600080516020614bc58339815191528054829061251357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614155b156125dd5760036000908152606a602052600080516020614bc5833981519152805490919061256a57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405163b68c437960e01b81526001600160a01b039091169063b68c4379906125aa90849087908790600190600401613d95565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050505b81836001600160a01b0316826001600160a01b0316600080516020614be583398151915260405160405180910390a4505050565b61261b82826130c9565b607580546001818101835560008390527f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea909101839055905461265e9190613fbb565b6000918252607660205260409091205550565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166126ca5760405162461bcd60e51b81526004016106929190613e2e565b5060008381526072602090815260409091208351610acf92850190613641565b6000828152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166127435760405162461bcd60e51b81526004016106929190613e2e565b5060008381526073602090815260409091208351610acf92850190613641565b836daaeb6d7670e522a718067333cd4e3b1561281b57604051633185c44d60e21b81526daaeb6d7670e522a718067333cd4e9063c6171134906127ac9030908590600401613d3e565b60206040518083038186803b1580156127c457600080fd5b505afa1580156127d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fc9190613b58565b61281b5780604051633b79c77360e21b81526004016106929190613d2a565b8260006128278261243d565b6000838152606b6020526040812054919250906001600160a01b03163381148061286757506000848152606c60205260409020546001600160a01b031633145b8061289557506001600160a01b0381166000908152606e6020908152604080832033845290915290205460ff165b8061289d5750825b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906128da5760405162461bcd60e51b81526004016106929190613e2e565b506000878152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528891906001600160a01b03166129345760405162461bcd60e51b81526004016106929190613e2e565b506000888152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908c1682146129935760405162461bcd60e51b81526004016106929190613e2e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038b166129d85760405162461bcd60e51b81526004016106929190613e2e565b506129e38a8a612482565b6129f58a6001600160a01b031661319a565b1561139c5760006001600160a01b038b1663150b7a02338e8d8d6040518563ffffffff1660e01b8152600401612a2e9493929190613d58565b602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a809190613b90565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14612ad15760405162461bcd60e51b81526004016106929190613e2e565b50505050505050505050505050565b612ae9816131d6565b60008181526072602052604090208054612b0290613fd2565b159050612b20576000818152607260205260408120612b2091613746565b60008181526073602052604090208054612b3990613fd2565b159050612b57576000818152607360205260408120612b5791613746565b600081815260766020526040812054607554909190612b7890600190613fbb565b9050600060758281548110612b9d57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060758481548110612bcc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556075805480612bf757634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255918152607690915260408082209390935592835250812055565b6001600160a01b031660009081526077602052604090205490565b603480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600154610100900460ff16612cc05760405162461bcd60e51b815260040161069290613f31565b612cc8613286565b565b6001600160e01b03198082161415612d235760405162461bcd60e51b815260206004820152601c60248201527b115490cc4d8d4e881a5b9d985b1a59081a5b9d195c999858d9481a5960221b6044820152606401610692565b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6301ffc9a760e01b60009081526020527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c55460ff1615612dbf5760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e48149959da5cdd195c995960721b6044820152606401610692565b612cc86301ffc9a760e01b612cca565b611d128686868686866132b6565b606654600090610100900460ff168015612e1c575033600090815260676020908152604080832083356001600160e01b031916845290915290205460ff165b905090565b6000818152606c60205260409020546001600160a01b0316156117f1576000908152606c6020526040902080546001600160a01b0319169055565b6000818152606b6020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03848116911614612eb75760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b031916905560788252808320546001600160a01b03861684526077909252822054909190612f0290600190613fbb565b9050818114612fb5576001600160a01b0384166000908152607760205260408120805483908110612f4357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060776000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612f9557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925591825260789052604090208290555b6001600160a01b0384166000908152607760205260409020805480612fea57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561305d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526077835290832080546001818101835582865293852001859055925290546130b69190613fbb565b6000918252607860205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661310d5760405162461bcd60e51b81526004016106929190613e2e565b506000818152606b6020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156131655760405162461bcd60e51b81526004016106929190613e2e565b506131708282613006565b60405181906001600160a01b03841690600090600080516020614be5833981519152908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906131ce5750808214155b949350505050565b6000818152606b6020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b031661322f5760405162461bcd60e51b81526004016106929190613e2e565b506000828152606b60205260409020546001600160a01b031661325183612e21565b61325b8184612e5c565b60405183906000906001600160a01b03841690600080516020614be5833981519152908390a4505050565b600154610100900460ff166132ad5760405162461bcd60e51b815260040161069290613f31565b612cc833612c47565b60005b858110156113a15781861480156132cf57508184145b15613389576133848787838181106132f757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061330c919061389f565b86868481811061332c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613341919061389f565b61337f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061349f915050565b613520565b61348d565b81861480156133985750818414155b1561341a576133848787838181106133c057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906133d5919061389f565b868661341587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061349f915050565b613594565b61348d87878381811061343d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613452919061389f565b868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061359492505050565b8061349781614007565b9150506132b9565b60408051600180825281830190925260609160009190602080830190803683370190505090508383815181106134e557634e487b7160e01b600052603260045260246000fd5b60200260200101518160008151811061350e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101529392505050565b60005b8151811015610acf5781818151811061354c57634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b0316856001600160a01b0316600080516020614be583398151915260405160405180910390a48061358c81614007565b915050613523565b60005b828110156116435781518314156135f0576135eb858585848181106135cc57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906135e1919061389f565b61337f858561349f565b61362f565b61362f8585858481811061361457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613629919061389f565b84613520565b8061363981614007565b915050613597565b82805461364d90613fd2565b90600052602060002090601f01602090048101928261366f57600085556136b5565b82601f1061368857805160ff19168380011785556136b5565b828001600101855582156136b5579182015b828111156136b557825182559160200191906001019061369a565b506136c192915061377c565b5090565b610b3d8061408883390190565b8280546136de90613fd2565b90600052602060002090601f01602090048101928261370057600085556136b5565b82601f106137195782800160ff198235161785556136b5565b828001600101855582156136b5579182015b828111156136b557823582559160200191906001019061372b565b50805461375290613fd2565b6000825580601f10613762575050565b601f0160209004906000526020600020908101906117f191905b5b808211156136c1576000815560010161377d565b60008083601f8401126137a2578081fd5b5081356001600160401b038111156137b8578182fd5b6020830191508360208260051b85010111156137d357600080fd5b9250929050565b60008083601f8401126137eb578182fd5b5081356001600160401b03811115613801578182fd5b6020830191508360208285010111156137d357600080fd5b600082601f830112613829578081fd5b81356001600160401b038082111561384357613843614038565b604051601f8301601f19908116603f0116810190828211818310171561386b5761386b614038565b81604052838152866020858801011115613883578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156138b0578081fd5b81356138bb8161404e565b9392505050565b6000602082840312156138d3578081fd5b81516138bb8161404e565b600080604083850312156138f0578081fd5b82356138fb8161404e565b9150602083013561390b8161404e565b809150509250929050565b60008060006060848603121561392a578081fd5b83356139358161404e565b925060208401356139458161404e565b929592945050506040919091013590565b60008060008060006080868803121561396d578081fd5b85356139788161404e565b945060208601356139888161404e565b93506040860135925060608601356001600160401b038111156139a9578182fd5b6139b5888289016137da565b969995985093965092949392505050565b600080604083850312156139d8578182fd5b82356139e38161404e565b9150602083013561390b81614063565b600080600060608486031215613a07578283fd5b8335613a128161404e565b9250602084013561394581614071565b60008060408385031215613a34578182fd5b8235613a3f8161404e565b946020939093013593505050565b60008060008060008060808789031215613a65578081fd5b8635613a708161404e565b95506020870135945060408701356001600160401b0380821115613a92578283fd5b613a9e8a838b016137da565b90965094506060890135915080821115613ab6578283fd5b50613ac389828a016137da565b979a9699509497509295939492505050565b60008060008060008060608789031215613aed578384fd5b86356001600160401b0380821115613b03578586fd5b613b0f8a838b01613791565b90985096506020890135915080821115613b27578586fd5b613b338a838b01613791565b90965094506040890135915080821115613b4b578384fd5b50613ac389828a01613791565b600060208284031215613b69578081fd5b81516138bb81614063565b600060208284031215613b85578081fd5b81356138bb81614071565b600060208284031215613ba1578081fd5b81516138bb81614071565b60008060008060408587031215613bc1578182fd5b84356001600160401b0380821115613bd7578384fd5b613be3888389016137da565b90965094506020870135915080821115613bfb578384fd5b50613c08878288016137da565b95989497509550505050565b600060208284031215613c25578081fd5b81356001600160401b03811115613c3a578182fd5b6131ce84828501613819565b600060208284031215613c57578081fd5b5035919050565b600080600060608486031215613c72578081fd5b8335925060208401356139458161404e565b60008060408385031215613c96578182fd5b8235915060208301356001600160401b03811115613cb2578182fd5b610f9d85828601613819565b60008060408385031215613cd0578182fd5b50508035926020909101359150565b60008151808452815b81811015613d0457602081850181015186830182015201613ce8565b81811115613d155782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8b90830184613cdf565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080810160058310613dd257634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e225783516001600160a01b031683529284019291840191600101613dfd565b50909695505050505050565b6020815260006138bb6020830184613cdf565b60408152600080845482600182811c915080831680613e6157607f831692505b6020808410821415613e8157634e487b7160e01b87526022600452602487fd5b6040880184905260608801828015613ea05760018114613eb157613edb565b60ff19871682528282019750613edb565b60008c815260209020895b87811015613ed557815484820152908601908401613ebc565b83019850505b5050878603818901525050505050613ef38185613cdf565b95945050505050565b6020808252601b908201527a4e6f74206f776e6572206f722061626c6520746f2062797061737360281b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082613f9757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613fb657613fb6614022565b500290565b600082821015613fcd57613fcd614022565b500390565b600181811c90821680613fe657607f821691505b602082108114156106b757634e487b7160e01b600052602260045260246000fd5b600060001982141561401b5761401b614022565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146117f157600080fd5b80151581146117f157600080fd5b6001600160e01b0319811681146117f157600080fdfe608060405234801561001057600080fd5b50610b1d806100206000396000f3fe60806040526004361061006f5760003560e01c8063715018a6146101635780638129fc1c1461017a5780638da5cb5b1461018f578063932fe1d5146101c1578063a1a74aae146101e1578063bdd4d18d14610201578063d71ab4b714610223578063f2fde38b1461024357600080fd5b3661015e576065546100ac5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b60005b60655481101561015b576000606582815481106100dc57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160608101825292909101546001600160a01b03811680845263ffffffff600160a01b83048116958501869052600160c01b9092049091169183018290529193506101489261013990346109cf565b61014391906109af565b610263565b508061015381610a05565b9150506100af565b50005b600080fd5b34801561016f57600080fd5b50610178610294565b005b34801561018657600080fd5b506101786102cf565b34801561019b57600080fd5b506101a46103e0565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101cd57600080fd5b506101786101dc366004610825565b6103ef565b3480156101ed57600080fd5b506101786101fc3660046108ab565b61048c565b34801561020d57600080fd5b506102166105c9565b6040516101b891906108c3565b34801561022f57600080fd5b5061017861023e366004610894565b610650565b34801561024f57600080fd5b5061017861025e366004610802565b6106bd565b600080600080600085875af190508061028f576040516312171d8360e31b815260040160405180910390fd5b505050565b3361029d6103e0565b6001600160a01b0316146102c35760405162461bcd60e51b81526004016100a39061092f565b6102cd6000610756565b565b600054610100900460ff16158080156102ef5750600054600160ff909116105b806103095750303b158015610309575060005460ff166001145b61036c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016100a3565b6000805460ff19166001179055801561038f576000805461ff0019166101001790555b6103976107a8565b80156103dd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6033546001600160a01b031690565b336103f86103e0565b6001600160a01b03161461041e5760405162461bcd60e51b81526004016100a39061092f565b60005b8181101561028f57606583838381811061044b57634e487b7160e01b600052603260045260246000fd5b835460018101855560009485526020909420606090910292909201929190910190506104778282610a51565b5050808061048490610a05565b915050610421565b336104956103e0565b6001600160a01b0316146104bb5760405162461bcd60e51b81526004016100a39061092f565b606580546104cb906001906109ee565b815481106104e957634e487b7160e01b600052603260045260246000fd5b906000526020600020016065828154811061051457634e487b7160e01b600052603260045260246000fd5b600091825260209091208254910180546001600160a01b039092166001600160a01b031983168117825583546001600160c01b031990931617600160a01b9283900463ffffffff90811690930217808255925463ffffffff60c01b19909316600160c01b9384900490921690920217905560658054806105a457634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160e01b031916905501905550565b60606065805480602002602001604051908101604052809291908181526020016000905b8282101561064757600084815260209081902060408051606081018252918501546001600160a01b038116835263ffffffff600160a01b8204811684860152600160c01b90910416908201528252600190920191016105ed565b50505050905090565b336106596103e0565b6001600160a01b03161461067f5760405162461bcd60e51b81526004016100a39061092f565b6065805460018101825560009190915281907f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c70161028f8282610a51565b336106c66103e0565b6001600160a01b0316146106ec5760405162461bcd60e51b81526004016100a39061092f565b6001600160a01b0381166107515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100a3565b6103dd815b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166107cf5760405162461bcd60e51b81526004016100a390610964565b6102cd600054610100900460ff166107f95760405162461bcd60e51b81526004016100a390610964565b6102cd33610756565b600060208284031215610813578081fd5b813561081e81610ad2565b9392505050565b60008060208385031215610837578081fd5b82356001600160401b038082111561084d578283fd5b818501915085601f830112610860578283fd5b81358181111561086e578384fd5b866020606083028501011115610882578384fd5b60209290920196919550909350505050565b6000606082840312156108a5578081fd5b50919050565b6000602082840312156108bc578081fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561092257815180516001600160a01b031685528681015163ffffffff90811688870152908601511685850152606090930192908501906001016108e0565b5091979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000826109ca57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156109e9576109e9610a20565b500290565b600082821015610a0057610a00610a20565b500390565b6000600019821415610a1957610a19610a20565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6000813563ffffffff81168114610a4b578182fd5b92915050565b8135610a5c81610ad2565b81546001600160a01b031981166001600160a01b0392909216918217835563ffffffff60a01b610a8e60208601610a36565b60a01b16808360018060c01b031984161717845563ffffffff60c01b610ab660408701610a36565b60c01b168363ffffffff60e01b84161782171784555050505050565b6001600160a01b03811681146103dd57600080fdfea264697066735822122014bc76b7d4091d371911118088e2bf2707a403b33e15cd967edd5236c982bb1b64736f6c63430008040033165f0fc496c6f74e1376579ffc36bcfc90ef4779c44b9232cf0d606db3cc69d1ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203aeb7f1163a18c2fee92fe14647920860da58553ed7ac5ae50406754617d9def64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.