Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 48 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 20874607 | 62 days ago | IN | 0 ETH | 0.00047 | ||||
Safe Transfer Fr... | 20657461 | 92 days ago | IN | 0 ETH | 0.00007833 | ||||
Set Approval For... | 19515809 | 252 days ago | IN | 0 ETH | 0.00086186 | ||||
Set Approval For... | 18730536 | 362 days ago | IN | 0 ETH | 0.00276386 | ||||
Safe Transfer Fr... | 18192098 | 437 days ago | IN | 0 ETH | 0.00082961 | ||||
Safe Transfer Fr... | 18072659 | 454 days ago | IN | 0 ETH | 0.00438668 | ||||
Safe Transfer Fr... | 17832293 | 487 days ago | IN | 0 ETH | 0.001175 | ||||
Safe Transfer Fr... | 17390530 | 550 days ago | IN | 0 ETH | 0.0012335 | ||||
Safe Transfer Fr... | 16806980 | 632 days ago | IN | 0 ETH | 0.00360268 | ||||
Set Approval For... | 16774599 | 636 days ago | IN | 0 ETH | 0.00097217 | ||||
Safe Transfer Fr... | 16556608 | 667 days ago | IN | 0 ETH | 0.00097246 | ||||
Safe Transfer Fr... | 16492587 | 676 days ago | IN | 0 ETH | 0.00227167 | ||||
Set Approval For... | 16446094 | 682 days ago | IN | 0 ETH | 0.00068491 | ||||
Safe Transfer Fr... | 16431890 | 684 days ago | IN | 0 ETH | 0.00125333 | ||||
Safe Transfer Fr... | 16391504 | 690 days ago | IN | 0 ETH | 0.00138549 | ||||
Safe Transfer Fr... | 16250752 | 710 days ago | IN | 0 ETH | 0.00109667 | ||||
Safe Transfer Fr... | 16089757 | 732 days ago | IN | 0 ETH | 0.00075242 | ||||
Safe Transfer Fr... | 16007373 | 744 days ago | IN | 0 ETH | 0.00101833 | ||||
Transfer From | 15957282 | 751 days ago | IN | 0 ETH | 0.00048717 | ||||
Transfer From | 15743547 | 781 days ago | IN | 0 ETH | 0.00110768 | ||||
Safe Transfer Fr... | 15645643 | 794 days ago | IN | 0 ETH | 0.00055455 | ||||
Transfer From | 15266245 | 853 days ago | IN | 0 ETH | 0.00045669 | ||||
Safe Transfer Fr... | 15259737 | 854 days ago | IN | 0 ETH | 0.000705 | ||||
Safe Transfer Fr... | 15236516 | 857 days ago | IN | 0 ETH | 0.000705 | ||||
Safe Transfer Fr... | 15113613 | 876 days ago | IN | 0 ETH | 0.00078333 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
CircumnavigationOpenEdition
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 1500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.4; import "./NiftyBuilderInstance.sol"; import "./ICircumnavigationURI.sol"; contract CircumnavigationOpenEdition is NiftyBuilderInstance { ICircumnavigationURI public circumnavigationContract; constructor( address niftyRegistryContract, address defaultOwner, address circumnavigationContractAddress) NiftyBuilderInstance( "Circumnavigation Collector Only Open Edition by Dave Pollot", "CIRCUMNAVIGATION OE", 2, 1, "", "Dave Pollot", niftyRegistryContract, defaultOwner) { circumnavigationContract = ICircumnavigationURI(circumnavigationContractAddress); } function tokenURI(uint256 tokenId) external virtual view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return circumnavigationContract.cITokenURI(); } }
pragma solidity 0.8.4; import "./ERC721.sol"; import "../interface/ICloneablePaymentSplitter.sol"; import "../interface/IERC2981.sol"; import "../standard/ERC721Burnable.sol"; import "../util/Clones.sol"; /** * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .*** XXXXXXXXXXXXXXXXXX * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ,********* XXXXXXXXXXXXXXXX * XXXXXXXXXXXXXXXXXXXXXXXXXXXX *************** XXXXXXXXXXXXX * XXXXXXXXXXXXXXXXXXXXXXXXX .******************* XXXXXXXXXXX * XXXXXXXXXXXXXXXXXXXXXXX *********** ********** XXXXXXXX * XXXXXXXXXXXXXXXXXXXX *********** *********** XXXXXX * XXXXXXXXXXXXXXXXXX *********** *************** XXX * XXXXXXXXXXXXXXXX *********** **** ********* XX * XXXXXXXXXXXXXXXX ********* *** *** ********* X * XXXXXXXXXXXXXXXX ********** ***** *********** XXX * XXXXXXXXXXXX /////.************* *********** XXXX * XXXXXXXXX /////////...*********** ************ XXXXXX * XXXXXXX/ ///////////..... ///////// /////////// XXXXXXXX * XXXXXX / //////........./////////////////// XXXXXXXXXX * XXXXXXXXXX .///////...........////////////// XXXXXXXXXXXXX * XXXXXXXXX .///////.....//..//// ///////// XXXXXXXXXXXXXXXX * XXXXXXX# ///////////////////// XXXXXXXXXXXXXXXXXXXXXXXXXXXX * XXXXX //////////////////// XXXXXXXXXXXXXXXXXXXXXXXXXXXXX * XX ////////////// ////// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX * * @dev Nifty Gateway extension of customized NFT contract, encapsulates * logic for minting new tokens, and concluding the minting process. */ contract NiftyBuilderInstance is ERC721, ERC721Burnable, IERC2981 { event RoyaltyReceiverUpdated(uint256 indexed niftyType, address previousReceiver, address newReceiver); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); // The artist associated with the collection. string private _creator; uint256 immutable public _percentageTotal; mapping(uint256 => uint256) public _percentageRoyalty; mapping (uint256 => address) _royaltySplitters; mapping (uint256 => address) _royaltyReceivers; // Number of NFTs minted for a given 'typeCount'. mapping (uint256 => uint256) public _mintCount; /** * @dev Serves as a gas cost optimized boolean flag * to indicate whether the minting process has been * concluded for a given 'typeCount', correspinds * to the {_getFinalized} and {setFinalized}. */ mapping (uint256 => bytes32) private _finalized; /** * @dev Emitted when tokens are created. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed fromAddress, address indexed toAddress); /** * @dev Ultimate instantiation of a Nifty Gateway NFT collection. * * @param name Of the collection being deployed. * @param symbol Shorthand token identifier, for wallets, etc. * @param id Number instance deployed by {BuilderShop} contract. * @param typeCount The number of different Nifty types (different * individual NFTs) associated with the deployed collection. * @param baseURI The location where the artifact assets are stored. * @param creator_ The artist associated with the collection. * @param niftyRegistryContract Points to the repository of authenticated * addresses for stateful operations. * @param defaultOwner Intial receiver of all newly minted NFTs. */ constructor( string memory name, string memory symbol, uint256 id, uint256 typeCount, string memory baseURI, string memory creator_, address niftyRegistryContract, address defaultOwner) ERC721(name, symbol, id, baseURI, typeCount, defaultOwner, niftyRegistryContract) { _creator = creator_; _percentageTotal = 10000; } function setRoyaltyBips(uint256 niftyType, uint256 percentageRoyalty_) external onlyValidSender { require(percentageRoyalty_ <= _percentageTotal, "NiftyBuilderInstance: Illegal argument more than 100%"); _percentageRoyalty[niftyType] = percentageRoyalty_; } function royaltyInfo(uint256 tokenId, uint256 salePrice) public override view returns (address, uint256) { require(_exists(tokenId), "NiftyBuilderInstance: operator query for nonexistent token"); uint256 niftyType = _getNiftyTypeId(tokenId); uint256 royaltyAmount = (salePrice * _percentageRoyalty[niftyType]) / _percentageTotal; address royaltyReceiver = _getRoyaltyReceiverByNiftyType(niftyType); require(royaltyReceiver != address(0), "NiftyBuilderInstance: No royalty receiver"); return (royaltyReceiver, royaltyAmount); } // This function must be called after builder shop instance is created - it can be called again // to change the split; call this once per nifty type to set up royalty payments properly function initializeRoyalties(address splitterImplementation, uint256 niftyType, address[] calldata payees, uint256[] calldata shares_) external onlyValidSender { address previousReceiver = _getRoyaltyReceiverByNiftyType(niftyType); address newReceiver = address(0); if(payees.length == 1) { newReceiver = payees[0]; _royaltyReceivers[niftyType] = newReceiver; delete _royaltySplitters[niftyType]; } else { delete _royaltyReceivers[niftyType]; require(IERC165(splitterImplementation).supportsInterface(type(ICloneablePaymentSplitter).interfaceId), "Not a valid payment splitter"); newReceiver = payable (Clones.clone(splitterImplementation)); ICloneablePaymentSplitter(newReceiver).initialize(payees, shares_); _royaltySplitters[niftyType] = newReceiver; } emit RoyaltyReceiverUpdated(niftyType, previousReceiver, newReceiver); } function getRoyaltyReceiverByTokenId(uint256 tokenId) public view returns (address) { return _getRoyaltyReceiverByNiftyType(_getNiftyTypeId(tokenId)); } function getRoyaltyReceiverByNiftyType(uint256 niftyType) public view returns (address) { return _getRoyaltyReceiverByNiftyType(niftyType); } function releaseRoyalties(address payable account) external { uint256 totalPaymentAmount = 0; for(uint256 niftyType = 1; niftyType <= _typeCount; niftyType++) { address paymentSplitterAddress = _royaltySplitters[niftyType]; if(paymentSplitterAddress != address(0)) { ICloneablePaymentSplitter paymentSplitter = ICloneablePaymentSplitter(paymentSplitterAddress); uint256 pendingPaymentAmount = paymentSplitter.pendingPayment(account); if(pendingPaymentAmount > 0) { totalPaymentAmount += pendingPaymentAmount; paymentSplitter.release(account); } } } if(totalPaymentAmount > 0) { emit PaymentReleased(account, totalPaymentAmount); } } function releaseRoyalties(IERC20 token, address account) external { uint256 totalPaymentAmount = 0; for(uint256 niftyType = 1; niftyType <= _typeCount; niftyType++) { address paymentSplitterAddress = _royaltySplitters[niftyType]; if(paymentSplitterAddress != address(0)) { ICloneablePaymentSplitter paymentSplitter = ICloneablePaymentSplitter(paymentSplitterAddress); uint256 pendingPaymentAmount = paymentSplitter.pendingPayment(token, account); if(pendingPaymentAmount > 0) { totalPaymentAmount += pendingPaymentAmount; paymentSplitter.release(token, account); } } } if(totalPaymentAmount > 0) { emit ERC20PaymentReleased(token, account, totalPaymentAmount); } } function pendingRoyaltyPayment(address account) external view returns (uint256) { uint256 totalPaymentAmount = 0; for(uint256 niftyType = 1; niftyType <= _typeCount; niftyType++) { address paymentSplitterAddress = _royaltySplitters[niftyType]; if(paymentSplitterAddress != address(0)) { ICloneablePaymentSplitter paymentSplitter = ICloneablePaymentSplitter(paymentSplitterAddress); totalPaymentAmount += paymentSplitter.pendingPayment(account); } } return totalPaymentAmount; } function pendingRoyaltyPayment(IERC20 token, address account) external view returns (uint256) { uint256 totalPaymentAmount = 0; for(uint256 niftyType = 1; niftyType <= _typeCount; niftyType++) { address paymentSplitterAddress = _royaltySplitters[niftyType]; if(paymentSplitterAddress != address(0)) { ICloneablePaymentSplitter paymentSplitter = ICloneablePaymentSplitter(paymentSplitterAddress); totalPaymentAmount += paymentSplitter.pendingPayment(token, account); } } return totalPaymentAmount; } /** * @dev Generate canonical Nifty Gateway token representation. * Nifty contracts have a data model called a 'niftyType' (typeCount) * The 'niftyType' refers to a specific nifty in our contract, note * that it gives no information about the edition size. In a given * contract, 'niftyType' 1 could be an edition of 10, while 'niftyType' * 2 is a 1/1, etc. * The token IDs are encoded as follows: {id}{niftyType}{edition #} * 'niftyType' has 4 digits, and edition number has 5 digits, to allow * for 99999 possible 'niftyType' and 99999 of each edition in each contract. * Example token id: [5000100270] * This is from contract #5, it is 'niftyType' 1 in the contract, and it is * edition #270 of 'niftyType' 1. * Example token id: [5000110000] * This is from contract #5, it is 'niftyType' 1 in the contract, and it is * edition #10000 of 'niftyType' 1. */ function _encodeTokenId(uint256 niftyType, uint256 tokenNumber) private view returns (uint256) { return (topLevelMultiplier + (niftyType * midLevelMultiplier) + tokenNumber); } /** * @dev Determine whether it is possible to mint additional NFTs for this 'niftyType'. */ function _getFinalized(uint256 niftyType) public view returns (bool) { bytes32 chunk = _finalized[niftyType / 256]; return (chunk & bytes32(1 << (niftyType % 256))) != 0x0; } /** * @dev Prevent the minting of additional NFTs of this 'niftyType'. */ function setFinalized(uint256 niftyType) public onlyValidSender { uint256 quotient = niftyType / 256; bytes32 chunk = _finalized[quotient]; _finalized[quotient] = chunk | bytes32(1 << (niftyType % 256)); } /** * @dev The artist of this collection. */ function creator() public view virtual returns (string memory) { return _creator; } /** * @dev Assign the root location where the artifact assets are stored. */ function setBaseURI(string memory baseURI) public onlyValidSender { _setBaseURI(baseURI); } /** * @dev Allow owner to change nifty name, by 'niftyType'. */ function setNiftyName(uint256 niftyType, string memory niftyName) public onlyValidSender { _setNiftyTypeName(niftyType, niftyName); } /** * @dev Assign the IPFS hash of canonical artifcat file, by 'niftyType'. */ function setNiftyIPFSHash(uint256 niftyType, string memory hashIPFS) public onlyValidSender { _setTokenIPFSHashNiftyType(niftyType, hashIPFS); } /** * @dev Create specified number of nifties en masse. * Once an NFT collection is spawned by the factory contract, we make calls to set the IPFS * hash (above) for each Nifty type in the collection. * Subsequently calls are issued to this function to mint the appropriate number of tokens * for the project. */ function mintNifty(uint256 niftyType, uint256 count) public onlyValidSender { require(!_getFinalized(niftyType), "NiftyBuilderInstance: minting concluded for nifty type"); uint256 tokenNumber = _mintCount[niftyType] + 1; uint256 tokenId00 = _encodeTokenId(niftyType, tokenNumber); uint256 tokenId01 = tokenId00 + count - 1; for (uint256 tokenId = tokenId00; tokenId <= tokenId01; tokenId++) { _owners[tokenId] = _defaultOwner; } _mintCount[niftyType] += count; _balances[_defaultOwner] += count; emit ConsecutiveTransfer(tokenId00, tokenId01, address(0), _defaultOwner); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function _getRoyaltyReceiverByNiftyType(uint256 niftyType) private view returns (address) { if(_royaltyReceivers[niftyType] != address(0)) { return _royaltyReceivers[niftyType]; } else if(_royaltySplitters[niftyType] != address(0)) { return _royaltySplitters[niftyType]; } return address(0); } }
pragma solidity 0.8.4; interface ICircumnavigationURI { function cITokenURI() external view returns (string memory); function cIITokenURI() external view returns (string memory); function cIIITokenURI(uint8 niftyType) external view returns (string memory); function cIOneOfOneTokenURI() external view returns (string memory); function cIIOneOfOneTokenURI() external view returns (string memory); }
pragma solidity 0.8.4; import "../interface/IERC721.sol"; import "../interface/IERC721Receiver.sol"; import "../interface/IERC721Metadata.sol"; import "../util/Context.sol"; import "../util/Strings.sol"; import "../standard/ERC165.sol"; import "./NiftyEntity.sol"; /** * @dev Nifty Gateway implementation of Non-Fungible Token Standard. */ contract ERC721 is NiftyEntity, Context, ERC165, IERC721, IERC721Metadata { // Tracked individual instance spawned by {BuilderShop} contract. uint immutable public _id; // Number of distinct NFTs housed in this contract. uint immutable public _typeCount; // Intial receiver of all newly minted NFTs. address immutable public _defaultOwner; // Component(s) of 'tokenId' calculation. uint immutable public topLevelMultiplier; uint immutable public midLevelMultiplier; // Token name. string private _name; // Token symbol. string private _symbol; // Token artifact location. string private _baseURI; // Mapping from Nifty type to name of token. mapping(uint256 => string) private _niftyTypeName; // Mapping from Nifty type to IPFS hash of canonical artifcat file. mapping(uint256 => string) private _niftyTypeIPFSHashes; // Mapping from token ID to owner address. mapping (uint256 => address) internal _owners; // Mapping owner address to token count, by aggregating all _typeCount NFTs in the contact. mapping (address => uint256) internal _balances; // Mapping from token ID to approved address. mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals. mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the token collection. * * @param name_ Of the collection being deployed. * @param symbol_ Shorthand token identifier, for wallets, etc. * @param id_ Number instance deployed by {BuilderShop} contract. * @param baseURI_ The location where the artifact assets are stored. * @param typeCount_ The number of different Nifty types (different * individual NFTs) associated with the deployed collection. * @param defaultOwner_ Intial receiver of all newly minted NFTs. * @param niftyRegistryContract Points to the repository of authenticated * addresses for stateful operations. */ constructor(string memory name_, string memory symbol_, uint256 id_, string memory baseURI_, uint256 typeCount_, address defaultOwner_, address niftyRegistryContract) NiftyEntity(niftyRegistryContract) { _name = name_; _symbol = symbol_; _id = id_; _baseURI = baseURI_; _typeCount = typeCount_; _defaultOwner = defaultOwner_; midLevelMultiplier = 100000; topLevelMultiplier = id_ * 1000000000; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the link to artificat location for a given token by 'tokenId'. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query. * @return The location where the artifact assets are stored. */ function tokenURI(uint256 tokenId) external virtual view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory tokenIdStr = Strings.toString(tokenId); return string(abi.encodePacked(_baseURI, tokenIdStr)); } /** * @dev Returns an IPFS hash for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query. * @return IPFS hash for this (_typeCount) NFT. */ function tokenIPFSHash(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: IPFS hash query for nonexistent token"); uint256 niftyType = _getNiftyTypeId(tokenId); return _niftyTypeIPFSHashes[niftyType]; } /** * @dev Determine which NFT in the contract (_typeCount) is associated * with this 'tokenId'. */ function _getNiftyTypeId(uint256 tokenId) internal view returns (uint256) { if(tokenId <= topLevelMultiplier) { return 0; } else { return (tokenId - topLevelMultiplier) / midLevelMultiplier; } } /** * @dev Returns the Name for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenName(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: Name query for nonexistent token"); uint256 niftyType = _getNiftyTypeId(tokenId); return _niftyTypeName[niftyType]; } /** * @dev Internal function to set the token IPFS hash for a nifty type. * @param niftyType uint256 ID component of the token to set its IPFS hash * @param ipfs_hash string IPFS link to assign */ function _setTokenIPFSHashNiftyType(uint256 niftyType, string memory ipfs_hash) internal { require(bytes(_niftyTypeIPFSHashes[niftyType]).length == 0, "ERC721Metadata: IPFS hash already set"); _niftyTypeIPFSHashes[niftyType] = ipfs_hash; } /** * @dev Internal function to set the name for a nifty type. * @param niftyType uint256 of nifty type name to be set * @param nifty_type_name name of nifty type */ function _setNiftyTypeName(uint256 niftyType, string memory nifty_type_name) internal { _niftyTypeName[niftyType] = nifty_type_name; } /** * @dev Base URI for computing {tokenURI}. */ function _setBaseURI(string memory baseURI_) internal { _baseURI = baseURI_; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (isContract(to)) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } }
pragma solidity 0.8.4; import "./IERC165.sol"; import "../util/SafeERC20.sol"; interface ICloneablePaymentSplitter is IERC165 { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); function initialize(address[] calldata payees, uint256[] calldata shares_) external; function totalShares() external view returns (uint256); function totalReleased() external view returns (uint256); function totalReleased(IERC20 token) external view returns (uint256); function shares(address account) external view returns (uint256); function released(address account) external view returns (uint256); function released(IERC20 token, address account) external view returns (uint256); function payee(uint256 index) external view returns (address); function release(address payable account) external; function release(IERC20 token, address account) external; function pendingPayment(address account) external view returns (uint256); function pendingPayment(IERC20 token, address account) external view returns (uint256); }
pragma solidity 0.8.4; import "./IERC165.sol"; /// /// @dev Interface for the NFT Royalty Standard /// interface IERC2981 is IERC165 { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns ( address receiver, uint256 royaltyAmount ); }
pragma solidity 0.8.4; import "../core/ERC721.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
pragma solidity 0.8.4; // OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol) // OpenZeppelin Contract Commit Hash: 6bd6b76d1156e20e45d1016f355d154141c7e5b9 /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
pragma solidity 0.8.4; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
pragma solidity 0.8.4; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
pragma solidity 0.8.4; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
pragma solidity 0.8.4; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
pragma solidity 0.8.4; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } }
pragma solidity 0.8.4; import "../interface/IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
pragma solidity 0.8.4; /** * @dev Authenticator of state mutating operations for Nifty Gateway contracts. * * addresses for stateful operations. * * Rinkeby: 0xCefBf44ff649B6E0Bc63785699c6F1690b8cF73b * Mainnet: 0x6e53130dDfF21E3BC963Ee902005223b9A202106 */ contract NiftyEntity { // Address of {NiftyRegistry} contract. address internal immutable niftyRegistryContract; /** * @dev Determines whether accounts are allowed to invoke state mutating operations on child contracts. */ modifier onlyValidSender() { NiftyRegistry niftyRegistry = NiftyRegistry(niftyRegistryContract); bool isValid = niftyRegistry.isValidNiftySender(msg.sender); require(isValid, "NiftyEntity: Invalid msg.sender"); _; } /** * @param _niftyRegistryContract Points to the repository of authenticated */ constructor(address _niftyRegistryContract) { niftyRegistryContract = _niftyRegistryContract; } } /** * @dev Defined to mediate interaction with externally deployed {NiftyRegistry} dependency. */ interface NiftyRegistry { function isValidNiftySender(address sending_key) external view returns (bool); }
pragma solidity 0.8.4; /** * @title IERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface IERC165 { /** * @notice Query if a contract implements an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
pragma solidity 0.8.4; import "../interface/IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
pragma solidity 0.8.4; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
pragma solidity 0.8.4; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 1500 }, "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":"niftyRegistryContract","type":"address"},{"internalType":"address","name":"defaultOwner","type":"address"},{"internalType":"address","name":"circumnavigationContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"niftyType","type":"uint256"},{"indexed":false,"internalType":"address","name":"previousReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"newReceiver","type":"address"}],"name":"RoyaltyReceiverUpdated","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"},{"inputs":[],"name":"_defaultOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"}],"name":"_getFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_percentageRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_percentageTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_typeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circumnavigationContract","outputs":[{"internalType":"contract ICircumnavigationURI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"niftyType","type":"uint256"}],"name":"getRoyaltyReceiverByNiftyType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyaltyReceiverByTokenId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"splitterImplementation","type":"address"},{"internalType":"uint256","name":"niftyType","type":"uint256"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"name":"initializeRoyalties","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":"midLevelMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintNifty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"pendingRoyaltyPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingRoyaltyPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"releaseRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releaseRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"}],"name":"setFinalized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"},{"internalType":"string","name":"hashIPFS","type":"string"}],"name":"setNiftyIPFSHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"},{"internalType":"string","name":"niftyName","type":"string"}],"name":"setNiftyName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"niftyType","type":"uint256"},{"internalType":"uint256","name":"percentageRoyalty_","type":"uint256"}],"name":"setRoyaltyBips","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenIPFSHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenName","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":"topLevelMultiplier","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"}]
Contract Creation Code
6101606040523480156200001257600080fd5b50604051620039273803806200392783398101604081905262000035916200027d565b6040518060600160405280603b8152602001620038ec603b91396040518060400160405280601381526020017f43495243554d4e415649474154494f4e204f450000000000000000000000000081525060026001604051806020016040528060008152506040518060400160405280600b81526020016a11185d9948141bdb1b1bdd60aa1b81525088888787878688858780806001600160a01b03166080816001600160a01b031660601b81525050508660009080519060200190620000fd929190620001ba565b50855162000113906001906020890190620001ba565b5060a085905283516200012e906002906020870190620001ba565b5060c08390526001600160601b0319606083901b1660e052620186a0610120526200015e85633b9aca00620002c6565b6101005250508751620001809550600994506020890193509150620001ba9050565b5050612710610140525050600f80546001600160a01b0319166001600160a01b039790971696909617909555506200032f95505050505050565b828054620001c890620002f2565b90600052602060002090601f016020900481019282620001ec576000855562000237565b82601f106200020757805160ff191683800117855562000237565b8280016001018555821562000237579182015b82811115620002375782518255916020019190600101906200021a565b506200024592915062000249565b5090565b5b808211156200024557600081556001016200024a565b80516001600160a01b03811681146200027857600080fd5b919050565b60008060006060848603121562000292578283fd5b6200029d8462000260565b9250620002ad6020850162000260565b9150620002bd6040850162000260565b90509250925092565b6000816000190483118215151615620002ed57634e487b7160e01b81526011600452602481fd5b500290565b600181811c908216806200030757607f821691505b602082108114156200032957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160c05160e05160601c6101005161012051610140516134d06200041c6000396000818161058e01528181610b2c015261153c0152600081816103e30152818161245e01526129c30152600081816105540152818161242f0152818161248201526129ee0152600081816103bc0152818161111c0152818161118701526111da01526000818161040a01528181610cfa01528181611b7b01528181611c7301526121e50152600061032c015260008181610c0d01528181610f610152818161124b015281816114640152818161160401528181611990015261204901526134d06000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c80636352211e11610186578063a80ce4b4116100e3578063d371663011610097578063e725f87711610071578063e725f87714610683578063e985e9c514610696578063f5abac49146106d257600080fd5b8063d37166301461064a578063d7a853be1461065d578063ddbeb9081461067057600080fd5b8063b536d0fa116100c8578063b536d0fa14610611578063b88d4fde14610624578063c87b56dd1461063757600080fd5b8063a80ce4b4146105de578063acd074f5146105f157600080fd5b80638ddadb201161013a57806395d89b411161011f57806395d89b41146105b05780639dd5e481146105b8578063a22cb465146105cb57600080fd5b80638ddadb20146105765780639121ac0d1461058957600080fd5b80637889cc161161016b5780637889cc16146105295780638a0fc1da1461053c5780638ca00c0d1461054f57600080fd5b80636352211e1461050357806370a082311461051657600080fd5b80632276f3f21161023457806342842e0e116101e85780634fba84ca116101cd5780634fba84ca146104bd57806355f804b3146104d05780635f2ef9dc146104e357600080fd5b806342842e0e1461049757806342966c68146104aa57600080fd5b80632a55205a116102195780632a55205a1461043f5780632b6db05514610471578063396478d31461048457600080fd5b80632276f3f21461040557806323b872dd1461042c57600080fd5b806306fdde031161028b578063095ea7b311610270578063095ea7b3146103a2578063139fed7c146103b75780631a521760146103de57600080fd5b806306fdde0314610387578063081812fc1461038f57600080fd5b806302d05d3f116102bc57806302d05d3f146103125780630518023714610327578063051c62ae1461035c57600080fd5b8062cd587c146102d757806301ffc9a7146102ff575b600080fd5b6102ea6102e5366004613125565b6106e5565b60405190151581526020015b60405180910390f35b6102ea61030d366004613035565b610723565b61031a610767565b6040516102f691906132bb565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016102f6565b61036f61036a366004613125565b6107f9565b6040516001600160a01b0390911681526020016102f6565b61031a61080c565b61036f61039d366004613125565b61081b565b6103b56103b0366004612f65565b6108c6565b005b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b6103b561043a366004612e7b565b6109f8565b61045261044d36600461319a565b610a80565b604080516001600160a01b0390931683526020830191909152016102f6565b6103b561047f366004613155565b610bf8565b6103b5610492366004612e27565b610cf3565b6103b56104a5366004612e7b565b610eaa565b6103b56104b8366004613125565b610ec5565b6103b56104cb36600461319a565b610f4c565b6103b56104de36600461307f565b611236565b61034e6104f1366004613125565b600d6020526000908152604090205481565b61036f610511366004613125565b61132a565b61034e610524366004612e27565b6113b5565b6103b561053736600461319a565b61144f565b61036f61054a366004613125565b6115e4565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610584366004612f90565b6115ef565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b61031a61196c565b6103b56105c6366004613125565b61197b565b6103b56105d9366004612f38565b611aae565b61034e6105ec36600461306d565b611b73565b61034e6105ff366004613125565b600a6020526000908152604090205481565b61034e61061f366004612e27565b611c6b565b6103b5610632366004612ebb565b611d5a565b61031a610645366004613125565b611de2565b61031a610658366004613125565b611ef9565b6103b561066b366004613155565b612034565b600f5461036f906001600160a01b031681565b61031a610691366004613125565b612129565b6102ea6106a4366004612e43565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6103b56106e036600461306d565b6121de565b600080600e816106f76101008661333f565b815260200190815260200160002054905061010083610716919061340b565b6001901b16151592915050565b60006001600160e01b031982167f2a55205a0000000000000000000000000000000000000000000000000000000014806107615750610761826123a9565b92915050565b606060098054610776906133b5565b80601f01602080910402602001604051908101604052809291908181526020018280546107a2906133b5565b80156107ef5780601f106107c4576101008083540402835291602001916107ef565b820191906000526020600020905b8154815290600101906020018083116107d257829003601f168201915b5050505050905090565b60006107616108078361242b565b6124b6565b606060008054610776906133b5565b6000818152600560205260408120546001600160a01b03166108aa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006108d18261132a565b9050806001600160a01b0316836001600160a01b0316141561095b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108a1565b336001600160a01b0382161480610977575061097781336106a4565b6109e95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108a1565b6109f38383612530565b505050565b610a03335b8261259e565b610a755760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108a1565b6109f38383836126a6565b60008281526005602052604081205481906001600160a01b0316610b0c5760405162461bcd60e51b815260206004820152603a60248201527f4e696674794275696c646572496e7374616e63653a206f70657261746f72207160448201527f7565727920666f72206e6f6e6578697374656e7420746f6b656e00000000000060648201526084016108a1565b6000610b178561242b565b6000818152600a6020526040812054919250907f000000000000000000000000000000000000000000000000000000000000000090610b569087613353565b610b60919061333f565b90506000610b6d836124b6565b90506001600160a01b038116610beb5760405162461bcd60e51b815260206004820152602960248201527f4e696674794275696c646572496e7374616e63653a204e6f20726f79616c747960448201527f207265636569766572000000000000000000000000000000000000000000000060648201526084016108a1565b93509150505b9250929050565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b158015610c5c57600080fd5b505afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c949190613019565b905080610ce35760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b610ced8484612873565b50505050565b600060015b7f00000000000000000000000000000000000000000000000000000000000000008111610e5c576000818152600b60205260409020546001600160a01b03168015610e4957604051632bab85df60e21b81526001600160a01b038581166004830152829160009183169063aeae177c9060240160206040518083038186803b158015610d8357600080fd5b505afa158015610d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb919061313d565b90508015610e4657610dcd8186613327565b6040517f191655870000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291965090831690631916558790602401600060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050505b50505b5080610e54816133f0565b915050610cf8565b508015610ea657604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15b5050565b6109f383838360405180602001604052806000815250611d5a565b610ece336109fd565b610f405760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f7665640000000000000000000000000000000060648201526084016108a1565b610f4981612920565b50565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b158015610fb057600080fd5b505afa158015610fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe89190613019565b9050806110375760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b611040846106e5565b156110b35760405162461bcd60e51b815260206004820152603660248201527f4e696674794275696c646572496e7374616e63653a206d696e74696e6720636f60448201527f6e636c7564656420666f72206e6966747920747970650000000000000000000060648201526084016108a1565b6000848152600d60205260408120546110cd906001613327565b905060006110db86836129bb565b9050600060016110eb8784613327565b6110f59190613372565b9050815b81811161115957600081815260056020526040902080546001600160a01b0319167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031617905580611151816133f0565b9150506110f9565b506000878152600d602052604081208054889290611178908490613327565b90915550506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600090815260066020526040812080548892906111c5908490613327565b90915550506040518181526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060009084907fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d9060200160405180910390a450505050505050565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190613019565b9050806113215760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b6109f383612a23565b6000818152600560205260408120546001600160a01b0316806107615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108a1565b60006001600160a01b0382166114335760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108a1565b506001600160a01b031660009081526006602052604090205490565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114eb9190613019565b90508061153a5760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b7f00000000000000000000000000000000000000000000000000000000000000008311156115d05760405162461bcd60e51b815260206004820152603560248201527f4e696674794275696c646572496e7374616e63653a20496c6c6567616c20617260448201527f67756d656e74206d6f7265207468616e2031303025000000000000000000000060648201526084016108a1565b50506000918252600a602052604090912055565b6000610761826124b6565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b15801561165357600080fd5b505afa158015611667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168b9190613019565b9050806116da5760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b60006116e5886124b6565b90506000600187141561176b578787600081811061171357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906117289190612e27565b60008a8152600c6020908152604080832080546001600160a01b0386166001600160a01b031991821617909155600b90925290912080549091169055905061191b565b6000898152600c60205260409081902080546001600160a01b0319169055516301ffc9a760e01b81527f37de79fc0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038b16906301ffc9a79060240160206040518083038186803b1580156117e657600080fd5b505afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190613019565b61186a5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420612076616c6964207061796d656e742073706c69747465720000000060448201526064016108a1565b6118738a612a36565b6040517f7fbbe46f0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690637fbbe46f906118c1908b908b908b908b90600401613223565b600060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b50505060008a8152600b6020526040902080546001600160a01b0319166001600160a01b038416179055505b604080516001600160a01b038085168252831660208201528a917f834a47bfbb51ad808d8649527d9bf540f58cc71dc1093ae2249c8b230575ce98910160405180910390a250505050505050505050565b606060018054610776906133b5565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a179190613019565b905080611a665760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b6000611a746101008561333f565b6000818152600e6020526040902054909150611a926101008661340b565b6000928352600e6020526040909220600190921b179055505050565b6001600160a01b038216331415611b075760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108a1565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008060015b7f00000000000000000000000000000000000000000000000000000000000000008111611c63576000818152600b60205260409020546001600160a01b03168015611c505760405163049268bd60e31b81526001600160a01b038781166004830152868116602483015282919082169063249345e89060440160206040518083038186803b158015611c0a57600080fd5b505afa158015611c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c42919061313d565b611c4c9085613327565b9350505b5080611c5b816133f0565b915050611b79565b509392505050565b60008060015b7f00000000000000000000000000000000000000000000000000000000000000008111611d53576000818152600b60205260409020546001600160a01b03168015611d4057604051632bab85df60e21b81526001600160a01b03868116600483015282919082169063aeae177c9060240160206040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d32919061313d565b611d3c9085613327565b9350505b5080611d4b816133f0565b915050611c71565b5092915050565b611d64338361259e565b611dd65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108a1565b610ced84848484612aec565b6000818152600560205260409020546060906001600160a01b0316611e6f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108a1565b600f60009054906101000a90046001600160a01b03166001600160a01b031663b89ca6986040518163ffffffff1660e01b815260040160006040518083038186803b158015611ebd57600080fd5b505afa158015611ed1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261076191908101906130b2565b6000818152600560205260409020546060906001600160a01b0316611f865760405162461bcd60e51b815260206004820152603560248201527f4552433732314d657461646174613a204950465320686173682071756572792060448201527f666f72206e6f6e6578697374656e7420746f6b656e000000000000000000000060648201526084016108a1565b6000611f918361242b565b6000818152600460205260409020805491925090611fae906133b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611fda906133b5565b80156120275780601f10611ffc57610100808354040283529160200191612027565b820191906000526020600020905b81548152906001019060200180831161200a57829003601f168201915b5050505050915050919050565b6040516371be737d60e11b81523360048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b15801561209857600080fd5b505afa1580156120ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d09190613019565b90508061211f5760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b610ced8484612b75565b6000818152600560205260409020546060906001600160a01b03166121b65760405162461bcd60e51b815260206004820152603060248201527f4552433732314d657461646174613a204e616d6520717565727920666f72206e60448201527f6f6e6578697374656e7420746f6b656e0000000000000000000000000000000060648201526084016108a1565b60006121c18361242b565b6000818152600360205260409020805491925090611fae906133b5565b600060015b7f00000000000000000000000000000000000000000000000000000000000000008111612357576000818152600b60205260409020546001600160a01b031680156123445760405163049268bd60e31b81526001600160a01b0386811660048301528581166024830152829160009183169063249345e89060440160206040518083038186803b15801561227657600080fd5b505afa15801561228a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ae919061313d565b90508015612341576122c08186613327565b6040517f48b750440000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528881166024830152919650908316906348b7504490604401600060405180830381600087803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b505050505b50505b508061234f816133f0565b9150506121e3565b5080156109f357604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061240c57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061076157506301ffc9a760e01b6001600160e01b0319831614610761565b60007f0000000000000000000000000000000000000000000000000000000000000000821161245c57506000919050565b7f00000000000000000000000000000000000000000000000000000000000000006124a77f000000000000000000000000000000000000000000000000000000000000000084613372565b610761919061333f565b919050565b6000818152600c60205260408120546001600160a01b0316156124ef57506000908152600c60205260409020546001600160a01b031690565b6000828152600b60205260409020546001600160a01b03161561252857506000908152600b60205260409020546001600160a01b031690565b506000919050565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125658261132a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b03166126285760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108a1565b60006126338361132a565b9050806001600160a01b0316846001600160a01b0316148061266e5750836001600160a01b03166126638461081b565b6001600160a01b0316145b8061269e57506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166126b98261132a565b6001600160a01b0316146127355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016108a1565b6001600160a01b0382166127b05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108a1565b6127bb600082612530565b6001600160a01b03831660009081526006602052604081208054600192906127e4908490613372565b90915550506001600160a01b0382166000908152600660205260408120805460019290612812908490613327565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000828152600460205260409020805461288c906133b5565b1590506129015760405162461bcd60e51b815260206004820152602560248201527f4552433732314d657461646174613a2049504653206861736820616c7265616460448201527f792073657400000000000000000000000000000000000000000000000000000060648201526084016108a1565b600082815260046020908152604090912082516109f392840190612cee565b600061292b8261132a565b9050612938600083612530565b6001600160a01b0381166000908152600660205260408120805460019290612961908490613372565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000816129e87f000000000000000000000000000000000000000000000000000000000000000085613353565b612a12907f0000000000000000000000000000000000000000000000000000000000000000613327565b612a1c9190613327565b9392505050565b8051610ea6906002906020840190612cee565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b0381166124b15760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064016108a1565b612af78484846126a6565b612b0384848484612b94565b610ced5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108a1565b600082815260036020908152604090912082516109f392840190612cee565b6000833b15612ce357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bcf9033908990889088906004016131e7565b602060405180830381600087803b158015612be957600080fd5b505af1925050508015612c19575060408051601f3d908101601f19168201909252612c1691810190613051565b60015b612cc9573d808015612c47576040519150601f19603f3d011682016040523d82523d6000602084013e612c4c565b606091505b508051612cc15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061269e565b506001949350505050565b828054612cfa906133b5565b90600052602060002090601f016020900481019282612d1c5760008555612d62565b82601f10612d3557805160ff1916838001178555612d62565b82800160010185558215612d62579182015b82811115612d62578251825591602001919060010190612d47565b50612d6e929150612d72565b5090565b5b80821115612d6e5760008155600101612d73565b6000612d9a612d95846132ff565b6132ce565b9050828152838383011115612dae57600080fd5b828260208301376000602084830101529392505050565b60008083601f840112612dd6578182fd5b50813567ffffffffffffffff811115612ded578182fd5b6020830191508360208260051b8501011115610bf157600080fd5b600082601f830112612e18578081fd5b612a1c83833560208501612d87565b600060208284031215612e38578081fd5b8135612a1c81613461565b60008060408385031215612e55578081fd5b8235612e6081613461565b91506020830135612e7081613461565b809150509250929050565b600080600060608486031215612e8f578081fd5b8335612e9a81613461565b92506020840135612eaa81613461565b929592945050506040919091013590565b60008060008060808587031215612ed0578081fd5b8435612edb81613461565b93506020850135612eeb81613461565b925060408501359150606085013567ffffffffffffffff811115612f0d578182fd5b8501601f81018713612f1d578182fd5b612f2c87823560208401612d87565b91505092959194509250565b60008060408385031215612f4a578182fd5b8235612f5581613461565b91506020830135612e7081613476565b60008060408385031215612f77578182fd5b8235612f8281613461565b946020939093013593505050565b60008060008060008060808789031215612fa8578182fd5b8635612fb381613461565b955060208701359450604087013567ffffffffffffffff80821115612fd6578384fd5b612fe28a838b01612dc5565b90965094506060890135915080821115612ffa578384fd5b5061300789828a01612dc5565b979a9699509497509295939492505050565b60006020828403121561302a578081fd5b8151612a1c81613476565b600060208284031215613046578081fd5b8135612a1c81613484565b600060208284031215613062578081fd5b8151612a1c81613484565b60008060408385031215612e55578182fd5b600060208284031215613090578081fd5b813567ffffffffffffffff8111156130a6578182fd5b61269e84828501612e08565b6000602082840312156130c3578081fd5b815167ffffffffffffffff8111156130d9578182fd5b8201601f810184136130e9578182fd5b80516130f7612d95826132ff565b81815285602083850101111561310b578384fd5b61311c826020830160208601613389565b95945050505050565b600060208284031215613136578081fd5b5035919050565b60006020828403121561314e578081fd5b5051919050565b60008060408385031215613167578182fd5b82359150602083013567ffffffffffffffff811115613184578182fd5b61319085828601612e08565b9150509250929050565b600080604083850312156131ac578182fd5b50508035926020909101359150565b600081518084526131d3816020860160208601613389565b601f01601f19169290920160200192915050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261321960808301846131bb565b9695505050505050565b6040808252810184905260008560608301825b8781101561326657823561324981613461565b6001600160a01b0316825260209283019290910190600101613236565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561329e578283fd5b8460051b9150818660208301370160200190815295945050505050565b602081526000612a1c60208301846131bb565b604051601f8201601f1916810167ffffffffffffffff811182821017156132f7576132f761344b565b604052919050565b600067ffffffffffffffff8211156133195761331961344b565b50601f01601f191660200190565b6000821982111561333a5761333a61341f565b500190565b60008261334e5761334e613435565b500490565b600081600019048311821515161561336d5761336d61341f565b500290565b6000828210156133845761338461341f565b500390565b60005b838110156133a457818101518382015260200161338c565b83811115610ced5750506000910152565b600181811c908216806133c957607f821691505b602082108114156133ea57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134045761340461341f565b5060010190565b60008261341a5761341a613435565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f4957600080fd5b8015158114610f4957600080fd5b6001600160e01b031981168114610f4957600080fdfea2646970667358221220420deb0ece036c2e712066f1969139ebaaefe6a83ca2aa7d4e0d5587f680865364736f6c6343000804003343697263756d6e617669676174696f6e20436f6c6c6563746f72204f6e6c79204f70656e2045646974696f6e206279204461766520506f6c6c6f740000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d5000000000000000000000000dcb34b4ceed4bd6ba0ee08445d57a27d18e66a30
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d25760003560e01c80636352211e11610186578063a80ce4b4116100e3578063d371663011610097578063e725f87711610071578063e725f87714610683578063e985e9c514610696578063f5abac49146106d257600080fd5b8063d37166301461064a578063d7a853be1461065d578063ddbeb9081461067057600080fd5b8063b536d0fa116100c8578063b536d0fa14610611578063b88d4fde14610624578063c87b56dd1461063757600080fd5b8063a80ce4b4146105de578063acd074f5146105f157600080fd5b80638ddadb201161013a57806395d89b411161011f57806395d89b41146105b05780639dd5e481146105b8578063a22cb465146105cb57600080fd5b80638ddadb20146105765780639121ac0d1461058957600080fd5b80637889cc161161016b5780637889cc16146105295780638a0fc1da1461053c5780638ca00c0d1461054f57600080fd5b80636352211e1461050357806370a082311461051657600080fd5b80632276f3f21161023457806342842e0e116101e85780634fba84ca116101cd5780634fba84ca146104bd57806355f804b3146104d05780635f2ef9dc146104e357600080fd5b806342842e0e1461049757806342966c68146104aa57600080fd5b80632a55205a116102195780632a55205a1461043f5780632b6db05514610471578063396478d31461048457600080fd5b80632276f3f21461040557806323b872dd1461042c57600080fd5b806306fdde031161028b578063095ea7b311610270578063095ea7b3146103a2578063139fed7c146103b75780631a521760146103de57600080fd5b806306fdde0314610387578063081812fc1461038f57600080fd5b806302d05d3f116102bc57806302d05d3f146103125780630518023714610327578063051c62ae1461035c57600080fd5b8062cd587c146102d757806301ffc9a7146102ff575b600080fd5b6102ea6102e5366004613125565b6106e5565b60405190151581526020015b60405180910390f35b6102ea61030d366004613035565b610723565b61031a610767565b6040516102f691906132bb565b61034e7f000000000000000000000000000000000000000000000000000000000000000281565b6040519081526020016102f6565b61036f61036a366004613125565b6107f9565b6040516001600160a01b0390911681526020016102f6565b61031a61080c565b61036f61039d366004613125565b61081b565b6103b56103b0366004612f65565b6108c6565b005b61036f7f000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d581565b61034e7f00000000000000000000000000000000000000000000000000000000000186a081565b61034e7f000000000000000000000000000000000000000000000000000000000000000181565b6103b561043a366004612e7b565b6109f8565b61045261044d36600461319a565b610a80565b604080516001600160a01b0390931683526020830191909152016102f6565b6103b561047f366004613155565b610bf8565b6103b5610492366004612e27565b610cf3565b6103b56104a5366004612e7b565b610eaa565b6103b56104b8366004613125565b610ec5565b6103b56104cb36600461319a565b610f4c565b6103b56104de36600461307f565b611236565b61034e6104f1366004613125565b600d6020526000908152604090205481565b61036f610511366004613125565b61132a565b61034e610524366004612e27565b6113b5565b6103b561053736600461319a565b61144f565b61036f61054a366004613125565b6115e4565b61034e7f000000000000000000000000000000000000000000000000000000007735940081565b6103b5610584366004612f90565b6115ef565b61034e7f000000000000000000000000000000000000000000000000000000000000271081565b61031a61196c565b6103b56105c6366004613125565b61197b565b6103b56105d9366004612f38565b611aae565b61034e6105ec36600461306d565b611b73565b61034e6105ff366004613125565b600a6020526000908152604090205481565b61034e61061f366004612e27565b611c6b565b6103b5610632366004612ebb565b611d5a565b61031a610645366004613125565b611de2565b61031a610658366004613125565b611ef9565b6103b561066b366004613155565b612034565b600f5461036f906001600160a01b031681565b61031a610691366004613125565b612129565b6102ea6106a4366004612e43565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6103b56106e036600461306d565b6121de565b600080600e816106f76101008661333f565b815260200190815260200160002054905061010083610716919061340b565b6001901b16151592915050565b60006001600160e01b031982167f2a55205a0000000000000000000000000000000000000000000000000000000014806107615750610761826123a9565b92915050565b606060098054610776906133b5565b80601f01602080910402602001604051908101604052809291908181526020018280546107a2906133b5565b80156107ef5780601f106107c4576101008083540402835291602001916107ef565b820191906000526020600020905b8154815290600101906020018083116107d257829003601f168201915b5050505050905090565b60006107616108078361242b565b6124b6565b606060008054610776906133b5565b6000818152600560205260408120546001600160a01b03166108aa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006108d18261132a565b9050806001600160a01b0316836001600160a01b0316141561095b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016108a1565b336001600160a01b0382161480610977575061097781336106a4565b6109e95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108a1565b6109f38383612530565b505050565b610a03335b8261259e565b610a755760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108a1565b6109f38383836126a6565b60008281526005602052604081205481906001600160a01b0316610b0c5760405162461bcd60e51b815260206004820152603a60248201527f4e696674794275696c646572496e7374616e63653a206f70657261746f72207160448201527f7565727920666f72206e6f6e6578697374656e7420746f6b656e00000000000060648201526084016108a1565b6000610b178561242b565b6000818152600a6020526040812054919250907f000000000000000000000000000000000000000000000000000000000000271090610b569087613353565b610b60919061333f565b90506000610b6d836124b6565b90506001600160a01b038116610beb5760405162461bcd60e51b815260206004820152602960248201527f4e696674794275696c646572496e7374616e63653a204e6f20726f79616c747960448201527f207265636569766572000000000000000000000000000000000000000000000060648201526084016108a1565b93509150505b9250929050565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b158015610c5c57600080fd5b505afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c949190613019565b905080610ce35760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b610ced8484612873565b50505050565b600060015b7f00000000000000000000000000000000000000000000000000000000000000018111610e5c576000818152600b60205260409020546001600160a01b03168015610e4957604051632bab85df60e21b81526001600160a01b038581166004830152829160009183169063aeae177c9060240160206040518083038186803b158015610d8357600080fd5b505afa158015610d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb919061313d565b90508015610e4657610dcd8186613327565b6040517f191655870000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291965090831690631916558790602401600060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050505b50505b5080610e54816133f0565b915050610cf8565b508015610ea657604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15b5050565b6109f383838360405180602001604052806000815250611d5a565b610ece336109fd565b610f405760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f7665640000000000000000000000000000000060648201526084016108a1565b610f4981612920565b50565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b158015610fb057600080fd5b505afa158015610fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe89190613019565b9050806110375760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b611040846106e5565b156110b35760405162461bcd60e51b815260206004820152603660248201527f4e696674794275696c646572496e7374616e63653a206d696e74696e6720636f60448201527f6e636c7564656420666f72206e6966747920747970650000000000000000000060648201526084016108a1565b6000848152600d60205260408120546110cd906001613327565b905060006110db86836129bb565b9050600060016110eb8784613327565b6110f59190613372565b9050815b81811161115957600081815260056020526040902080546001600160a01b0319167f000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d56001600160a01b031617905580611151816133f0565b9150506110f9565b506000878152600d602052604081208054889290611178908490613327565b90915550506001600160a01b037f000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d516600090815260066020526040812080548892906111c5908490613327565b90915550506040518181526001600160a01b037f000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d5169060009084907fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d9060200160405180910390a450505050505050565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d29190613019565b9050806113215760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b6109f383612a23565b6000818152600560205260408120546001600160a01b0316806107615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016108a1565b60006001600160a01b0382166114335760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016108a1565b506001600160a01b031660009081526006602052604090205490565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114eb9190613019565b90508061153a5760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b7f00000000000000000000000000000000000000000000000000000000000027108311156115d05760405162461bcd60e51b815260206004820152603560248201527f4e696674794275696c646572496e7374616e63653a20496c6c6567616c20617260448201527f67756d656e74206d6f7265207468616e2031303025000000000000000000000060648201526084016108a1565b50506000918252600a602052604090912055565b6000610761826124b6565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b15801561165357600080fd5b505afa158015611667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168b9190613019565b9050806116da5760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b60006116e5886124b6565b90506000600187141561176b578787600081811061171357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906117289190612e27565b60008a8152600c6020908152604080832080546001600160a01b0386166001600160a01b031991821617909155600b90925290912080549091169055905061191b565b6000898152600c60205260409081902080546001600160a01b0319169055516301ffc9a760e01b81527f37de79fc0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038b16906301ffc9a79060240160206040518083038186803b1580156117e657600080fd5b505afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190613019565b61186a5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420612076616c6964207061796d656e742073706c69747465720000000060448201526064016108a1565b6118738a612a36565b6040517f7fbbe46f0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690637fbbe46f906118c1908b908b908b908b90600401613223565b600060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b50505060008a8152600b6020526040902080546001600160a01b0319166001600160a01b038416179055505b604080516001600160a01b038085168252831660208201528a917f834a47bfbb51ad808d8649527d9bf540f58cc71dc1093ae2249c8b230575ce98910160405180910390a250505050505050505050565b606060018054610776906133b5565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a179190613019565b905080611a665760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b6000611a746101008561333f565b6000818152600e6020526040902054909150611a926101008661340b565b6000928352600e6020526040909220600190921b179055505050565b6001600160a01b038216331415611b075760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108a1565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008060015b7f00000000000000000000000000000000000000000000000000000000000000018111611c63576000818152600b60205260409020546001600160a01b03168015611c505760405163049268bd60e31b81526001600160a01b038781166004830152868116602483015282919082169063249345e89060440160206040518083038186803b158015611c0a57600080fd5b505afa158015611c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c42919061313d565b611c4c9085613327565b9350505b5080611c5b816133f0565b915050611b79565b509392505050565b60008060015b7f00000000000000000000000000000000000000000000000000000000000000018111611d53576000818152600b60205260409020546001600160a01b03168015611d4057604051632bab85df60e21b81526001600160a01b03868116600483015282919082169063aeae177c9060240160206040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d32919061313d565b611d3c9085613327565b9350505b5080611d4b816133f0565b915050611c71565b5092915050565b611d64338361259e565b611dd65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016108a1565b610ced84848484612aec565b6000818152600560205260409020546060906001600160a01b0316611e6f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016108a1565b600f60009054906101000a90046001600160a01b03166001600160a01b031663b89ca6986040518163ffffffff1660e01b815260040160006040518083038186803b158015611ebd57600080fd5b505afa158015611ed1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261076191908101906130b2565b6000818152600560205260409020546060906001600160a01b0316611f865760405162461bcd60e51b815260206004820152603560248201527f4552433732314d657461646174613a204950465320686173682071756572792060448201527f666f72206e6f6e6578697374656e7420746f6b656e000000000000000000000060648201526084016108a1565b6000611f918361242b565b6000818152600460205260409020805491925090611fae906133b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611fda906133b5565b80156120275780601f10611ffc57610100808354040283529160200191612027565b820191906000526020600020905b81548152906001019060200180831161200a57829003601f168201915b5050505050915050919050565b6040516371be737d60e11b81523360048201527f0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106906000906001600160a01b0383169063e37ce6fa9060240160206040518083038186803b15801561209857600080fd5b505afa1580156120ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d09190613019565b90508061211f5760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016108a1565b610ced8484612b75565b6000818152600560205260409020546060906001600160a01b03166121b65760405162461bcd60e51b815260206004820152603060248201527f4552433732314d657461646174613a204e616d6520717565727920666f72206e60448201527f6f6e6578697374656e7420746f6b656e0000000000000000000000000000000060648201526084016108a1565b60006121c18361242b565b6000818152600360205260409020805491925090611fae906133b5565b600060015b7f00000000000000000000000000000000000000000000000000000000000000018111612357576000818152600b60205260409020546001600160a01b031680156123445760405163049268bd60e31b81526001600160a01b0386811660048301528581166024830152829160009183169063249345e89060440160206040518083038186803b15801561227657600080fd5b505afa15801561228a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ae919061313d565b90508015612341576122c08186613327565b6040517f48b750440000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528881166024830152919650908316906348b7504490604401600060405180830381600087803b15801561232857600080fd5b505af115801561233c573d6000803e3d6000fd5b505050505b50505b508061234f816133f0565b9150506121e3565b5080156109f357604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061240c57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061076157506301ffc9a760e01b6001600160e01b0319831614610761565b60007f0000000000000000000000000000000000000000000000000000000077359400821161245c57506000919050565b7f00000000000000000000000000000000000000000000000000000000000186a06124a77f000000000000000000000000000000000000000000000000000000007735940084613372565b610761919061333f565b919050565b6000818152600c60205260408120546001600160a01b0316156124ef57506000908152600c60205260409020546001600160a01b031690565b6000828152600b60205260409020546001600160a01b03161561252857506000908152600b60205260409020546001600160a01b031690565b506000919050565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125658261132a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b03166126285760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016108a1565b60006126338361132a565b9050806001600160a01b0316846001600160a01b0316148061266e5750836001600160a01b03166126638461081b565b6001600160a01b0316145b8061269e57506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166126b98261132a565b6001600160a01b0316146127355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016108a1565b6001600160a01b0382166127b05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108a1565b6127bb600082612530565b6001600160a01b03831660009081526006602052604081208054600192906127e4908490613372565b90915550506001600160a01b0382166000908152600660205260408120805460019290612812908490613327565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000828152600460205260409020805461288c906133b5565b1590506129015760405162461bcd60e51b815260206004820152602560248201527f4552433732314d657461646174613a2049504653206861736820616c7265616460448201527f792073657400000000000000000000000000000000000000000000000000000060648201526084016108a1565b600082815260046020908152604090912082516109f392840190612cee565b600061292b8261132a565b9050612938600083612530565b6001600160a01b0381166000908152600660205260408120805460019290612961908490613372565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000816129e87f00000000000000000000000000000000000000000000000000000000000186a085613353565b612a12907f0000000000000000000000000000000000000000000000000000000077359400613327565b612a1c9190613327565b9392505050565b8051610ea6906002906020840190612cee565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b0381166124b15760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064016108a1565b612af78484846126a6565b612b0384848484612b94565b610ced5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108a1565b600082815260036020908152604090912082516109f392840190612cee565b6000833b15612ce357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bcf9033908990889088906004016131e7565b602060405180830381600087803b158015612be957600080fd5b505af1925050508015612c19575060408051601f3d908101601f19168201909252612c1691810190613051565b60015b612cc9573d808015612c47576040519150601f19603f3d011682016040523d82523d6000602084013e612c4c565b606091505b508051612cc15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016108a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061269e565b506001949350505050565b828054612cfa906133b5565b90600052602060002090601f016020900481019282612d1c5760008555612d62565b82601f10612d3557805160ff1916838001178555612d62565b82800160010185558215612d62579182015b82811115612d62578251825591602001919060010190612d47565b50612d6e929150612d72565b5090565b5b80821115612d6e5760008155600101612d73565b6000612d9a612d95846132ff565b6132ce565b9050828152838383011115612dae57600080fd5b828260208301376000602084830101529392505050565b60008083601f840112612dd6578182fd5b50813567ffffffffffffffff811115612ded578182fd5b6020830191508360208260051b8501011115610bf157600080fd5b600082601f830112612e18578081fd5b612a1c83833560208501612d87565b600060208284031215612e38578081fd5b8135612a1c81613461565b60008060408385031215612e55578081fd5b8235612e6081613461565b91506020830135612e7081613461565b809150509250929050565b600080600060608486031215612e8f578081fd5b8335612e9a81613461565b92506020840135612eaa81613461565b929592945050506040919091013590565b60008060008060808587031215612ed0578081fd5b8435612edb81613461565b93506020850135612eeb81613461565b925060408501359150606085013567ffffffffffffffff811115612f0d578182fd5b8501601f81018713612f1d578182fd5b612f2c87823560208401612d87565b91505092959194509250565b60008060408385031215612f4a578182fd5b8235612f5581613461565b91506020830135612e7081613476565b60008060408385031215612f77578182fd5b8235612f8281613461565b946020939093013593505050565b60008060008060008060808789031215612fa8578182fd5b8635612fb381613461565b955060208701359450604087013567ffffffffffffffff80821115612fd6578384fd5b612fe28a838b01612dc5565b90965094506060890135915080821115612ffa578384fd5b5061300789828a01612dc5565b979a9699509497509295939492505050565b60006020828403121561302a578081fd5b8151612a1c81613476565b600060208284031215613046578081fd5b8135612a1c81613484565b600060208284031215613062578081fd5b8151612a1c81613484565b60008060408385031215612e55578182fd5b600060208284031215613090578081fd5b813567ffffffffffffffff8111156130a6578182fd5b61269e84828501612e08565b6000602082840312156130c3578081fd5b815167ffffffffffffffff8111156130d9578182fd5b8201601f810184136130e9578182fd5b80516130f7612d95826132ff565b81815285602083850101111561310b578384fd5b61311c826020830160208601613389565b95945050505050565b600060208284031215613136578081fd5b5035919050565b60006020828403121561314e578081fd5b5051919050565b60008060408385031215613167578182fd5b82359150602083013567ffffffffffffffff811115613184578182fd5b61319085828601612e08565b9150509250929050565b600080604083850312156131ac578182fd5b50508035926020909101359150565b600081518084526131d3816020860160208601613389565b601f01601f19169290920160200192915050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261321960808301846131bb565b9695505050505050565b6040808252810184905260008560608301825b8781101561326657823561324981613461565b6001600160a01b0316825260209283019290910190600101613236565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561329e578283fd5b8460051b9150818660208301370160200190815295945050505050565b602081526000612a1c60208301846131bb565b604051601f8201601f1916810167ffffffffffffffff811182821017156132f7576132f761344b565b604052919050565b600067ffffffffffffffff8211156133195761331961344b565b50601f01601f191660200190565b6000821982111561333a5761333a61341f565b500190565b60008261334e5761334e613435565b500490565b600081600019048311821515161561336d5761336d61341f565b500290565b6000828210156133845761338461341f565b500390565b60005b838110156133a457818101518382015260200161338c565b83811115610ced5750506000910152565b600181811c908216806133c957607f821691505b602082108114156133ea57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134045761340461341f565b5060010190565b60008261341a5761341a613435565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f4957600080fd5b8015158114610f4957600080fd5b6001600160e01b031981168114610f4957600080fdfea2646970667358221220420deb0ece036c2e712066f1969139ebaaefe6a83ca2aa7d4e0d5587f680865364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d5000000000000000000000000dcb34b4ceed4bd6ba0ee08445d57a27d18e66a30
-----Decoded View---------------
Arg [0] : niftyRegistryContract (address): 0x6e53130dDfF21E3BC963Ee902005223b9A202106
Arg [1] : defaultOwner (address): 0xE052113bd7D7700d623414a0a4585BCaE754E9d5
Arg [2] : circumnavigationContractAddress (address): 0xdCB34b4cEed4bD6BA0ee08445D57A27D18e66A30
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006e53130ddff21e3bc963ee902005223b9a202106
Arg [1] : 000000000000000000000000e052113bd7d7700d623414a0a4585bcae754e9d5
Arg [2] : 000000000000000000000000dcb34b4ceed4bd6ba0ee08445d57a27d18e66a30
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 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.