Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17239573 | 496 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
RoyaltyEngineV1
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import { ERC165, IERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { AddressUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import { SuperRareContracts } from "./libraries/SuperRareContracts.sol"; import { IManifold } from "./specs/IManifold.sol"; import { IRaribleV1, IRaribleV2 } from "./specs/IRarible.sol"; import { IFoundation } from "./specs/IFoundation.sol"; import { ISuperRareRegistry } from "./specs/ISuperRare.sol"; import { IEIP2981 } from "./specs/IEIP2981.sol"; import { IZoraOverride } from "./specs/IZoraOverride.sol"; import { IArtBlocksOverride } from "./specs/IArtBlocksOverride.sol"; import { IKODAV2Override } from "./specs/IKODAV2Override.sol"; import { IRoyaltyEngineV1 } from "./IRoyaltyEngineV1.sol"; import { IRoyaltyRegistry } from "./IRoyaltyRegistry.sol"; import { IRoyaltySplitter, Recipient } from "./overrides/IRoyaltySplitter.sol"; import { IFallbackRegistry } from "./overrides/IFallbackRegistry.sol"; /** * @dev Engine to lookup royalty configurations */ contract RoyaltyEngineV1 is ERC165, OwnableUpgradeable, IRoyaltyEngineV1 { using AddressUpgradeable for address; // Use int16 for specs to support future spec additions // When we add a spec, we also decrement the NONE value // Anything > NONE and <= NOT_CONFIGURED is considered not configured int16 private constant NONE = -1; int16 private constant NOT_CONFIGURED = 0; int16 private constant MANIFOLD = 1; int16 private constant RARIBLEV1 = 2; int16 private constant RARIBLEV2 = 3; int16 private constant FOUNDATION = 4; int16 private constant EIP2981 = 5; int16 private constant SUPERRARE = 6; int16 private constant ZORA = 7; int16 private constant ARTBLOCKS = 8; int16 private constant KNOWNORIGINV2 = 9; int16 private constant ROYALTY_SPLITTER = 10; int16 private constant FALLBACK = type(int16).max; mapping(address => int16) _specCache; address public royaltyRegistry; IFallbackRegistry public immutable FALLBACK_REGISTRY; constructor(address fallbackRegistry) { FALLBACK_REGISTRY = IFallbackRegistry(fallbackRegistry); } function initialize(address _initialOwner, address royaltyRegistry_) public initializer { _transferOwnership(_initialOwner); require(ERC165Checker.supportsInterface(royaltyRegistry_, type(IRoyaltyRegistry).interfaceId)); royaltyRegistry = royaltyRegistry_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override (ERC165, IERC165) returns (bool) { return interfaceId == type(IRoyaltyEngineV1).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Invalidate the cached spec (useful for situations where tooken royalty implementation changes to a different spec) */ function invalidateCachedRoyaltySpec(address tokenAddress) public { address royaltyAddress = IRoyaltyRegistry(royaltyRegistry).getRoyaltyLookupAddress(tokenAddress); delete _specCache[royaltyAddress]; } /** * @dev View function to get the cached spec of a token */ function getCachedRoyaltySpec(address tokenAddress) public view returns (int16) { address royaltyAddress = IRoyaltyRegistry(royaltyRegistry).getRoyaltyLookupAddress(tokenAddress); return _specCache[royaltyAddress]; } /** * @dev See {IRoyaltyEngineV1-getRoyalty} */ function getRoyalty(address tokenAddress, uint256 tokenId, uint256 value) public override returns (address payable[] memory recipients, uint256[] memory amounts) { // External call to limit gas try this._getRoyaltyAndSpec{gas: 100000}(tokenAddress, tokenId, value) returns ( address payable[] memory _recipients, uint256[] memory _amounts, int16 spec, address royaltyAddress, bool addToCache ) { if (addToCache) _specCache[royaltyAddress] = spec; return (_recipients, _amounts); } catch { revert("Invalid royalty amount"); } } /** * @dev See {IRoyaltyEngineV1-getRoyaltyView}. */ function getRoyaltyView(address tokenAddress, uint256 tokenId, uint256 value) public view override returns (address payable[] memory recipients, uint256[] memory amounts) { // External call to limit gas try this._getRoyaltyAndSpec{gas: 100000}(tokenAddress, tokenId, value) returns ( address payable[] memory _recipients, uint256[] memory _amounts, int16, address, bool ) { return (_recipients, _amounts); } catch { revert("Invalid royalty amount"); } } /** * @dev Get the royalty and royalty spec for a given token * * returns recipients array, amounts array, royalty spec, royalty address, whether or not to add to cache */ function _getRoyaltyAndSpec(address tokenAddress, uint256 tokenId, uint256 value) external view returns ( address payable[] memory recipients, uint256[] memory amounts, int16 spec, address royaltyAddress, bool addToCache ) { require(msg.sender == address(this), "Only Engine"); royaltyAddress = IRoyaltyRegistry(royaltyRegistry).getRoyaltyLookupAddress(tokenAddress); spec = _specCache[royaltyAddress]; if (spec <= NOT_CONFIGURED && spec > NONE) { // No spec configured yet, so we need to detect the spec addToCache = true; // SuperRare handling if (tokenAddress == SuperRareContracts.SUPERRARE_V1 || tokenAddress == SuperRareContracts.SUPERRARE_V2) { try ISuperRareRegistry(SuperRareContracts.SUPERRARE_REGISTRY).tokenCreator(tokenAddress, tokenId) returns (address payable creator) { try ISuperRareRegistry(SuperRareContracts.SUPERRARE_REGISTRY).calculateRoyaltyFee( tokenAddress, tokenId, value ) returns (uint256 amount) { recipients = new address payable[](1); amounts = new uint256[](1); recipients[0] = creator; amounts[0] = amount; return (recipients, amounts, SUPERRARE, royaltyAddress, addToCache); } catch { } } catch { } } try IEIP2981(royaltyAddress).royaltyInfo(tokenId, value) returns (address recipient, uint256 amount) { require(amount < value, "Invalid royalty amount"); uint32 recipientSize; assembly { recipientSize := extcodesize(recipient) } if (recipientSize > 0) { try IRoyaltySplitter(recipient).getRecipients() returns (Recipient[] memory splitRecipients) { recipients = new address payable[](splitRecipients.length); amounts = new uint256[](splitRecipients.length); uint256 sum = 0; uint256 splitRecipientsLength = splitRecipients.length; for (uint256 i = 0; i < splitRecipientsLength;) { Recipient memory splitRecipient = splitRecipients[i]; recipients[i] = payable(splitRecipient.recipient); uint256 splitAmount = splitRecipient.bps * amount / 10000; amounts[i] = splitAmount; sum += splitAmount; unchecked { ++i; } } // sum can be less than amount, otherwise small-value listings can break require(sum <= amount, "Invalid split"); return (recipients, amounts, ROYALTY_SPLITTER, royaltyAddress, addToCache); } catch { } } // Supports EIP2981. Return amounts recipients = new address payable[](1); amounts = new uint256[](1); recipients[0] = payable(recipient); amounts[0] = amount; return (recipients, amounts, EIP2981, royaltyAddress, addToCache); } catch { } try IManifold(royaltyAddress).getRoyalties(tokenId) returns ( address payable[] memory recipients_, uint256[] memory bps ) { // Supports manifold interface. Compute amounts require(recipients_.length == bps.length); return (recipients_, _computeAmounts(value, bps), MANIFOLD, royaltyAddress, addToCache); } catch { } try IRaribleV2(royaltyAddress).getRaribleV2Royalties(tokenId) returns (IRaribleV2.Part[] memory royalties) { // Supports rarible v2 interface. Compute amounts recipients = new address payable[](royalties.length); amounts = new uint256[](royalties.length); uint256 totalAmount; for (uint256 i = 0; i < royalties.length; i++) { recipients[i] = royalties[i].account; amounts[i] = value * royalties[i].value / 10000; totalAmount += amounts[i]; } require(totalAmount < value, "Invalid royalty amount"); return (recipients, amounts, RARIBLEV2, royaltyAddress, addToCache); } catch { } try IRaribleV1(royaltyAddress).getFeeRecipients(tokenId) returns (address payable[] memory recipients_) { // Supports rarible v1 interface. Compute amounts recipients_ = IRaribleV1(royaltyAddress).getFeeRecipients(tokenId); try IRaribleV1(royaltyAddress).getFeeBps(tokenId) returns (uint256[] memory bps) { require(recipients_.length == bps.length); return (recipients_, _computeAmounts(value, bps), RARIBLEV1, royaltyAddress, addToCache); } catch { } } catch { } try IFoundation(royaltyAddress).getFees(tokenId) returns ( address payable[] memory recipients_, uint256[] memory bps ) { // Supports foundation interface. Compute amounts require(recipients_.length == bps.length); return (recipients_, _computeAmounts(value, bps), FOUNDATION, royaltyAddress, addToCache); } catch { } try IZoraOverride(royaltyAddress).convertBidShares(tokenAddress, tokenId) returns ( address payable[] memory recipients_, uint256[] memory bps ) { // Support Zora override require(recipients_.length == bps.length); return (recipients_, _computeAmounts(value, bps), ZORA, royaltyAddress, addToCache); } catch { } try IArtBlocksOverride(royaltyAddress).getRoyalties(tokenAddress, tokenId) returns ( address payable[] memory recipients_, uint256[] memory bps ) { // Support Art Blocks override require(recipients_.length == bps.length); return (recipients_, _computeAmounts(value, bps), ARTBLOCKS, royaltyAddress, addToCache); } catch { } try IKODAV2Override(royaltyAddress).getKODAV2RoyaltyInfo(tokenAddress, tokenId, value) returns ( address payable[] memory _recipients, uint256[] memory _amounts ) { // Support KODA V2 override require(_recipients.length == _amounts.length); return (_recipients, _amounts, KNOWNORIGINV2, royaltyAddress, addToCache); } catch { } try FALLBACK_REGISTRY.getRecipients(tokenAddress) returns (Recipient[] memory _recipients) { uint256 recipientsLength = _recipients.length; if (recipientsLength > 0) { return _calculateFallback(_recipients, recipientsLength, value, royaltyAddress, addToCache); } } catch { } // No supported royalties configured return (recipients, amounts, NONE, royaltyAddress, addToCache); } else { // Spec exists, just execute the appropriate one addToCache = false; if (spec == NONE) { return (recipients, amounts, spec, royaltyAddress, addToCache); } else if (spec == FALLBACK) { Recipient[] memory _recipients = FALLBACK_REGISTRY.getRecipients(tokenAddress); return _calculateFallback(_recipients, _recipients.length, value, royaltyAddress, addToCache); } else if (spec == MANIFOLD) { // Manifold spec uint256[] memory bps; (recipients, bps) = IManifold(royaltyAddress).getRoyalties(tokenId); require(recipients.length == bps.length); return (recipients, _computeAmounts(value, bps), spec, royaltyAddress, addToCache); } else if (spec == RARIBLEV2) { // Rarible v2 spec IRaribleV2.Part[] memory royalties; royalties = IRaribleV2(royaltyAddress).getRaribleV2Royalties(tokenId); recipients = new address payable[](royalties.length); amounts = new uint256[](royalties.length); uint256 totalAmount; for (uint256 i = 0; i < royalties.length; i++) { recipients[i] = royalties[i].account; amounts[i] = value * royalties[i].value / 10000; totalAmount += amounts[i]; } require(totalAmount < value, "Invalid royalty amount"); return (recipients, amounts, spec, royaltyAddress, addToCache); } else if (spec == RARIBLEV1) { // Rarible v1 spec uint256[] memory bps; recipients = IRaribleV1(royaltyAddress).getFeeRecipients(tokenId); bps = IRaribleV1(royaltyAddress).getFeeBps(tokenId); require(recipients.length == bps.length); return (recipients, _computeAmounts(value, bps), spec, royaltyAddress, addToCache); } else if (spec == FOUNDATION) { // Foundation spec uint256[] memory bps; (recipients, bps) = IFoundation(royaltyAddress).getFees(tokenId); require(recipients.length == bps.length); return (recipients, _computeAmounts(value, bps), spec, royaltyAddress, addToCache); } else if (spec == EIP2981 || spec == ROYALTY_SPLITTER) { // EIP2981 spec (address recipient, uint256 amount) = IEIP2981(royaltyAddress).royaltyInfo(tokenId, value); require(amount < value, "Invalid royalty amount"); if (spec == ROYALTY_SPLITTER) { Recipient[] memory splitRecipients = IRoyaltySplitter(recipient).getRecipients(); recipients = new address payable[](splitRecipients.length); amounts = new uint256[](splitRecipients.length); uint256 sum = 0; uint256 splitRecipientsLength = splitRecipients.length; for (uint256 i = 0; i < splitRecipientsLength;) { Recipient memory splitRecipient = splitRecipients[i]; recipients[i] = payable(splitRecipient.recipient); uint256 splitAmount = splitRecipient.bps * amount / 10000; amounts[i] = splitAmount; sum += splitAmount; unchecked { ++i; } } // sum can be less than amount, otherwise small-value listings can break require(sum <= value, "Invalid split"); return (recipients, amounts, spec, royaltyAddress, addToCache); } recipients = new address payable[](1); amounts = new uint256[](1); recipients[0] = payable(recipient); amounts[0] = amount; return (recipients, amounts, spec, royaltyAddress, addToCache); } else if (spec == SUPERRARE) { // SUPERRARE spec address payable creator = ISuperRareRegistry(SuperRareContracts.SUPERRARE_REGISTRY).tokenCreator(tokenAddress, tokenId); uint256 amount = ISuperRareRegistry(SuperRareContracts.SUPERRARE_REGISTRY).calculateRoyaltyFee( tokenAddress, tokenId, value ); recipients = new address payable[](1); amounts = new uint256[](1); recipients[0] = creator; amounts[0] = amount; return (recipients, amounts, spec, royaltyAddress, addToCache); } else if (spec == ZORA) { // Zora spec uint256[] memory bps; (recipients, bps) = IZoraOverride(royaltyAddress).convertBidShares(tokenAddress, tokenId); require(recipients.length == bps.length); return (recipients, _computeAmounts(value, bps), spec, royaltyAddress, addToCache); } else if (spec == ARTBLOCKS) { // Art Blocks spec uint256[] memory bps; (recipients, bps) = IArtBlocksOverride(royaltyAddress).getRoyalties(tokenAddress, tokenId); require(recipients.length == bps.length); return (recipients, _computeAmounts(value, bps), spec, royaltyAddress, addToCache); } else if (spec == KNOWNORIGINV2) { // KnownOrigin.io V2 spec (V3 falls under EIP2981) (recipients, amounts) = IKODAV2Override(royaltyAddress).getKODAV2RoyaltyInfo(tokenAddress, tokenId, value); require(recipients.length == amounts.length); return (recipients, amounts, spec, royaltyAddress, addToCache); } } } function _calculateFallback( Recipient[] memory _recipients, uint256 recipientsLength, uint256 value, address royaltyAddress, bool addToCache ) internal pure returns ( address payable[] memory recipients, uint256[] memory amounts, int16 spec, address _royaltyAddress, bool _addToCache ) { recipients = new address payable[](recipientsLength); amounts = new uint256[](recipientsLength); uint256 totalAmount; for (uint256 i = 0; i < recipientsLength;) { Recipient memory recipient = _recipients[i]; recipients[i] = payable(recipient.recipient); uint256 amount = value * recipient.bps / 10_000; amounts[i] = amount; totalAmount += amount; unchecked { ++i; } } require(totalAmount < value, "Invalid royalty amount"); return (recipients, amounts, FALLBACK, royaltyAddress, addToCache); } /** * Compute royalty amounts */ function _computeAmounts(uint256 value, uint256[] memory bps) private pure returns (uint256[] memory amounts) { amounts = new uint256[](bps.length); uint256 totalAmount; for (uint256 i = 0; i < bps.length; i++) { amounts[i] = value * bps[i] / 10000; totalAmount += amounts[i]; } require(totalAmount < value, "Invalid royalty amount"); return amounts; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Lookup engine interface */ interface IRoyaltyEngineV1 is IERC165 { /** * Get the royalty for a given token (address, id) and value amount. Does not cache the bps/amounts. Caches the spec for a given token address * * @param tokenAddress - The address of the token * @param tokenId - The id of the token * @param value - The value you wish to get the royalty of * * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get */ function getRoyalty(address tokenAddress, uint256 tokenId, uint256 value) external returns (address payable[] memory recipients, uint256[] memory amounts); /** * View only version of getRoyalty * * @param tokenAddress - The address of the token * @param tokenId - The id of the token * @param value - The value you wish to get the royalty of * * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get */ function getRoyaltyView(address tokenAddress, uint256 tokenId, uint256 value) external view returns (address payable[] memory recipients, uint256[] memory amounts); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** * @dev Royalty registry interface */ interface IRoyaltyRegistry is IERC165 { event RoyaltyOverride(address owner, address tokenAddress, address royaltyAddress); /** * Override the location of where to look up royalty information for a given token contract. * Allows for backwards compatibility and implementation of royalty logic for contracts that did not previously support them. * * @param tokenAddress - The token address you wish to override * @param royaltyAddress - The royalty override address */ function setRoyaltyLookupAddress(address tokenAddress, address royaltyAddress) external returns (bool); /** * Returns royalty address location. Returns the tokenAddress by default, or the override if it exists * * @param tokenAddress - The token address you are looking up the royalty for */ function getRoyaltyLookupAddress(address tokenAddress) external view returns (address); /** * Whether or not the message sender can override the royalty address for the given token address * * @param tokenAddress - The token address you are looking up the royalty for */ function overrideAllowed(address tokenAddress) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library SuperRareContracts { address public constant SUPERRARE_REGISTRY = 0x17B0C8564E53f22364A6C8de6F7ca5CE9BEa4e5D; address public constant SUPERRARE_V1 = 0x41A322b28D0fF354040e2CbC676F0320d8c8850d; address public constant SUPERRARE_V2 = 0xb932a70A57673d89f4acfFBE830E8ed7f75Fb9e0; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { Recipient } from "./IRoyaltySplitter.sol"; interface IFallbackRegistry { /** * @dev Get total recipients for token fees. Note that recipient bps is of gross amount, not share of fee amount, * ie, recipients' BPS will not sum to 10_000, but to the total fee BPS for an order. */ function getRecipients(address tokenAddress) external view returns (Recipient[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; struct Recipient { address payable recipient; uint16 bps; } interface IRoyaltySplitter is IERC165 { /** * @dev Set the splitter recipients. Total bps must total 10000. */ function setRecipients(Recipient[] calldata recipients) external; /** * @dev Get the splitter recipients; */ function getRecipients() external view returns (Recipient[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * Interface for an Art Blocks override */ interface IArtBlocksOverride { /** * @dev Get royalites of a token at a given tokenAddress. * Returns array of receivers and basisPoints. * * bytes4(keccak256('getRoyalties(address,uint256)')) == 0x9ca7dc7a * * => 0x9ca7dc7a = 0x9ca7dc7a */ function getRoyalties(address tokenAddress, uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * EIP-2981 */ interface IEIP2981 { /** * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * * => 0x2a55205a = 0x2a55205a */ function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IFoundation { /* * bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c * * => 0xd5a06d4c = 0xd5a06d4c */ function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); } interface IFoundationTreasuryNode { function getFoundationTreasury() external view returns (address payable); } interface IFoundationTreasury { function isAdmin(address account) external view returns (bool); }
// SPDX-License-Identifier: MIT /// @author: knownorigin.io pragma solidity ^0.8.0; interface IKODAV2 { function editionOfTokenId(uint256 _tokenId) external view returns (uint256 _editionNumber); function artistCommission(uint256 _editionNumber) external view returns (address _artistAccount, uint256 _artistCommission); function editionOptionalCommission(uint256 _editionNumber) external view returns (uint256 _rate, address _recipient); } interface IKODAV2Override { /// @notice Emitted when the royalties fee changes event CreatorRoyaltiesFeeUpdated(uint256 _oldCreatorRoyaltiesFee, uint256 _newCreatorRoyaltiesFee); /// @notice For the given KO NFT and token ID, return the addresses and the amounts to pay function getKODAV2RoyaltyInfo(address _tokenAddress, uint256 _id, uint256 _amount) external view returns (address payable[] memory, uint256[] memory); /// @notice Allows the owner() to update the creator royalties function updateCreatorRoyalties(uint256 _creatorRoyaltiesFee) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author: manifold.xyz /** * @dev Royalty interface for creator core classes */ interface IManifold { /** * @dev Get royalites of a token. Returns list of receivers and basisPoints * * bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6 * * => 0xbb3bafd6 = 0xbb3bafd6 */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IRaribleV1 { /* * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584 */ function getFeeBps(uint256 id) external view returns (uint256[] memory); function getFeeRecipients(uint256 id) external view returns (address payable[] memory); } interface IRaribleV2 { /* * bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca */ struct Part { address payable account; uint96 value; } function getRaribleV2Royalties(uint256 id) external view returns (Part[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ISuperRareRegistry { /** * @dev Get the royalty fee percentage for a specific ERC721 contract. * @param _contractAddress address ERC721Contract address. * @param _tokenId uint256 token ID. * @return uint8 wei royalty fee. */ function getERC721TokenRoyaltyPercentage(address _contractAddress, uint256 _tokenId) external view returns (uint8); /** * @dev Utililty function to calculate the royalty fee for a token. * @param _contractAddress address ERC721Contract address. * @param _tokenId uint256 token ID. * @param _amount uint256 wei amount. * @return uint256 wei fee. */ function calculateRoyaltyFee(address _contractAddress, uint256 _tokenId, uint256 _amount) external view returns (uint256); /** * @dev Get the token creator which will receive royalties of the given token * @param _contractAddress address ERC721Contract address. * @param _tokenId uint256 token ID. */ function tokenCreator(address _contractAddress, uint256 _tokenId) external view returns (address payable); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * Paired down version of the Zora Market interface */ interface IZoraMarket { struct ZoraDecimal { uint256 value; } struct ZoraBidShares { // % of sale value that goes to the _previous_ owner of the nft ZoraDecimal prevOwner; // % of sale value that goes to the original creator of the nft ZoraDecimal creator; // % of sale value that goes to the seller (current owner) of the nft ZoraDecimal owner; } function bidSharesForToken(uint256 tokenId) external view returns (ZoraBidShares memory); } /** * Paired down version of the Zora Media interface */ interface IZoraMedia { /** * Auto-generated accessors of public variables */ function marketContract() external view returns (address); function previousTokenOwners(uint256 tokenId) external view returns (address); function tokenCreators(uint256 tokenId) external view returns (address); /** * ERC721 function */ function ownerOf(uint256 tokenId) external view returns (address owner); } /** * Interface for a Zora media override */ interface IZoraOverride { /** * @dev Convert bid share configuration of a Zora Media token into an array of receivers and bps values * Does not support prevOwner and sell-on amounts as that is specific to Zora marketplace implementation * and requires updates on the Zora Media and Marketplace to update the sell-on amounts/previous owner values. * An off-Zora marketplace sale will break the sell-on functionality. */ function convertBidShares(address media, uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface. */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) && !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
{ "remappings": [ "@manifoldxyz/libraries-solidity/=lib/libraries-solidity/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "create2-helpers/=lib/create2-helpers/src/", "create2-scripts/=lib/create2-helpers/script/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "libraries-solidity/=lib/libraries-solidity/contracts/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"fallbackRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"FALLBACK_REGISTRY","outputs":[{"internalType":"contract IFallbackRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"_getRoyaltyAndSpec","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"int16","name":"spec","type":"int16"},{"internalType":"address","name":"royaltyAddress","type":"address"},{"internalType":"bool","name":"addToCache","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getCachedRoyaltySpec","outputs":[{"internalType":"int16","name":"","type":"int16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getRoyalty","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getRoyaltyView","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"royaltyRegistry_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"invalidateCachedRoyaltySpec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162003ab238038062003ab2833981016040819052620000349162000046565b6001600160a01b031660805262000078565b6000602082840312156200005957600080fd5b81516001600160a01b03811681146200007157600080fd5b9392505050565b608051613a10620000a2600039600081816102130152818161182501526119820152613a106000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80637dec6f2e11610081578063f2fde38b1161005b578063f2fde38b146101fb578063f356dc2e1461020e578063f533b8021461023557600080fd5b80637dec6f2e146101895780638da5cb5b1461019c578063a11b0712146101db57600080fd5b806371100f52116100b257806371100f5214610137578063715018a61461015b5780637488f1211461016357600080fd5b806301ffc9a7146100d95780633e10401414610101578063485cc95514610122575b600080fd5b6100ec6100e73660046131f7565b610248565b60405190151581526020015b60405180910390f35b61011461010f36600461325b565b6102e1565b6040516100f8929190613311565b61013561013036600461333f565b610425565b005b61014a61014536600461325b565b61062d565b6040516100f8959493929190613378565b610135612885565b6101766101713660046133d6565b612899565b60405160019190910b81526020016100f8565b6101356101973660046133d6565b612960565b60335473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b6066546101b69073ffffffffffffffffffffffffffffffffffffffff1681565b6101356102093660046133d6565b612a43565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b61011461024336600461325b565b612afa565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fcb23f8160000000000000000000000000000000000000000000000000000000014806102db57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040517f71100f5200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810183905260448101829052606090819030906371100f5290620186a0906064016000604051808303818786fa935050505080156103a357506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103a0919081019061358d565b60015b61040e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e740000000000000000000060448201526064015b60405180910390fd5b5092945090925061041d915050565b935093915050565b600054610100900460ff16158080156104455750600054600160ff909116105b8061045f5750303b15801561045f575060005460ff166001145b6104eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610405565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561054957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61055283612c88565b61057c827f880963ac00000000000000000000000000000000000000000000000000000000612cff565b61058557600080fd5b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561062857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6060806000808033301461069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f6e6c7920456e67696e650000000000000000000000000000000000000000006044820152606401610405565b6066546040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301529091169063de5488af90602401602060405180830381865afa15801561070d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107319190613638565b73ffffffffffffffffffffffffffffffffffffffff811660009081526065602052604081205460010b9450909250831380159061079157507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184900b135b156119015750600173ffffffffffffffffffffffffffffffffffffffff88167341a322b28d0ff354040e2cbc676f0320d8c8850d14806107fa575073ffffffffffffffffffffffffffffffffffffffff881673b932a70a57673d89f4acffbe830e8ed7f75fb9e0145b15610a49576040517fb85ed7e400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89166004820152602481018890527317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063b85ed7e490604401602060405180830381865afa9250505080156108be575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526108bb91810190613638565b60015b15610a49576040517f860110f500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16600482015260248101899052604481018890527317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063860110f590606401602060405180830381865afa925050508015610989575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261098691810190613655565b60015b15610a47576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292995090506020808301908036833701905050955081876000815181106109e2576109e261366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508086600081518110610a3057610a3061366e565b6020908102919091010152506006935061287a9050565b505b6040517f2a55205a000000000000000000000000000000000000000000000000000000008152600481018890526024810187905273ffffffffffffffffffffffffffffffffffffffff831690632a55205a906044016040805180830381865afa925050508015610af4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610af19181019061369d565b60015b15610e9b57878110610b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b813b63ffffffff811615610de1578273ffffffffffffffffffffffffffffffffffffffff1663d78d610b6040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015610bfa57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610bf791908101906136cb565b60015b15610de157805167ffffffffffffffff811115610c1957610c196133f3565b604051908082528060200260200182016040528015610c42578160200160208202803683370190505b509850805167ffffffffffffffff811115610c5f57610c5f6133f3565b604051908082528060200260200182016040528015610c88578160200160208202803683370190505b508151909850600090815b81811015610d66576000848281518110610caf57610caf61366e565b6020026020010151905080600001518d8381518110610cd057610cd061366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061271088836020015161ffff16610d2391906137c0565b610d2d91906137d7565b9050808d8481518110610d4257610d4261366e565b6020908102919091010152610d578186613812565b94508260010192505050610c93565b5084821115610dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642073706c6974000000000000000000000000000000000000006044820152606401610405565b50600a975061287a945050505050565b60408051600180825281830190925290602080830190803683375050604080516001808252818301909252929a509050602080830190803683370190505096508288600081518110610e3557610e3561366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508187600081518110610e8357610e8361366e565b6020908102919091010152506005945061287a915050565b6040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063bb3bafd690602401600060405180830381865afa925050508015610f4557506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f429190810190613825565b60015b15610f72578051825114610f5857600080fd5b81610f638983612d22565b6001965096509650505061287a565b6040517fcad96cca0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063cad96cca90602401600060405180830381865afa92505050801561101c57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110199190810190613889565b60015b1561123557805167ffffffffffffffff81111561103b5761103b6133f3565b604051908082528060200260200182016040528015611064578160200160208202803683370190505b509550805167ffffffffffffffff811115611081576110816133f3565b6040519080825280602002602001820160405280156110aa578160200160208202803683370190505b5094506000805b82518110156111bf578281815181106110cc576110cc61366e565b6020026020010151600001518882815181106110ea576110ea61366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506127108382815181106111395761113961366e565b6020026020010151602001516bffffffffffffffffffffffff168a61115e91906137c0565b61116891906137d7565b87828151811061117a5761117a61366e565b6020026020010181815250508681815181106111985761119861366e565b6020026020010151826111ab9190613812565b9150806111b781613959565b9150506110b1565b50878110611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b506003935061287a9050565b6040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063b9c4d9fb90602401600060405180830381865afa9250505080156112df57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112dc9190810190613991565b60015b15611471576040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff84169063b9c4d9fb90602401600060405180830381865afa15801561134f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113959190810190613991565b6040517f0ebd4c7f000000000000000000000000000000000000000000000000000000008152600481018a905290915073ffffffffffffffffffffffffffffffffffffffff841690630ebd4c7f90602401600060405180830381865afa92505050801561144257506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261143f91908101906139ce565b60015b1561146f57805182511461145557600080fd5b816114608983612d22565b6002965096509650505061287a565b505b6040517fd5a06d4c0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063d5a06d4c90602401600060405180830381865afa92505050801561151b57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115189190810190613825565b60015b1561154857805182511461152e57600080fd5b816115398983612d22565b6004965096509650505061287a565b6040517ff662207400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820189905283169063f662207490604401600060405180830381865afa9250505080156115fa57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115f79190810190613825565b60015b1561162757805182511461160d57600080fd5b816116188983612d22565b6007965096509650505061287a565b6040517f9ca7dc7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201899052831690639ca7dc7a90604401600060405180830381865afa9250505080156116d957506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526116d69190810190613825565b60015b156117065780518251146116ec57600080fd5b816116f78983612d22565b6008965096509650505061287a565b6040517ffbda03ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526044820188905283169063fbda03ab90606401600060405180830381865afa9250505080156117bf57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526117bc9190810190613825565b60015b156117e05780518251146117d257600080fd5b90955093506009925061287a565b6040517f20eda6d500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f000000000000000000000000000000000000000000000000000000000000000016906320eda6d590602401600060405180830381865afa9250505080156118ab57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526118a891908101906136cb565b60015b156118d957805180156118d6576118c582828a8787612e71565b96509650965096509650505061287a565b50505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925061287a565b506000600183810b011561287a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8001600184900b01611a31576040517f20eda6d500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906320eda6d590602401600060405180830381865afa1580156119cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a1191908101906136cb565b9050611a21818251898686612e71565b955095509550955095505061287a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184900b01611b3a576040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063bb3bafd6906024015b600060405180830381865afa158015611acb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b119190810190613825565b8051825192985090925014611b2557600080fd5b85611b308883612d22565b955095505061287a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd600184900b01611e2a576040517fcad96cca0000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063cad96cca90602401600060405180830381865afa158015611bd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611c199190810190613889565b9050805167ffffffffffffffff811115611c3557611c356133f3565b604051908082528060200260200182016040528015611c5e578160200160208202803683370190505b509550805167ffffffffffffffff811115611c7b57611c7b6133f3565b604051908082528060200260200182016040528015611ca4578160200160208202803683370190505b5094506000805b8251811015611db957828181518110611cc657611cc661366e565b602002602001015160000151888281518110611ce457611ce461366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612710838281518110611d3357611d3361366e565b6020026020010151602001516bffffffffffffffffffffffff168a611d5891906137c0565b611d6291906137d7565b878281518110611d7457611d7461366e565b602002602001018181525050868181518110611d9257611d9261366e565b602002602001015182611da59190613812565b915080611db181613959565b915050611cab565b50878110611e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b505061287a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600184900b01611fcd576040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063b9c4d9fb90602401600060405180830381865afa158015611ec3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f099190810190613991565b6040517f0ebd4c7f000000000000000000000000000000000000000000000000000000008152600481018a905290965073ffffffffffffffffffffffffffffffffffffffff841690630ebd4c7f90602401600060405180830381865afa158015611f77573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611fbd91908101906139ce565b90508051865114611b2557600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc600184900b0161204e576040517fd5a06d4c0000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063d5a06d4c90602401611aae565b600183900b600514806120655750600183900b600a145b156124d1576040517f2a55205a0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052600090819073ffffffffffffffffffffffffffffffffffffffff851690632a55205a906044016040805180830381865afa1580156120e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612104919061369d565b91509150878110612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6600186900b0161240d5760008273ffffffffffffffffffffffffffffffffffffffff1663d78d610b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156121e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261222f91908101906136cb565b9050805167ffffffffffffffff81111561224b5761224b6133f3565b604051908082528060200260200182016040528015612274578160200160208202803683370190505b509750805167ffffffffffffffff811115612291576122916133f3565b6040519080825280602002602001820160405280156122ba578160200160208202803683370190505b508151909750600090815b818110156123985760008482815181106122e1576122e161366e565b6020026020010151905080600001518c83815181106123025761230261366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061271087836020015161ffff1661235591906137c0565b61235f91906137d7565b9050808c84815181106123745761237461366e565b60209081029190910101526123898186613812565b945082600101925050506122c5565b508a821115612403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642073706c6974000000000000000000000000000000000000006044820152606401610405565b505050505061287a565b60015b604051908082528060200260200182016040528015612439578160200160208202803683370190505b506040805160018082528183019092529198506020808301908036833701905050955081876000815181106124705761247061366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080866000815181106124be576124be61366e565b602002602001018181525050505061287a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600184900b01612667576040517fb85ed7e400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89166004820152602481018890526000907317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063b85ed7e490604401602060405180830381865afa158015612584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a89190613638565b6040517f860110f500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018a9052604481018990529091506000907317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063860110f590606401602060405180830381865afa15801561263a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265e9190613655565b90506001612410565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9600184900b016126f1576040517ff662207400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526060919084169063f662207490604401611aae565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600184900b0161277b576040517f9ca7dc7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820189905260609190841690639ca7dc7a90604401611aae565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7600184900b0161287a576040517ffbda03ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526044820188905283169063fbda03ab90606401600060405180830381865afa158015612820573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128669190810190613825565b805182519297509095501461287a57600080fd5b939792965093509350565b61288d613043565b6128976000612c88565b565b6066546040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600092839291169063de5488af90602401602060405180830381865afa15801561290d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129319190613638565b73ffffffffffffffffffffffffffffffffffffffff1660009081526065602052604090205460010b9392505050565b6066546040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600092169063de5488af90602401602060405180830381865afa1580156129d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f59190613638565b73ffffffffffffffffffffffffffffffffffffffff16600090815260656020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690555050565b612a4b613043565b73ffffffffffffffffffffffffffffffffffffffff8116612aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610405565b612af781612c88565b50565b6040517f71100f5200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810183905260448101829052606090819030906371100f5290620186a0906064016000604051808303818786fa93505050508015612bbc57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612bb9919081019061358d565b60015b612c22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b801561040e575073ffffffffffffffffffffffffffffffffffffffff16600090815260656020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff92909216919091179055909250905061041d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612d0a836130c4565b8015612d1b5750612d1b8383613128565b9392505050565b6060815167ffffffffffffffff811115612d3e57612d3e6133f3565b604051908082528060200260200182016040528015612d67578160200160208202803683370190505b5090506000805b8351811015612e0057612710848281518110612d8c57612d8c61366e565b602002602001015186612d9f91906137c0565b612da991906137d7565b838281518110612dbb57612dbb61366e565b602002602001018181525050828181518110612dd957612dd961366e565b602002602001015182612dec9190613812565b915080612df881613959565b915050612d6e565b50838110612e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b5092915050565b60608060008060008867ffffffffffffffff811115612e9257612e926133f3565b604051908082528060200260200182016040528015612ebb578160200160208202803683370190505b5094508867ffffffffffffffff811115612ed757612ed76133f3565b604051908082528060200260200182016040528015612f00578160200160208202803683370190505b5093506000805b8a811015612fc35760008c8281518110612f2357612f2361366e565b602002602001015190508060000151888381518110612f4457612f4461366e565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015281015160009061271090612f809061ffff168e6137c0565b612f8a91906137d7565b905080888481518110612f9f57612f9f61366e565b6020908102919091010152612fb48185613812565b93508260010192505050612f07565b5088811061302d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b509399929850617fff9750949550929350915050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610405565b60006130f0827f01ffc9a700000000000000000000000000000000000000000000000000000000613128565b80156102db5750613121827fffffffff00000000000000000000000000000000000000000000000000000000613128565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156131e0575060208210155b80156131ec5750600081115b979650505050505050565b60006020828403121561320957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612d1b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612af757600080fd5b60008060006060848603121561327057600080fd5b833561327b81613239565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b838110156132d657815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016132a4565b509495945050505050565b600081518084526020808501945080840160005b838110156132d6578151875295820195908201906001016132f5565b6040815260006133246040830185613290565b828103602084015261333681856132e1565b95945050505050565b6000806040838503121561335257600080fd5b823561335d81613239565b9150602083013561336d81613239565b809150509250929050565b60a08152600061338b60a0830188613290565b828103602084015261339d81886132e1565b60019690960b6040840152505073ffffffffffffffffffffffffffffffffffffffff929092166060830152151560809091015292915050565b6000602082840312156133e857600080fd5b8135612d1b81613239565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613445576134456133f3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613492576134926133f3565b604052919050565b600067ffffffffffffffff8211156134b4576134b46133f3565b5060051b60200190565b600082601f8301126134cf57600080fd5b815160206134e46134df8361349a565b61344b565b82815260059290921b8401810191818101908684111561350357600080fd5b8286015b8481101561352757805161351a81613239565b8352918301918301613507565b509695505050505050565b600082601f83011261354357600080fd5b815160206135536134df8361349a565b82815260059290921b8401810191818101908684111561357257600080fd5b8286015b848110156135275780518352918301918301613576565b600080600080600060a086880312156135a557600080fd5b855167ffffffffffffffff808211156135bd57600080fd5b6135c989838a016134be565b965060208801519150808211156135df57600080fd5b506135ec88828901613532565b94505060408601518060010b811461360357600080fd5b606087015190935061361481613239565b6080870151909250801515811461362a57600080fd5b809150509295509295909350565b60006020828403121561364a57600080fd5b8151612d1b81613239565b60006020828403121561366757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080604083850312156136b057600080fd5b82516136bb81613239565b6020939093015192949293505050565b600060208083850312156136de57600080fd5b825167ffffffffffffffff8111156136f557600080fd5b8301601f8101851361370657600080fd5b80516137146134df8261349a565b81815260069190911b8201830190838101908783111561373357600080fd5b928401925b828410156131ec57604084890312156137515760008081fd5b613759613422565b845161376481613239565b81528486015161ffff8116811461377b5760008081fd5b8187015282526040939093019290840190613738565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102db576102db613791565b60008261380d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156102db576102db613791565b6000806040838503121561383857600080fd5b825167ffffffffffffffff8082111561385057600080fd5b61385c868387016134be565b9350602085015191508082111561387257600080fd5b5061387f85828601613532565b9150509250929050565b6000602080838503121561389c57600080fd5b825167ffffffffffffffff8111156138b357600080fd5b8301601f810185136138c457600080fd5b80516138d26134df8261349a565b81815260069190911b820183019083810190878311156138f157600080fd5b928401925b828410156131ec576040848903121561390f5760008081fd5b613917613422565b845161392281613239565b8152848601516bffffffffffffffffffffffff811681146139435760008081fd5b81870152825260409390930192908401906138f6565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361398a5761398a613791565b5060010190565b6000602082840312156139a357600080fd5b815167ffffffffffffffff8111156139ba57600080fd5b6139c6848285016134be565b949350505050565b6000602082840312156139e057600080fd5b815167ffffffffffffffff8111156139f757600080fd5b6139c68482850161353256fea164736f6c6343000811000a000000000000000000000000b78fc2052717c7ae061a14db1fb2038d5ac34d29
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80637dec6f2e11610081578063f2fde38b1161005b578063f2fde38b146101fb578063f356dc2e1461020e578063f533b8021461023557600080fd5b80637dec6f2e146101895780638da5cb5b1461019c578063a11b0712146101db57600080fd5b806371100f52116100b257806371100f5214610137578063715018a61461015b5780637488f1211461016357600080fd5b806301ffc9a7146100d95780633e10401414610101578063485cc95514610122575b600080fd5b6100ec6100e73660046131f7565b610248565b60405190151581526020015b60405180910390f35b61011461010f36600461325b565b6102e1565b6040516100f8929190613311565b61013561013036600461333f565b610425565b005b61014a61014536600461325b565b61062d565b6040516100f8959493929190613378565b610135612885565b6101766101713660046133d6565b612899565b60405160019190910b81526020016100f8565b6101356101973660046133d6565b612960565b60335473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f8565b6066546101b69073ffffffffffffffffffffffffffffffffffffffff1681565b6101356102093660046133d6565b612a43565b6101b67f000000000000000000000000b78fc2052717c7ae061a14db1fb2038d5ac34d2981565b61011461024336600461325b565b612afa565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fcb23f8160000000000000000000000000000000000000000000000000000000014806102db57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6040517f71100f5200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810183905260448101829052606090819030906371100f5290620186a0906064016000604051808303818786fa935050505080156103a357506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103a0919081019061358d565b60015b61040e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e740000000000000000000060448201526064015b60405180910390fd5b5092945090925061041d915050565b935093915050565b600054610100900460ff16158080156104455750600054600160ff909116105b8061045f5750303b15801561045f575060005460ff166001145b6104eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610405565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561054957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61055283612c88565b61057c827f880963ac00000000000000000000000000000000000000000000000000000000612cff565b61058557600080fd5b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561062857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6060806000808033301461069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f6e6c7920456e67696e650000000000000000000000000000000000000000006044820152606401610405565b6066546040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301529091169063de5488af90602401602060405180830381865afa15801561070d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107319190613638565b73ffffffffffffffffffffffffffffffffffffffff811660009081526065602052604081205460010b9450909250831380159061079157507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184900b135b156119015750600173ffffffffffffffffffffffffffffffffffffffff88167341a322b28d0ff354040e2cbc676f0320d8c8850d14806107fa575073ffffffffffffffffffffffffffffffffffffffff881673b932a70a57673d89f4acffbe830e8ed7f75fb9e0145b15610a49576040517fb85ed7e400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89166004820152602481018890527317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063b85ed7e490604401602060405180830381865afa9250505080156108be575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526108bb91810190613638565b60015b15610a49576040517f860110f500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16600482015260248101899052604481018890527317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063860110f590606401602060405180830381865afa925050508015610989575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261098691810190613655565b60015b15610a47576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292995090506020808301908036833701905050955081876000815181106109e2576109e261366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508086600081518110610a3057610a3061366e565b6020908102919091010152506006935061287a9050565b505b6040517f2a55205a000000000000000000000000000000000000000000000000000000008152600481018890526024810187905273ffffffffffffffffffffffffffffffffffffffff831690632a55205a906044016040805180830381865afa925050508015610af4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610af19181019061369d565b60015b15610e9b57878110610b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b813b63ffffffff811615610de1578273ffffffffffffffffffffffffffffffffffffffff1663d78d610b6040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015610bfa57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610bf791908101906136cb565b60015b15610de157805167ffffffffffffffff811115610c1957610c196133f3565b604051908082528060200260200182016040528015610c42578160200160208202803683370190505b509850805167ffffffffffffffff811115610c5f57610c5f6133f3565b604051908082528060200260200182016040528015610c88578160200160208202803683370190505b508151909850600090815b81811015610d66576000848281518110610caf57610caf61366e565b6020026020010151905080600001518d8381518110610cd057610cd061366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061271088836020015161ffff16610d2391906137c0565b610d2d91906137d7565b9050808d8481518110610d4257610d4261366e565b6020908102919091010152610d578186613812565b94508260010192505050610c93565b5084821115610dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642073706c6974000000000000000000000000000000000000006044820152606401610405565b50600a975061287a945050505050565b60408051600180825281830190925290602080830190803683375050604080516001808252818301909252929a509050602080830190803683370190505096508288600081518110610e3557610e3561366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508187600081518110610e8357610e8361366e565b6020908102919091010152506005945061287a915050565b6040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063bb3bafd690602401600060405180830381865afa925050508015610f4557506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f429190810190613825565b60015b15610f72578051825114610f5857600080fd5b81610f638983612d22565b6001965096509650505061287a565b6040517fcad96cca0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063cad96cca90602401600060405180830381865afa92505050801561101c57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110199190810190613889565b60015b1561123557805167ffffffffffffffff81111561103b5761103b6133f3565b604051908082528060200260200182016040528015611064578160200160208202803683370190505b509550805167ffffffffffffffff811115611081576110816133f3565b6040519080825280602002602001820160405280156110aa578160200160208202803683370190505b5094506000805b82518110156111bf578281815181106110cc576110cc61366e565b6020026020010151600001518882815181106110ea576110ea61366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506127108382815181106111395761113961366e565b6020026020010151602001516bffffffffffffffffffffffff168a61115e91906137c0565b61116891906137d7565b87828151811061117a5761117a61366e565b6020026020010181815250508681815181106111985761119861366e565b6020026020010151826111ab9190613812565b9150806111b781613959565b9150506110b1565b50878110611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b506003935061287a9050565b6040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063b9c4d9fb90602401600060405180830381865afa9250505080156112df57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112dc9190810190613991565b60015b15611471576040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff84169063b9c4d9fb90602401600060405180830381865afa15801561134f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113959190810190613991565b6040517f0ebd4c7f000000000000000000000000000000000000000000000000000000008152600481018a905290915073ffffffffffffffffffffffffffffffffffffffff841690630ebd4c7f90602401600060405180830381865afa92505050801561144257506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261143f91908101906139ce565b60015b1561146f57805182511461145557600080fd5b816114608983612d22565b6002965096509650505061287a565b505b6040517fd5a06d4c0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff83169063d5a06d4c90602401600060405180830381865afa92505050801561151b57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115189190810190613825565b60015b1561154857805182511461152e57600080fd5b816115398983612d22565b6004965096509650505061287a565b6040517ff662207400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820189905283169063f662207490604401600060405180830381865afa9250505080156115fa57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115f79190810190613825565b60015b1561162757805182511461160d57600080fd5b816116188983612d22565b6007965096509650505061287a565b6040517f9ca7dc7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201899052831690639ca7dc7a90604401600060405180830381865afa9250505080156116d957506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526116d69190810190613825565b60015b156117065780518251146116ec57600080fd5b816116f78983612d22565b6008965096509650505061287a565b6040517ffbda03ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526044820188905283169063fbda03ab90606401600060405180830381865afa9250505080156117bf57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526117bc9190810190613825565b60015b156117e05780518251146117d257600080fd5b90955093506009925061287a565b6040517f20eda6d500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f000000000000000000000000b78fc2052717c7ae061a14db1fb2038d5ac34d2916906320eda6d590602401600060405180830381865afa9250505080156118ab57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526118a891908101906136cb565b60015b156118d957805180156118d6576118c582828a8787612e71565b96509650965096509650505061287a565b50505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925061287a565b506000600183810b011561287a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8001600184900b01611a31576040517f20eda6d500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526000917f000000000000000000000000b78fc2052717c7ae061a14db1fb2038d5ac34d29909116906320eda6d590602401600060405180830381865afa1580156119cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a1191908101906136cb565b9050611a21818251898686612e71565b955095509550955095505061287a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184900b01611b3a576040517fbb3bafd60000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063bb3bafd6906024015b600060405180830381865afa158015611acb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611b119190810190613825565b8051825192985090925014611b2557600080fd5b85611b308883612d22565b955095505061287a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd600184900b01611e2a576040517fcad96cca0000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063cad96cca90602401600060405180830381865afa158015611bd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611c199190810190613889565b9050805167ffffffffffffffff811115611c3557611c356133f3565b604051908082528060200260200182016040528015611c5e578160200160208202803683370190505b509550805167ffffffffffffffff811115611c7b57611c7b6133f3565b604051908082528060200260200182016040528015611ca4578160200160208202803683370190505b5094506000805b8251811015611db957828181518110611cc657611cc661366e565b602002602001015160000151888281518110611ce457611ce461366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612710838281518110611d3357611d3361366e565b6020026020010151602001516bffffffffffffffffffffffff168a611d5891906137c0565b611d6291906137d7565b878281518110611d7457611d7461366e565b602002602001018181525050868181518110611d9257611d9261366e565b602002602001015182611da59190613812565b915080611db181613959565b915050611cab565b50878110611e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b505061287a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe600184900b01611fcd576040517fb9c4d9fb0000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063b9c4d9fb90602401600060405180830381865afa158015611ec3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f099190810190613991565b6040517f0ebd4c7f000000000000000000000000000000000000000000000000000000008152600481018a905290965073ffffffffffffffffffffffffffffffffffffffff841690630ebd4c7f90602401600060405180830381865afa158015611f77573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611fbd91908101906139ce565b90508051865114611b2557600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc600184900b0161204e576040517fd5a06d4c0000000000000000000000000000000000000000000000000000000081526004810188905260609073ffffffffffffffffffffffffffffffffffffffff84169063d5a06d4c90602401611aae565b600183900b600514806120655750600183900b600a145b156124d1576040517f2a55205a0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052600090819073ffffffffffffffffffffffffffffffffffffffff851690632a55205a906044016040805180830381865afa1580156120e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612104919061369d565b91509150878110612171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6600186900b0161240d5760008273ffffffffffffffffffffffffffffffffffffffff1663d78d610b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156121e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261222f91908101906136cb565b9050805167ffffffffffffffff81111561224b5761224b6133f3565b604051908082528060200260200182016040528015612274578160200160208202803683370190505b509750805167ffffffffffffffff811115612291576122916133f3565b6040519080825280602002602001820160405280156122ba578160200160208202803683370190505b508151909750600090815b818110156123985760008482815181106122e1576122e161366e565b6020026020010151905080600001518c83815181106123025761230261366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061271087836020015161ffff1661235591906137c0565b61235f91906137d7565b9050808c84815181106123745761237461366e565b60209081029190910101526123898186613812565b945082600101925050506122c5565b508a821115612403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642073706c6974000000000000000000000000000000000000006044820152606401610405565b505050505061287a565b60015b604051908082528060200260200182016040528015612439578160200160208202803683370190505b506040805160018082528183019092529198506020808301908036833701905050955081876000815181106124705761247061366e565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080866000815181106124be576124be61366e565b602002602001018181525050505061287a565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa600184900b01612667576040517fb85ed7e400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89166004820152602481018890526000907317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063b85ed7e490604401602060405180830381865afa158015612584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a89190613638565b6040517f860110f500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018a9052604481018990529091506000907317b0c8564e53f22364a6c8de6f7ca5ce9bea4e5d9063860110f590606401602060405180830381865afa15801561263a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265e9190613655565b90506001612410565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9600184900b016126f1576040517ff662207400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526060919084169063f662207490604401611aae565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8600184900b0161277b576040517f9ca7dc7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820189905260609190841690639ca7dc7a90604401611aae565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7600184900b0161287a576040517ffbda03ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526044820188905283169063fbda03ab90606401600060405180830381865afa158015612820573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128669190810190613825565b805182519297509095501461287a57600080fd5b939792965093509350565b61288d613043565b6128976000612c88565b565b6066546040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600092839291169063de5488af90602401602060405180830381865afa15801561290d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129319190613638565b73ffffffffffffffffffffffffffffffffffffffff1660009081526065602052604090205460010b9392505050565b6066546040517fde5488af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152600092169063de5488af90602401602060405180830381865afa1580156129d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f59190613638565b73ffffffffffffffffffffffffffffffffffffffff16600090815260656020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690555050565b612a4b613043565b73ffffffffffffffffffffffffffffffffffffffff8116612aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610405565b612af781612c88565b50565b6040517f71100f5200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810183905260448101829052606090819030906371100f5290620186a0906064016000604051808303818786fa93505050508015612bbc57506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612bb9919081019061358d565b60015b612c22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b801561040e575073ffffffffffffffffffffffffffffffffffffffff16600090815260656020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff92909216919091179055909250905061041d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612d0a836130c4565b8015612d1b5750612d1b8383613128565b9392505050565b6060815167ffffffffffffffff811115612d3e57612d3e6133f3565b604051908082528060200260200182016040528015612d67578160200160208202803683370190505b5090506000805b8351811015612e0057612710848281518110612d8c57612d8c61366e565b602002602001015186612d9f91906137c0565b612da991906137d7565b838281518110612dbb57612dbb61366e565b602002602001018181525050828181518110612dd957612dd961366e565b602002602001015182612dec9190613812565b915080612df881613959565b915050612d6e565b50838110612e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b5092915050565b60608060008060008867ffffffffffffffff811115612e9257612e926133f3565b604051908082528060200260200182016040528015612ebb578160200160208202803683370190505b5094508867ffffffffffffffff811115612ed757612ed76133f3565b604051908082528060200260200182016040528015612f00578160200160208202803683370190505b5093506000805b8a811015612fc35760008c8281518110612f2357612f2361366e565b602002602001015190508060000151888381518110612f4457612f4461366e565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015281015160009061271090612f809061ffff168e6137c0565b612f8a91906137d7565b905080888481518110612f9f57612f9f61366e565b6020908102919091010152612fb48185613812565b93508260010192505050612f07565b5088811061302d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420726f79616c747920616d6f756e74000000000000000000006044820152606401610405565b509399929850617fff9750949550929350915050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610405565b60006130f0827f01ffc9a700000000000000000000000000000000000000000000000000000000613128565b80156102db5750613121827fffffffff00000000000000000000000000000000000000000000000000000000613128565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156131e0575060208210155b80156131ec5750600081115b979650505050505050565b60006020828403121561320957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612d1b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612af757600080fd5b60008060006060848603121561327057600080fd5b833561327b81613239565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b838110156132d657815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016132a4565b509495945050505050565b600081518084526020808501945080840160005b838110156132d6578151875295820195908201906001016132f5565b6040815260006133246040830185613290565b828103602084015261333681856132e1565b95945050505050565b6000806040838503121561335257600080fd5b823561335d81613239565b9150602083013561336d81613239565b809150509250929050565b60a08152600061338b60a0830188613290565b828103602084015261339d81886132e1565b60019690960b6040840152505073ffffffffffffffffffffffffffffffffffffffff929092166060830152151560809091015292915050565b6000602082840312156133e857600080fd5b8135612d1b81613239565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613445576134456133f3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613492576134926133f3565b604052919050565b600067ffffffffffffffff8211156134b4576134b46133f3565b5060051b60200190565b600082601f8301126134cf57600080fd5b815160206134e46134df8361349a565b61344b565b82815260059290921b8401810191818101908684111561350357600080fd5b8286015b8481101561352757805161351a81613239565b8352918301918301613507565b509695505050505050565b600082601f83011261354357600080fd5b815160206135536134df8361349a565b82815260059290921b8401810191818101908684111561357257600080fd5b8286015b848110156135275780518352918301918301613576565b600080600080600060a086880312156135a557600080fd5b855167ffffffffffffffff808211156135bd57600080fd5b6135c989838a016134be565b965060208801519150808211156135df57600080fd5b506135ec88828901613532565b94505060408601518060010b811461360357600080fd5b606087015190935061361481613239565b6080870151909250801515811461362a57600080fd5b809150509295509295909350565b60006020828403121561364a57600080fd5b8151612d1b81613239565b60006020828403121561366757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080604083850312156136b057600080fd5b82516136bb81613239565b6020939093015192949293505050565b600060208083850312156136de57600080fd5b825167ffffffffffffffff8111156136f557600080fd5b8301601f8101851361370657600080fd5b80516137146134df8261349a565b81815260069190911b8201830190838101908783111561373357600080fd5b928401925b828410156131ec57604084890312156137515760008081fd5b613759613422565b845161376481613239565b81528486015161ffff8116811461377b5760008081fd5b8187015282526040939093019290840190613738565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176102db576102db613791565b60008261380d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156102db576102db613791565b6000806040838503121561383857600080fd5b825167ffffffffffffffff8082111561385057600080fd5b61385c868387016134be565b9350602085015191508082111561387257600080fd5b5061387f85828601613532565b9150509250929050565b6000602080838503121561389c57600080fd5b825167ffffffffffffffff8111156138b357600080fd5b8301601f810185136138c457600080fd5b80516138d26134df8261349a565b81815260069190911b820183019083810190878311156138f157600080fd5b928401925b828410156131ec576040848903121561390f5760008081fd5b613917613422565b845161392281613239565b8152848601516bffffffffffffffffffffffff811681146139435760008081fd5b81870152825260409390930192908401906138f6565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361398a5761398a613791565b5060010190565b6000602082840312156139a357600080fd5b815167ffffffffffffffff8111156139ba57600080fd5b6139c6848285016134be565b949350505050565b6000602082840312156139e057600080fd5b815167ffffffffffffffff8111156139f757600080fd5b6139c68482850161353256fea164736f6c6343000811000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b78fc2052717c7ae061a14db1fb2038d5ac34d29
-----Decoded View---------------
Arg [0] : fallbackRegistry (address): 0xB78fC2052717C7AE061a14dB1fB2038d5AC34D29
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b78fc2052717c7ae061a14db1fb2038d5ac34d29
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.