GLMR Price: $0.017616 (-4.82%)

Contract

0x3C3bDD73Ed9eCDed9528D63b1198b3Ae877445b7

Overview

GLMR Balance

Moonbeam Chain LogoMoonbeam Chain LogoMoonbeam Chain Logo0 GLMR

GLMR Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Add Factory35556332023-05-13 21:08:36994 days ago1684012116IN
0x3C3bDD73...e877445b7
0 GLMR0.01124976153.14342223
Add Factory35556302023-05-13 21:08:00994 days ago1684012080IN
0x3C3bDD73...e877445b7
0 GLMR0.01328316180.82413959
Add Factory35556272023-05-13 21:07:24994 days ago1684012044IN
0x3C3bDD73...e877445b7
0 GLMR0.01108089150.86930653
Add Factory35556232023-05-13 21:06:35994 days ago1684011995IN
0x3C3bDD73...e877445b7
0 GLMR0.01388577153.33396747
Manage Contribut...35556202023-05-13 21:06:00994 days ago1684011960IN
0x3C3bDD73...e877445b7
0 GLMR0.00728564150.84147553
Manage Contribut...35556202023-05-13 21:06:00994 days ago1684011960IN
0x3C3bDD73...e877445b7
0 GLMR0.00728564150.84147553
Manage Contribut...35556202023-05-13 21:06:00994 days ago1684011960IN
0x3C3bDD73...e877445b7
0 GLMR0.00731295151.40695244
Set Meta Factory35556182023-05-13 21:05:36994 days ago1684011936IN
0x3C3bDD73...e877445b7
0 GLMR0.0069776150.53504354

Parent Transaction Hash Block From To
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RMRKRegistry

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@rmrk-team/evm-contracts/contracts/RMRK/access/Ownable.sol";
import "@rmrk-team/evm-contracts/contracts/RMRK/core/IRMRKCore.sol";
import "@rmrk-team/evm-contracts/contracts/RMRK/utils/RMRKCollectionMetadata.sol";
import "../interfaces/IOwnable.sol";
import "../interfaces/IRMRKRegistry.sol";

contract RMRKRegistry is Ownable, IRMRKRegistry {
    uint256 public collectionVerificationFee;
    uint256 public totalCollectionsCounter;

    mapping(address => bool) public factories;
    address[] public factoryList;
    IERC20 public rmrkToken;

    address private metaFactoryAddress;

    Collection[] private _collections;
    mapping(address => uint256) private _collectionByAddressIndex;
    uint256 private _collectionsDepositBalance;
    uint256 private _blacklistedCollectionsDepositBalance;
    CollectionConfig private _defaultCollectionConfig;

    constructor(address rmrkToken_, uint256 collectionVerificationFee_) {
        totalCollectionsCounter = 1;
        rmrkToken = IERC20(rmrkToken_);
        collectionVerificationFee = collectionVerificationFee_;
        _defaultCollectionConfig = CollectionConfig(
            true,
            true,
            false,
            true,
            true,
            true,
            true,
            0x0,
            0,
            0
        );
    }

    function addCollectionFromFactories(
        address collection,
        address deployer,
        uint256 maxSupply,
        LegoCombination legoCombination,
        MintingType mintingType,
        bool isSoulbound
    ) external {
        addCollection(
            collection,
            deployer,
            maxSupply,
            legoCombination,
            mintingType,
            isSoulbound,
            _defaultCollectionConfig,
            ""
        );
    }

    function addCollection(
        address collection,
        address deployer,
        uint256 maxSupply,
        LegoCombination legoCombination,
        MintingType mintingType,
        bool isSoulbound,
        CollectionConfig memory config,
        string memory collectionMetadata
    ) public {
        if (
            _msgSender() != owner() &&
            !isContributor(_msgSender()) &&
            !factories[_msgSender()]
        ) revert OnlyOwnerAdminOrFactoryCanAddCollection();

        if (collection == address(0)) revert CollectionAddressCannotBeZero();

        if (_collectionByAddressIndex[collection] != 0) {
            revert CollectionAlreadyExists();
        }

        Collection memory newCollection = Collection({
            collection: collection,
            verificationSponsor: 0x0000000000000000000000000000000000000000,
            verificationFeeBalance: 0,
            legoCombination: legoCombination,
            mintingType: mintingType,
            isSoulbound: isSoulbound,
            config: config,
            visible: true,
            verified: false
        });

        string memory name = IRMRKCore(collection).name();
        string memory symbol = IRMRKCore(collection).symbol();
        string memory finalCollectionMetadata;

        if (bytes(collectionMetadata).length > 0) {
            finalCollectionMetadata = collectionMetadata;
        } else {
            try
                RMRKCollectionMetadata(collection).collectionMetadata()
            returns (string memory meta) {
                finalCollectionMetadata = meta;
            } catch {
                revert CollectionMetadataNotAvailable();
            }
        }

        _collections.push(newCollection);
        _collectionByAddressIndex[collection] = totalCollectionsCounter;
        totalCollectionsCounter++;
        emit CollectionAdded(
            collection,
            deployer,
            name,
            symbol,
            maxSupply,
            finalCollectionMetadata,
            legoCombination,
            mintingType,
            isSoulbound,
            config
        );
    }

    function sponsorVerification(address collectionAddress) public {
        if (
            rmrkToken.allowance(_msgSender(), address(this)) <
            collectionVerificationFee
        ) revert NotEnoughAllowance();

        if (rmrkToken.balanceOf(_msgSender()) < collectionVerificationFee)
            revert NotEnoughBalance();

        uint256 index = _collectionByAddressIndex[collectionAddress];
        if (index == 0) {
            revert CollectionDoesNotExist(collectionAddress);
        }

        _collectionsDepositBalance += collectionVerificationFee;
        Collection storage collection = _collections[index - 1];

        if (collection.verificationSponsor != address(0)) {
            revert CollectionAlreadySponsored();
        }
        collection.verificationFeeBalance += collectionVerificationFee;
        collection.verificationSponsor = _msgSender();

        rmrkToken.transferFrom(
            _msgSender(),
            address(this),
            collectionVerificationFee
        );
    }

    function verifyCollection(
        address collectionAddress
    ) external onlyOwnerOrContributor {
        uint256 index = _collectionByAddressIndex[collectionAddress];
        if (index == 0) {
            revert CollectionDoesNotExist(collectionAddress);
        }

        Collection storage collection = _collections[index - 1];
        if (collection.verificationFeeBalance == 0)
            revert CollectionNotSponsored();
        collection.verified = true;
    }

    function declineVerification(
        address collectionAddress
    ) external onlyOwnerOrContributor {
        Collection storage collection = _collections[
            _collectionByAddressIndex[collectionAddress] - 1
        ];
        _blacklistedCollectionsDepositBalance += collection
            .verificationFeeBalance;
        _collectionsDepositBalance -= collection.verificationFeeBalance;
        collection.verificationFeeBalance = 0;
        collection
            .verificationSponsor = 0x0000000000000000000000000000000000000000;
    }

    function getCollectionByIndex(
        uint256 index
    ) public view returns (Collection memory) {
        return _collections[index];
    }

    function getCollectionAddressByIndex(
        uint256 index
    ) public view returns (address) {
        return _collections[index].collection;
    }

    function getCollectionByAddress(
        address collectionAddress
    ) public view returns (Collection memory) {
        uint256 index = _collectionByAddressIndex[collectionAddress];
        if (index == 0) {
            revert CollectionDoesNotExist(collectionAddress);
        }
        return _collections[index - 1];
    }

    function isCollectionInRegistry(
        address collection
    ) external view returns (bool) {
        return _collectionByAddressIndex[collection] != 0;
    }

    function updateCollectionVerificationFee(
        uint256 collectionVerificationFee_
    ) external onlyOwnerOrContributor {
        collectionVerificationFee = collectionVerificationFee_;
    }

    function addFactory(address factory) external onlyOwnerOrContributor {
        factories[factory] = true;
        factoryList.push(factory);
    }

    function setMetaFactory(
        address metaFactory
    ) external onlyOwnerOrContributor {
        metaFactoryAddress = metaFactory;
    }

    function removeFactory(
        address factory,
        uint256 factoryIndex
    ) external onlyOwnerOrContributor {
        delete factories[factory];
        delete factoryList[factoryIndex];
    }

    function blackListCollection(
        address collectionAddress
    ) external onlyOwnerOrContributor {
        Collection storage collection = _collections[
            _collectionByAddressIndex[collectionAddress] - 1
        ];
        _blacklistedCollectionsDepositBalance += collection
            .verificationFeeBalance;
        _collectionsDepositBalance -= collection.verificationFeeBalance;
        collection.visible = false;
        collection.verified = false;
        emit CollectionBlacklisted(collectionAddress);
    }

    function removeCollection(address collectionAddress) external {
        uint256 index = _collectionByAddressIndex[collectionAddress];
        if (index == 0) {
            revert CollectionDoesNotExist(collectionAddress);
        }
        index -= 1;
        Collection memory collection = _collections[index];

        if (IOwnable(collection.collection).owner() != _msgSender())
            revert OnlyCollectionOwnerCanRemoveCollection();

        if (collection.legoCombination != LegoCombination.ERC1155) {
            if (IERC721Enumerable(collectionAddress).totalSupply() > 0) {
                revert CollectionHasMintedTokens();
            }
        }
        // TODO: Check for ERC1155

        delete _collections[index];
        delete _collectionByAddressIndex[collectionAddress];

        if (collection.verificationFeeBalance > 0) {
            uint256 refundBalance = collection.verificationFeeBalance;
            _collectionsDepositBalance -= refundBalance;
            rmrkToken.transfer(collection.verificationSponsor, refundBalance);
        }

        emit CollectionRemoved(collectionAddress);
    }

    function unblackListCollection(
        address collectionAddress
    ) external onlyOwnerOrContributor {
        Collection storage collection = _collections[
            _collectionByAddressIndex[collectionAddress] - 1
        ];
        collection.visible = true;
    }

    function withdrawFees(address to) external onlyOwner {
        uint256 feeAmount = _blacklistedCollectionsDepositBalance;
        _blacklistedCollectionsDepositBalance = 0;
        rmrkToken.transfer(to, feeAmount);
    }

    function getCollectionVerificationFee() external view returns (uint256) {
        return collectionVerificationFee;
    }

    function getRmrkTokenAddress() external view returns (address) {
        return address(rmrkToken);
    }

    function getTotalCollectionCount() external view returns (uint256) {
        return _collections.length;
    }

    function getMetaFactoryAddress() external view returns (address) {
        return metaFactoryAddress;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// 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: Apache-2.0

pragma solidity ^0.8.18;

import "@openzeppelin/contracts/utils/Context.sol";
import "../library/RMRKErrors.sol";

/**
 * @title Ownable
 * @author RMRK team
 * @notice A minimal ownable smart contractf or owner and contributors.
 * @dev This smart contract is based on "openzeppelin's access/Ownable.sol".
 */
contract Ownable is Context {
    address private _owner;
    mapping(address => uint256) private _contributors;

    /**
     * @notice Used to anounce the transfer of ownership.
     * @param previousOwner Address of the account that transferred their ownership role
     * @param newOwner Address of the account receiving the ownership role
     */
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @notice Event that signifies that an address was granted contributor role or that the permission has been
     *  revoked.
     * @dev This can only be triggered by a current owner, so there is no need to include that information in the event.
     * @param contributor Address of the account that had contributor role status updated
     * @param isContributor A boolean value signifying whether the role has been granted (`true`) or revoked (`false`)
     */
    event ContributorUpdate(address indexed contributor, bool isContributor);

    /**
     * @dev Reverts if called by any account other than the owner or an approved contributor.
     */
    modifier onlyOwnerOrContributor() {
        _onlyOwnerOrContributor();
        _;
    }

    /**
     * @dev Reverts if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    /**
     * @dev Initializes the contract by setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @notice Returns the address of the current owner.
     * @return Address of the current owner
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @notice Leaves the contract without owner. Functions using the `onlyOwner` modifier will be disabled.
     * @dev Can only be called by the current owner.
     * @dev 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));
    }

    /**
     * @notice Transfers ownership of the contract to a new owner.
     * @dev Can only be called by the current owner.
     * @param newOwner Address of the new owner's account
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) revert RMRKNewOwnerIsZeroAddress();
        _transferOwnership(newOwner);
    }

    /**
     * @notice Transfers ownership of the contract to a new owner.
     * @dev Internal function without access restriction.
     * @dev Emits ***OwnershipTransferred*** event.
     * @param newOwner Address of the new owner's account
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @notice Adds or removes a contributor to the smart contract.
     * @dev Can only be called by the owner.
     * @dev Emits ***ContributorUpdate*** event.
     * @param contributor Address of the contributor's account
     * @param grantRole A boolean value signifying whether the contributor role is being granted (`true`) or revoked
     *  (`false`)
     */
    function manageContributor(
        address contributor,
        bool grantRole
    ) external onlyOwner {
        if (contributor == address(0)) revert RMRKNewContributorIsZeroAddress();
        grantRole
            ? _contributors[contributor] = 1
            : _contributors[contributor] = 0;
        emit ContributorUpdate(contributor, grantRole);
    }

    /**
     * @notice Used to check if the address is one of the contributors.
     * @param contributor Address of the contributor whose status we are checking
     * @return Boolean value indicating whether the address is a contributor or not
     */
    function isContributor(address contributor) public view returns (bool) {
        return _contributors[contributor] == 1;
    }

    /**
     * @notice Used to verify that the caller is either the owner or a contributor.
     * @dev If the caller is not the owner or a contributor, the execution will be reverted.
     */
    function _onlyOwnerOrContributor() private view {
        if (owner() != _msgSender() && !isContributor(_msgSender()))
            revert RMRKNotOwnerOrContributor();
    }

    /**
     * @notice Used to verify that the caller is the owner.
     * @dev If the caller is not the owner, the execution will be reverted.
     */
    function _onlyOwner() private view {
        if (owner() != _msgSender()) revert RMRKNotOwner();
    }
}

// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.18;

/**
 * @title IRMRKCore
 * @author RMRK team
 * @notice Interface smart contract for RMRK core module.
 */
interface IRMRKCore {
    /**
     * @notice Used to retrieve the collection name.
     * @return Name of the collection
     */
    function name() external view returns (string memory);

    /**
     * @notice Used to retrieve the collection symbol.
     * @return Symbol of the collection
     */
    function symbol() external view returns (string memory);
}

File 9 of 12 : RMRKErrors.sol
// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.18;

/// @title RMRKErrors
/// @author RMRK team
/// @notice A collection of errors used in the RMRK suite
/// @dev Errors are kept in a centralised file in order to provide a central point of reference and to avoid error
///  naming collisions due to inheritance

/// Attempting to grant the token to 0x0 address
error ERC721AddressZeroIsNotaValidOwner();
/// Attempting to grant approval to the current owner of the token
error ERC721ApprovalToCurrentOwner();
/// Attempting to grant approval when not being owner or approved for all should not be permitted
error ERC721ApproveCallerIsNotOwnerNorApprovedForAll();
/// Attempting to get approvals for a token owned by 0x0 (considered non-existent)
error ERC721ApprovedQueryForNonexistentToken();
/// Attempting to grant approval to self
error ERC721ApproveToCaller();
/// Attempting to use an invalid token ID
error ERC721InvalidTokenId();
/// Attempting to mint to 0x0 address
error ERC721MintToTheZeroAddress();
/// Attempting to manage a token without being its owner or approved by the owner
error ERC721NotApprovedOrOwner();
/// Attempting to mint an already minted token
error ERC721TokenAlreadyMinted();
/// Attempting to transfer the token from an address that is not the owner
error ERC721TransferFromIncorrectOwner();
/// Attempting to safe transfer to an address that is unable to receive the token
error ERC721TransferToNonReceiverImplementer();
/// Attempting to transfer the token to a 0x0 address
error ERC721TransferToTheZeroAddress();
/// Attempting to grant approval of assets to their current owner
error RMRKApprovalForAssetsToCurrentOwner();
/// Attempting to grant approval of assets without being the caller or approved for all
error RMRKApproveForAssetsCallerIsNotOwnerNorApprovedForAll();
/// Attempting to incorrectly configue a Catalog item
error RMRKBadConfig();
/// Attempting to set the priorities with an array of length that doesn't match the length of active assets array
error RMRKBadPriorityListLength();
/// Attempting to add an asset entry with `Part`s, without setting the `Catalog` address
error RMRKCatalogRequiredForParts();
/// Attempting to transfer a soulbound (non-transferrable) token
error RMRKCannotTransferSoulbound();
/// Attempting to accept a child that has already been accepted
error RMRKChildAlreadyExists();
/// Attempting to interact with a child, using index that is higher than the number of children
error RMRKChildIndexOutOfRange();
/// Attempting to find the index of a child token on a parent which does not own it.
error RMRKChildNotFoundInParent();
/// Attempting to pass collaborator address array and collaborator permission array of different lengths
error RMRKCollaboratorArraysNotEqualLength();
/// Attempting to register a collection that is already registered
error RMRKCollectionAlreadyRegistered();
/// Attempting to manage or interact with colleciton that is not registered
error RMRKCollectionNotRegistered();
/// Attempting to equip a `Part` with a child not approved by the Catalog
error RMRKEquippableEquipNotAllowedByCatalog();
/// Attempting to use ID 0, which is not supported
/// @dev The ID 0 in RMRK suite is reserved for empty values. Guarding against its use ensures the expected operation
error RMRKIdZeroForbidden();
/// Attempting to interact with an asset, using index greater than number of assets
error RMRKIndexOutOfRange();
/// Attempting to reclaim a child that can't be reclaimed
error RMRKInvalidChildReclaim();
/// Attempting to interact with an end-user account when the contract account is expected
error RMRKIsNotContract();
/// Attempting to interact with a contract that had its operation locked
error RMRKLocked();
/// Attempting to add a pending child after the number of pending children has reached the limit (default limit is 128)
error RMRKMaxPendingChildrenReached();
/// Attempting to add a pending asset after the number of pending assets has reached the limit (default limit is
///  128)
error RMRKMaxPendingAssetsReached();
/// Attempting to burn a total number of recursive children higher than maximum set
/// @param childContract Address of the collection smart contract in which the maximum number of recursive burns was reached
/// @param childId ID of the child token at which the maximum number of recursive burns was reached
error RMRKMaxRecursiveBurnsReached(address childContract, uint256 childId);
/// Attempting to mint a number of tokens that would cause the total supply to be greater than maximum supply
error RMRKMintOverMax();
/// Attempting to mint a nested token to a smart contract that doesn't support nesting
error RMRKMintToNonRMRKNestableImplementer();
/// Attempting to pass complementary arrays of different lengths
error RMRKMismachedArrayLength();
/// Attempting to transfer a child before it is unequipped
error RMRKMustUnequipFirst();
/// Attempting to nest a child over the nestable limit (current limit is 100 levels of nesting)
error RMRKNestableTooDeep();
/// Attempting to nest the token to own descendant, which would create a loop and leave the looped tokens in limbo
error RMRKNestableTransferToDescendant();
/// Attempting to nest the token to a smart contract that doesn't support nesting
error RMRKNestableTransferToNonRMRKNestableImplementer();
/// Attempting to nest the token into itself
error RMRKNestableTransferToSelf();
/// Attempting to interact with an asset that can not be found
error RMRKNoAssetMatchingId();
/// Attempting to manage an asset without owning it or having been granted permission by the owner to do so
error RMRKNotApprovedForAssetsOrOwner();
/// Attempting to interact with a token without being its owner or having been granted permission by the
///  owner to do so
/// @dev When a token is nested, only the direct owner (NFT parent) can mange it. In that case, approved addresses are
///  not allowed to manage it, in order to ensure the expected behaviour
error RMRKNotApprovedOrDirectOwner();
/// Attempting to manage a collection without being the collection's collaborator
error RMRKNotCollectionCollaborator();
/// Attemting to manage a collection without being the collection's issuer
error RMRKNotCollectionIssuer();
/// Attempting to manage a collection without being the collection's issuer or collaborator
error RMRKNotCollectionIssuerOrCollaborator();
/// Attempting to compose an asset wihtout having an associated Catalog
error RMRKNotComposableAsset();
/// Attempting to unequip an item that isn't equipped
error RMRKNotEquipped();
/// Attempting to interact with a management function without being the smart contract's owner
error RMRKNotOwner();
/// Attempting to interact with a function without being the owner or contributor of the collection
error RMRKNotOwnerOrContributor();
/// Attempting to manage a collection without being the specific address
error RMRKNotSpecificAddress();
/// Attempting to manage a token without being its owner
error RMRKNotTokenOwner();
/// Attempting to transfer the ownership to the 0x0 address
error RMRKNewOwnerIsZeroAddress();
/// Attempting to assign a 0x0 address as a contributor
error RMRKNewContributorIsZeroAddress();
/// Attemtping to use `Ownable` interface without implementing it
error RMRKOwnableNotImplemented();
/// Attempting an operation requiring the token being nested, while it is not
error RMRKParentIsNotNFT();
/// Attempting to add a `Part` with an ID that is already used
error RMRKPartAlreadyExists();
/// Attempting to use a `Part` that doesn't exist
error RMRKPartDoesNotExist();
/// Attempting to use a `Part` that is `Fixed` when `Slot` kind of `Part` should be used
error RMRKPartIsNotSlot();
/// Attempting to interact with a pending child using an index greater than the size of pending array
error RMRKPendingChildIndexOutOfRange();
/// Attempting to add an asset using an ID that has already been used
error RMRKAssetAlreadyExists();
/// Attempting to equip an item into a slot that already has an item equipped
error RMRKSlotAlreadyUsed();
/// Attempting to equip an item into a `Slot` that the target asset does not implement
error RMRKTargetAssetCannotReceiveSlot();
/// Attempting to equip a child into a `Slot` and parent that the child's collection doesn't support
error RMRKTokenCannotBeEquippedWithAssetIntoSlot();
/// Attempting to compose a NFT of a token without active assets
error RMRKTokenDoesNotHaveAsset();
/// Attempting to determine the asset with the top priority on a token without assets
error RMRKTokenHasNoAssets();
/// Attempting to accept or transfer a child which does not match the one at the specified index
error RMRKUnexpectedChildId();
/// Attempting to reject all pending assets but more assets than expected are pending
error RMRKUnexpectedNumberOfAssets();
/// Attempting to reject all pending children but children assets than expected are pending
error RMRKUnexpectedNumberOfChildren();
/// Attempting to accept or reject an asset which does not match the one at the specified index
error RMRKUnexpectedAssetId();
/// Attempting an operation expecting a parent to the token which is not the actual one
error RMRKUnexpectedParent();
/// Attempting not to pass an empty array of equippable addresses when adding or setting the equippable addresses
error RMRKZeroLengthIdsPassed();
/// Attempting to set the royalties to a value higher than 100% (10000 in base points)
error RMRKRoyaltiesTooHigh();

// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.18;

/**
 * @title RMRKCollectionMetadata
 * @author RMRK team
 * @notice Smart contract of the RMRK Collection metadata module.
 */
contract RMRKCollectionMetadata {
    string private _collectionMetadata;

    /**
     * @notice Used to initialize the contract with the given metadata.
     * @param collectionMetadata_ The collection metadata with which to initialize the smart contract
     */
    constructor(string memory collectionMetadata_) {
        _setCollectionMetadata(collectionMetadata_);
    }

    /**
     * @notice Used to set the metadata of the collection.
     * @param newMetadata The new metadata of the collection
     */
    function _setCollectionMetadata(string memory newMetadata) internal {
        _collectionMetadata = newMetadata;
    }

    /**
     * @notice Used to retrieve the metadata of the collection.
     * @return string The metadata URI of the collection
     */
    function collectionMetadata() public view returns (string memory) {
        return _collectionMetadata;
    }
}

// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.18;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
interface IOwnable {
    /**
     * @dev Returns owner
     */
    function owner() external view returns (address ownerAddress);

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     */
    function renounceOwnership() external;

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) external;
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;

error CollectionAddressCannotBeZero();
error CollectionAlreadyExists();
error CollectionAlreadySponsored();
error CollectionDoesNotExist(address collection);
error CollectionHasMintedTokens();
error CollectionMetadataNotAvailable();
error CollectionNotSponsored();
error NotEnoughAllowance();
error NotEnoughBalance();
error OnlyCollectionOwnerCanRemoveCollection();
error OnlyOwnerAdminOrFactoryCanAddCollection();

interface IRMRKRegistry {
    enum LegoCombination {
        None,
        MultiAsset,
        Nestable,
        NestableMultiAsset,
        Equippable,
        ERC721,
        ERC1155,
        Custom
    }

    enum MintingType {
        None,
        RMRKPreMint,
        RMRKLazyMintNativeToken,
        RMRKLazyMintERC20,
        Custom
    }

    struct CollectionConfig {
        bool usesOwnable;
        bool usesContributor;
        bool usesAccessControl;
        bool hasStandardAssetManagement; // has addAssetEntry, addEquippableAssetEntry, addAssetToToken, etc
        bool hasStandardMinting; // has mint(address to, uint256 numToMint)
        bool hasStandardNestMinting; // has nestMint(address to, uint256 numToMint, uint256 destinationId)
        bool autoAcceptsFirstAsset;
        bytes32 adminRole; // Only for AccessControl users
        uint8 customLegoCombination;
        uint8 customMintingType;
    }

    struct Collection {
        address collection;
        address verificationSponsor;
        uint256 verificationFeeBalance;
        LegoCombination legoCombination;
        MintingType mintingType;
        bool isSoulbound;
        bool visible;
        bool verified;
        CollectionConfig config;
    }

    event CollectionAdded(
        address collection,
        address deployer,
        string name,
        string symbol,
        uint256 maxSupply,
        string collectionMetadata,
        LegoCombination legoCombination,
        MintingType mintingType,
        bool isSoulbound,
        CollectionConfig config
    );

    event CollectionBlacklisted(address collection);
    event CollectionRemoved(address collection);

    function addCollectionFromFactories(
        address collection,
        address deployer,
        uint256 maxSupply,
        LegoCombination legoCombination,
        MintingType mintingType,
        bool isSoulbound
    ) external;

    function addCollection(
        address collection,
        address deployer,
        uint256 maxSupply,
        LegoCombination legoCombination,
        MintingType mintingType,
        bool isSoulbound,
        CollectionConfig memory config,
        string memory collectionMetadata
    ) external;

    function getMetaFactoryAddress() external view returns (address);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"rmrkToken_","type":"address"},{"internalType":"uint256","name":"collectionVerificationFee_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CollectionAddressCannotBeZero","type":"error"},{"inputs":[],"name":"CollectionAlreadyExists","type":"error"},{"inputs":[],"name":"CollectionAlreadySponsored","type":"error"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"CollectionDoesNotExist","type":"error"},{"inputs":[],"name":"CollectionHasMintedTokens","type":"error"},{"inputs":[],"name":"CollectionMetadataNotAvailable","type":"error"},{"inputs":[],"name":"CollectionNotSponsored","type":"error"},{"inputs":[],"name":"NotEnoughAllowance","type":"error"},{"inputs":[],"name":"NotEnoughBalance","type":"error"},{"inputs":[],"name":"OnlyCollectionOwnerCanRemoveCollection","type":"error"},{"inputs":[],"name":"OnlyOwnerAdminOrFactoryCanAddCollection","type":"error"},{"inputs":[],"name":"RMRKNewContributorIsZeroAddress","type":"error"},{"inputs":[],"name":"RMRKNewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"RMRKNotOwner","type":"error"},{"inputs":[],"name":"RMRKNotOwnerOrContributor","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"string","name":"collectionMetadata","type":"string"},{"indexed":false,"internalType":"enum IRMRKRegistry.LegoCombination","name":"legoCombination","type":"uint8"},{"indexed":false,"internalType":"enum IRMRKRegistry.MintingType","name":"mintingType","type":"uint8"},{"indexed":false,"internalType":"bool","name":"isSoulbound","type":"bool"},{"components":[{"internalType":"bool","name":"usesOwnable","type":"bool"},{"internalType":"bool","name":"usesContributor","type":"bool"},{"internalType":"bool","name":"usesAccessControl","type":"bool"},{"internalType":"bool","name":"hasStandardAssetManagement","type":"bool"},{"internalType":"bool","name":"hasStandardMinting","type":"bool"},{"internalType":"bool","name":"hasStandardNestMinting","type":"bool"},{"internalType":"bool","name":"autoAcceptsFirstAsset","type":"bool"},{"internalType":"bytes32","name":"adminRole","type":"bytes32"},{"internalType":"uint8","name":"customLegoCombination","type":"uint8"},{"internalType":"uint8","name":"customMintingType","type":"uint8"}],"indexed":false,"internalType":"struct IRMRKRegistry.CollectionConfig","name":"config","type":"tuple"}],"name":"CollectionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"}],"name":"CollectionBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"}],"name":"CollectionRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"bool","name":"isContributor","type":"bool"}],"name":"ContributorUpdate","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":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"enum IRMRKRegistry.LegoCombination","name":"legoCombination","type":"uint8"},{"internalType":"enum IRMRKRegistry.MintingType","name":"mintingType","type":"uint8"},{"internalType":"bool","name":"isSoulbound","type":"bool"},{"components":[{"internalType":"bool","name":"usesOwnable","type":"bool"},{"internalType":"bool","name":"usesContributor","type":"bool"},{"internalType":"bool","name":"usesAccessControl","type":"bool"},{"internalType":"bool","name":"hasStandardAssetManagement","type":"bool"},{"internalType":"bool","name":"hasStandardMinting","type":"bool"},{"internalType":"bool","name":"hasStandardNestMinting","type":"bool"},{"internalType":"bool","name":"autoAcceptsFirstAsset","type":"bool"},{"internalType":"bytes32","name":"adminRole","type":"bytes32"},{"internalType":"uint8","name":"customLegoCombination","type":"uint8"},{"internalType":"uint8","name":"customMintingType","type":"uint8"}],"internalType":"struct IRMRKRegistry.CollectionConfig","name":"config","type":"tuple"},{"internalType":"string","name":"collectionMetadata","type":"string"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"enum IRMRKRegistry.LegoCombination","name":"legoCombination","type":"uint8"},{"internalType":"enum IRMRKRegistry.MintingType","name":"mintingType","type":"uint8"},{"internalType":"bool","name":"isSoulbound","type":"bool"}],"name":"addCollectionFromFactories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"}],"name":"addFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"blackListCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionVerificationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"declineVerification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"factories","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"factoryList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getCollectionAddressByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"getCollectionByAddress","outputs":[{"components":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"verificationSponsor","type":"address"},{"internalType":"uint256","name":"verificationFeeBalance","type":"uint256"},{"internalType":"enum IRMRKRegistry.LegoCombination","name":"legoCombination","type":"uint8"},{"internalType":"enum IRMRKRegistry.MintingType","name":"mintingType","type":"uint8"},{"internalType":"bool","name":"isSoulbound","type":"bool"},{"internalType":"bool","name":"visible","type":"bool"},{"internalType":"bool","name":"verified","type":"bool"},{"components":[{"internalType":"bool","name":"usesOwnable","type":"bool"},{"internalType":"bool","name":"usesContributor","type":"bool"},{"internalType":"bool","name":"usesAccessControl","type":"bool"},{"internalType":"bool","name":"hasStandardAssetManagement","type":"bool"},{"internalType":"bool","name":"hasStandardMinting","type":"bool"},{"internalType":"bool","name":"hasStandardNestMinting","type":"bool"},{"internalType":"bool","name":"autoAcceptsFirstAsset","type":"bool"},{"internalType":"bytes32","name":"adminRole","type":"bytes32"},{"internalType":"uint8","name":"customLegoCombination","type":"uint8"},{"internalType":"uint8","name":"customMintingType","type":"uint8"}],"internalType":"struct IRMRKRegistry.CollectionConfig","name":"config","type":"tuple"}],"internalType":"struct IRMRKRegistry.Collection","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getCollectionByIndex","outputs":[{"components":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"verificationSponsor","type":"address"},{"internalType":"uint256","name":"verificationFeeBalance","type":"uint256"},{"internalType":"enum IRMRKRegistry.LegoCombination","name":"legoCombination","type":"uint8"},{"internalType":"enum IRMRKRegistry.MintingType","name":"mintingType","type":"uint8"},{"internalType":"bool","name":"isSoulbound","type":"bool"},{"internalType":"bool","name":"visible","type":"bool"},{"internalType":"bool","name":"verified","type":"bool"},{"components":[{"internalType":"bool","name":"usesOwnable","type":"bool"},{"internalType":"bool","name":"usesContributor","type":"bool"},{"internalType":"bool","name":"usesAccessControl","type":"bool"},{"internalType":"bool","name":"hasStandardAssetManagement","type":"bool"},{"internalType":"bool","name":"hasStandardMinting","type":"bool"},{"internalType":"bool","name":"hasStandardNestMinting","type":"bool"},{"internalType":"bool","name":"autoAcceptsFirstAsset","type":"bool"},{"internalType":"bytes32","name":"adminRole","type":"bytes32"},{"internalType":"uint8","name":"customLegoCombination","type":"uint8"},{"internalType":"uint8","name":"customMintingType","type":"uint8"}],"internalType":"struct IRMRKRegistry.CollectionConfig","name":"config","type":"tuple"}],"internalType":"struct IRMRKRegistry.Collection","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionVerificationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetaFactoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRmrkTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCollectionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"isCollectionInRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"}],"name":"isContributor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"},{"internalType":"bool","name":"grantRole","type":"bool"}],"name":"manageContributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"removeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"uint256","name":"factoryIndex","type":"uint256"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rmrkToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"metaFactory","type":"address"}],"name":"setMetaFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"sponsorVerification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalCollectionsCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"unblackListCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionVerificationFee_","type":"uint256"}],"name":"updateCollectionVerificationFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"}],"name":"verifyCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200262538038062002625833981016040819052620000349162000139565b6200003f33620000e9565b60016003819055600680546001600160a01b0319166001600160a01b0394909416939093179092556002556040805161014081018252828152602081018390526000918101829052606081018390526080810183905260a0810183905260c081019290925260e082018190526101008201819052610120909101819052600c805466ffffffffffffff19166601010101000101179055600d55600e805461ffff1916905562000175565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156200014d57600080fd5b82516001600160a01b03811681146200016557600080fd5b6020939093015192949293505050565b6124a080620001856000396000f3fe608060405234801561001057600080fd5b50600436106101755760003560e01c80630184e8211461017a5780630c44218b1461019d578063164e68de146101b257806319a49e3a146101c55780631d0d35f5146101e5578063213acdeb1461022257806329ce1ec5146102355780633711c363146102485780633908cc931461027357806339d10cc3146102865780633abd0651146102995780634a56644a146102ac5780635028d05a146102bf578063540834e3146102d25780635701df44146102e55780636170c4a6146102f757806364e32c4c1461030a578063715018a61461031d57806377c405501461032557806379e8ca9e146103385780637cceb15f1461034b578063845ac6111461035e5780638da5cb5b14610366578063923e77161461036e578063b718a42c14610381578063cc4c24aa14610392578063dddfd616146103a5578063f002804a146103ae578063f25c0635146103c1578063f2fde38b146103ca578063fab52689146103dd575b600080fd5b6007546001600160a01b03165b6040516101949190611cad565b60405180910390f35b6101b06101ab366004611cd6565b610400565b005b6101b06101c0366004611d02565b610459565b6101d86101d3366004611d26565b6104e4565b6040516101949190611e2c565b6102126101f3366004611d02565b6001600160a01b03166000908152600160208190526040909120541490565b6040519015158152602001610194565b610187610230366004611d26565b610692565b6101b0610243366004611d02565b6106bc565b610212610256366004611d02565b6001600160a01b0316600090815260096020526040902054151590565b6101b0610281366004611d02565b61072a565b6101b0610294366004611d26565b6107e2565b600654610187906001600160a01b031681565b6101b06102ba366004611d02565b6107ef565b6101b06102cd366004611d02565b610819565b6101b06102e0366004611f11565b610cb7565b6002545b604051908152602001610194565b6101b0610305366004612083565b610d73565b6101b0610318366004611d02565b611386565b6101b0611630565b6101b0610333366004611d02565b611644565b6101b06103463660046121f0565b6116ac565b6101b0610359366004611d02565b611769565b6008546102e9565b61018761183c565b6101b061037c366004611d02565b61184b565b6006546001600160a01b0316610187565b6101876103a0366004611d26565b6118ed565b6102e960035481565b6101d86103bc366004611d02565b611922565b6102e960025481565b6101b06103d8366004611d02565b611b17565b6102126103eb366004611d02565b60046020526000908152604090205460ff1681565b610408611b52565b6001600160a01b0382166000908152600460205260409020805460ff19169055600580548290811061043c5761043c612229565b600091825260209091200180546001600160a01b03191690555050565b610461611b96565b600b8054600090915560065460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061049c908590859060040161223f565b6020604051808303816000875af11580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df9190612258565b505050565b6104ec611c16565b600882815481106104ff576104ff612229565b60009182526020918290206040805161012081018252600793840290920180546001600160a01b039081168452600182015416948301949094526002840154908201526003830154909291606084019160ff169081111561056257610562611d3f565b600781111561057357610573611d3f565b81526020016003820160019054906101000a900460ff16600481111561059b5761059b611d3f565b60048111156105ac576105ac611d3f565b8152600382015460ff6201000080830482161515602080860191909152630100000080850484161515604080880191909152600160201b958690048516151560608089019190915281516101408101835260048a01548088161515825261010080820489161515968301969096529586048716151592810192909252918404851615159181019190915293820483161515608085810191909152600160281b83048416151560a0860152600160301b9092048316151560c0850152600586015460e085015260069095015480831684870152949094041661012082015291015292915050565b600581815481106106a257600080fd5b6000918252602090912001546001600160a01b0316905081565b6106c4611b52565b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b610732611b52565b6001600160a01b038116600090815260096020526040812054908190036107775781604051634580ccc360e11b815260040161076e9190611cad565b60405180910390fd5b6000600861078660018461228b565b8154811061079657610796612229565b9060005260206000209060070201905080600201546000036107ca5760405162e5804760e31b815260040160405180910390fd5b600301805460ff60201b1916600160201b1790555050565b6107ea611b52565b600255565b6107f7611b52565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260096020526040812054908190036108555781604051634580ccc360e11b815260040161076e9190611cad565b61086060018261228b565b905060006008828154811061087757610877612229565b60009182526020918290206040805161012081018252600793840290920180546001600160a01b039081168452600182015416948301949094526002840154908201526003830154909291606084019160ff16908111156108da576108da611d3f565b60078111156108eb576108eb611d3f565b81526020016003820160019054906101000a900460ff16600481111561091357610913611d3f565b600481111561092457610924611d3f565b8152600382015460ff6201000080830482161515602080860191909152630100000080850484161515604080880191909152600160201b958690048516151560608089019190915281516101408101835260048a01548088161515825261010080820489161515968301969096529586048716151592810192909252918404851615159181019190915293820483161515608085810191909152600160281b83048416151560a0860152600160301b9092048316151560c0850152600586015460e08501526006909501548083168487015294909404166101208201529101529050610a0d3390565b6001600160a01b031681600001516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c91906122a4565b6001600160a01b031614610aa357604051638f16e9eb60e01b815260040160405180910390fd5b600681606001516007811115610abb57610abb611d3f565b14610b43576000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2491906122c1565b1115610b435760405163c1c59d5360e01b815260040160405180910390fd5b60088281548110610b5657610b56612229565b60009182526020808320600790920290910180546001600160a01b0319908116825560018201805490911690556002810183905560038101805464ffffffffff1916905560048101805466ffffffffffffff1916905560058101839055600601805461ffff191690556001600160a01b03851682526009905260408082209190915581015115610c7b5760008160400151905080600a6000828254610bfb919061228b565b9091555050600654602083015160405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91610c3591859060040161223f565b6020604051808303816000875af1158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190612258565b50505b7fa0691bd707b2f65c33c8343d61c274df72c6b5007937dcfbc31aa5a0d0f6fe3c83604051610caa9190611cad565b60405180910390a1505050565b6040805161014081018252600c5460ff8082161515835261010080830482161515602080860191909152620100008404831615158587015263010000008404831615156060860152600160201b8404831615156080860152600160281b84048316151560a0860152600160301b9093048216151560c0850152600d5460e0850152600e54808316828601520416610120830152825190810190925260008252610d6b91889188918891889188918891610d73565b505050505050565b610d7b61183c565b6001600160a01b0316336001600160a01b031614158015610da25750610da0336101f3565b155b8015610dbe57503360009081526004602052604090205460ff16155b15610ddb576040516214dc9f60e61b815260040160405180910390fd5b6001600160a01b038816610e015760405162db1a2360e21b815260040160405180910390fd5b6001600160a01b03881660009081526009602052604090205415610e385760405163d7feb16d60e01b815260040160405180910390fd5b60006040518061012001604052808a6001600160a01b0316815260200160006001600160a01b0316815260200160008152602001876007811115610e7e57610e7e611d3f565b8152602001866004811115610e9557610e95611d3f565b815260200185151581526020016001151581526020016000151581526020018481525090506000896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610efa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f2291908101906122fe565b905060008a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610f64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f8c91908101906122fe565b90506060600085511115610fa1575083611020565b8b6001600160a01b03166389ed2edf6040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561100057506040513d6000823e601f3d908101601f19168201604052610ffd91908101906122fe565b60015b61101d5760405163fd590a4360e01b815260040160405180910390fd5b90505b6008805460018181018355600092909252855160079182027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180546001600160a01b039384166001600160a01b031991821617825560208a01517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4840180549190951691161790925560408801517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015560608801517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee69091018054899593949293919260ff199091169190849081111561112057611120611d3f565b0217905550608082015160038201805461ff00191661010083600481111561114a5761114a611d3f565b021790555060a08201518160030160026101000a81548160ff02191690831515021790555060c08201518160030160036101000a81548160ff02191690831515021790555060e08201518160030160046101000a81548160ff0219169083151502179055506101008201518160040160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548160ff02191690831515021790555060a08201518160000160056101000a81548160ff02191690831515021790555060c08201518160000160066101000a81548160ff02191690831515021790555060e082015181600101556101008201518160020160006101000a81548160ff021916908360ff1602179055506101208201518160020160016101000a81548160ff021916908360ff16021790555050505050600354600960008e6001600160a01b03166001600160a01b03168152602001908152602001600020819055506003600081548092919061132a90612374565b91905055507fa272a920ad706f01ae3cee9285d565f5d0665372ef0d096ec419b32987b1616b8c8c85858e868f8f8f8f6040516113709a999897969594939291906123b9565b60405180910390a1505050505050505050505050565b6002546006546001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa1580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140991906122c1565b101561142857604051634fd3af0760e01b815260040160405180910390fd5b6002546006546001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016114599190611cad565b602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a91906122c1565b10156114b95760405163569d45cf60e11b815260040160405180910390fd5b6001600160a01b038116600090815260096020526040812054908190036114f55781604051634580ccc360e11b815260040161076e9190611cad565b600254600a60008282546115099190612457565b9091555060009050600861151e60018461228b565b8154811061152e5761152e612229565b6000918252602090912060079091020160018101549091506001600160a01b03161561156d576040516343e17fbb60e11b815260040160405180910390fd5b6002548160020160008282546115839190612457565b909155503390506001820180546001600160a01b0319166001600160a01b03928316179055600654166323b872dd336002546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015230602483015260448201526064016020604051808303816000875af1158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190612258565b50505050565b611638611b96565b6116426000611bc6565b565b61164c611b52565b6001600160a01b0381166000908152600960205260408120546008906116749060019061228b565b8154811061168457611684612229565b60009182526020909120600360079092020101805463ff000000191663010000001790555050565b6116b4611b96565b6001600160a01b0382166116db5760405163016b812760e71b815260040160405180910390fd5b80611700576001600160a01b038216600090815260016020526040812081905561171f565b6001600160a01b03821660009081526001602081905260409091208190555b50816001600160a01b03167f4b5657e84cf8a17ac5587bbeb3cc2bab9826c4c67b8bad81b4849de49d37aac28260405161175d911515815260200190565b60405180910390a25050565b611771611b52565b6001600160a01b0381166000908152600960205260408120546008906117999060019061228b565b815481106117a9576117a9612229565b906000526020600020906007020190508060020154600b60008282546117cf9190612457565b90915550506002810154600a80546000906117eb90849061228b565b909155505060038101805464ffff000000191690556040517f98b341583efd5a371b2e3094e23f9d87c5e4ec187739d33fa26fe6bc08ef4ec790611830908490611cad565b60405180910390a15050565b6000546001600160a01b031690565b611853611b52565b6001600160a01b03811660009081526009602052604081205460089061187b9060019061228b565b8154811061188b5761188b612229565b906000526020600020906007020190508060020154600b60008282546118b19190612457565b90915550506002810154600a80546000906118cd90849061228b565b90915550506000600282015560010180546001600160a01b031916905550565b60006008828154811061190257611902612229565b60009182526020909120600790910201546001600160a01b031692915050565b61192a611c16565b6001600160a01b038216600090815260096020526040812054908190036119665782604051634580ccc360e11b815260040161076e9190611cad565b600861197360018361228b565b8154811061198357611983612229565b60009182526020918290206040805161012081018252600793840290920180546001600160a01b039081168452600182015416948301949094526002840154908201526003830154909291606084019160ff16908111156119e6576119e6611d3f565b60078111156119f7576119f7611d3f565b81526020016003820160019054906101000a900460ff166004811115611a1f57611a1f611d3f565b6004811115611a3057611a30611d3f565b8152600382015460ff6201000080830482161515602080860191909152630100000080850484161515604080880191909152600160201b958690048516151560608089019190915281516101408101835260048a01548088161515825261010080820489161515968301969096529586048716151592810192909252918404851615159181019190915293820483161515608085810191909152600160281b83048416151560a0860152600160301b9092048316151560c0850152600586015460e08501526006909501548083168487015294909404166101208201529101529392505050565b611b1f611b96565b6001600160a01b038116611b4657604051634ece6ecf60e01b815260040160405180910390fd5b611b4f81611bc6565b50565b33611b5b61183c565b6001600160a01b031614158015611b785750611b76336101f3565b155b15611642576040516301eca16760e41b815260040160405180910390fd5b33611b9f61183c565b6001600160a01b03161461164257604051631c62d58f60e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516101208101825260008082526020820181905291810182905290606082019081526020016000815260006020808301829052604080840183905260608085018490528151610140810183528481529283018490529082018390528101829052608081810183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925291015290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611b4f57600080fd5b60008060408385031215611ce957600080fd5b8235611cf481611cc1565b946020939093013593505050565b600060208284031215611d1457600080fd5b8135611d1f81611cc1565b9392505050565b600060208284031215611d3857600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60088110611d6557611d65611d3f565b9052565b60058110611d6557611d65611d3f565b8051151582526020810151611d92602084018215159052565b506040810151611da6604084018215159052565b506060810151611dba606084018215159052565b506080810151611dce608084018215159052565b5060a0810151611de260a084018215159052565b5060c0810151611df660c084018215159052565b5060e081015160e083015261010080820151611e168285018260ff169052565b50506101208181015160ff81168483015261162a565b81516001600160a01b0390811682526020808401519091169082015260408083015190820152606080830151610240830191611e6a90840182611d55565b506080830151611e7d6080840182611d69565b5060a0830151611e9160a084018215159052565b5060c0830151611ea560c084018215159052565b5060e0830151611eb960e084018215159052565b5061010080840151611ecd82850182611d79565b505092915050565b803560088110611ee457600080fd5b919050565b803560058110611ee457600080fd5b8015158114611b4f57600080fd5b8035611ee481611ef8565b60008060008060008060c08789031215611f2a57600080fd5b8635611f3581611cc1565b95506020870135611f4581611cc1565b945060408701359350611f5a60608801611ed5565b9250611f6860808801611ee9565b915060a0870135611f7881611ef8565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b0381118282101715611fbf57611fbf611f86565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611fed57611fed611f86565b604052919050565b803560ff81168114611ee457600080fd5b60006001600160401b0382111561201f5761201f611f86565b50601f01601f191660200190565b600082601f83011261203e57600080fd5b813561205161204c82612006565b611fc5565b81815284602083860101111561206657600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080888a036102208112156120a157600080fd5b89356120ac81611cc1565b985060208a01356120bc81611cc1565b975060408a013596506120d160608b01611ed5565b95506120df60808b01611ee9565b945060a08a01356120ef81611ef8565b935061014060bf19820181131561210557600080fd5b61210d611f9c565b915061211b60c08c01611f06565b825261212960e08c01611f06565b602083015261010061213c818d01611f06565b604084015261012061214f818e01611f06565b606085015261215f838e01611f06565b60808501526121716101608e01611f06565b60a08501526121836101808e01611f06565b60c08501526101a08d013560e08501526121a06101c08e01611ff5565b828501526121b16101e08e01611ff5565b9084015250909250506102008901356001600160401b038111156121d457600080fd5b6121e08b828c0161202d565b9150509295985092959890939650565b6000806040838503121561220357600080fd5b823561220e81611cc1565b9150602083013561221e81611ef8565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03929092168252602082015260400190565b60006020828403121561226a57600080fd5b8151611d1f81611ef8565b634e487b7160e01b600052601160045260246000fd5b8181038181111561229e5761229e612275565b92915050565b6000602082840312156122b657600080fd5b8151611d1f81611cc1565b6000602082840312156122d357600080fd5b5051919050565b60005b838110156122f55781810151838201526020016122dd565b50506000910152565b60006020828403121561231057600080fd5b81516001600160401b0381111561232657600080fd5b8201601f8101841361233757600080fd5b805161234561204c82612006565b81815285602083850101111561235a57600080fd5b61236b8260208301602086016122da565b95945050505050565b60006001820161238657612386612275565b5060010190565b600081518084526123a58160208601602086016122da565b601f01601f19169290920160200192915050565b6001600160a01b038b811682528a166020820152610260604082018190526000906123e68382018c61238d565b905082810360608401526123fa818b61238d565b905088608084015282810360a0840152612414818961238d565b91505061242460c0830187611d55565b61243160e0830186611d69565b831515610100830152612448610120830184611d79565b9b9a5050505050505050505050565b8082018082111561229e5761229e61227556fea26469706673582212207983a28b9111f7cc0188f615d6f7dc1daf5ae7c2107dafcac7745e21e1efd2ef64736f6c634300081200330000000000000000000000003ff3b0361b450e70729006918c14deb6da4103490000000000000000000000000000000000000000000000004563918244f40000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101755760003560e01c80630184e8211461017a5780630c44218b1461019d578063164e68de146101b257806319a49e3a146101c55780631d0d35f5146101e5578063213acdeb1461022257806329ce1ec5146102355780633711c363146102485780633908cc931461027357806339d10cc3146102865780633abd0651146102995780634a56644a146102ac5780635028d05a146102bf578063540834e3146102d25780635701df44146102e55780636170c4a6146102f757806364e32c4c1461030a578063715018a61461031d57806377c405501461032557806379e8ca9e146103385780637cceb15f1461034b578063845ac6111461035e5780638da5cb5b14610366578063923e77161461036e578063b718a42c14610381578063cc4c24aa14610392578063dddfd616146103a5578063f002804a146103ae578063f25c0635146103c1578063f2fde38b146103ca578063fab52689146103dd575b600080fd5b6007546001600160a01b03165b6040516101949190611cad565b60405180910390f35b6101b06101ab366004611cd6565b610400565b005b6101b06101c0366004611d02565b610459565b6101d86101d3366004611d26565b6104e4565b6040516101949190611e2c565b6102126101f3366004611d02565b6001600160a01b03166000908152600160208190526040909120541490565b6040519015158152602001610194565b610187610230366004611d26565b610692565b6101b0610243366004611d02565b6106bc565b610212610256366004611d02565b6001600160a01b0316600090815260096020526040902054151590565b6101b0610281366004611d02565b61072a565b6101b0610294366004611d26565b6107e2565b600654610187906001600160a01b031681565b6101b06102ba366004611d02565b6107ef565b6101b06102cd366004611d02565b610819565b6101b06102e0366004611f11565b610cb7565b6002545b604051908152602001610194565b6101b0610305366004612083565b610d73565b6101b0610318366004611d02565b611386565b6101b0611630565b6101b0610333366004611d02565b611644565b6101b06103463660046121f0565b6116ac565b6101b0610359366004611d02565b611769565b6008546102e9565b61018761183c565b6101b061037c366004611d02565b61184b565b6006546001600160a01b0316610187565b6101876103a0366004611d26565b6118ed565b6102e960035481565b6101d86103bc366004611d02565b611922565b6102e960025481565b6101b06103d8366004611d02565b611b17565b6102126103eb366004611d02565b60046020526000908152604090205460ff1681565b610408611b52565b6001600160a01b0382166000908152600460205260409020805460ff19169055600580548290811061043c5761043c612229565b600091825260209091200180546001600160a01b03191690555050565b610461611b96565b600b8054600090915560065460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061049c908590859060040161223f565b6020604051808303816000875af11580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df9190612258565b505050565b6104ec611c16565b600882815481106104ff576104ff612229565b60009182526020918290206040805161012081018252600793840290920180546001600160a01b039081168452600182015416948301949094526002840154908201526003830154909291606084019160ff169081111561056257610562611d3f565b600781111561057357610573611d3f565b81526020016003820160019054906101000a900460ff16600481111561059b5761059b611d3f565b60048111156105ac576105ac611d3f565b8152600382015460ff6201000080830482161515602080860191909152630100000080850484161515604080880191909152600160201b958690048516151560608089019190915281516101408101835260048a01548088161515825261010080820489161515968301969096529586048716151592810192909252918404851615159181019190915293820483161515608085810191909152600160281b83048416151560a0860152600160301b9092048316151560c0850152600586015460e085015260069095015480831684870152949094041661012082015291015292915050565b600581815481106106a257600080fd5b6000918252602090912001546001600160a01b0316905081565b6106c4611b52565b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b610732611b52565b6001600160a01b038116600090815260096020526040812054908190036107775781604051634580ccc360e11b815260040161076e9190611cad565b60405180910390fd5b6000600861078660018461228b565b8154811061079657610796612229565b9060005260206000209060070201905080600201546000036107ca5760405162e5804760e31b815260040160405180910390fd5b600301805460ff60201b1916600160201b1790555050565b6107ea611b52565b600255565b6107f7611b52565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260096020526040812054908190036108555781604051634580ccc360e11b815260040161076e9190611cad565b61086060018261228b565b905060006008828154811061087757610877612229565b60009182526020918290206040805161012081018252600793840290920180546001600160a01b039081168452600182015416948301949094526002840154908201526003830154909291606084019160ff16908111156108da576108da611d3f565b60078111156108eb576108eb611d3f565b81526020016003820160019054906101000a900460ff16600481111561091357610913611d3f565b600481111561092457610924611d3f565b8152600382015460ff6201000080830482161515602080860191909152630100000080850484161515604080880191909152600160201b958690048516151560608089019190915281516101408101835260048a01548088161515825261010080820489161515968301969096529586048716151592810192909252918404851615159181019190915293820483161515608085810191909152600160281b83048416151560a0860152600160301b9092048316151560c0850152600586015460e08501526006909501548083168487015294909404166101208201529101529050610a0d3390565b6001600160a01b031681600001516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c91906122a4565b6001600160a01b031614610aa357604051638f16e9eb60e01b815260040160405180910390fd5b600681606001516007811115610abb57610abb611d3f565b14610b43576000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2491906122c1565b1115610b435760405163c1c59d5360e01b815260040160405180910390fd5b60088281548110610b5657610b56612229565b60009182526020808320600790920290910180546001600160a01b0319908116825560018201805490911690556002810183905560038101805464ffffffffff1916905560048101805466ffffffffffffff1916905560058101839055600601805461ffff191690556001600160a01b03851682526009905260408082209190915581015115610c7b5760008160400151905080600a6000828254610bfb919061228b565b9091555050600654602083015160405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91610c3591859060040161223f565b6020604051808303816000875af1158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c789190612258565b50505b7fa0691bd707b2f65c33c8343d61c274df72c6b5007937dcfbc31aa5a0d0f6fe3c83604051610caa9190611cad565b60405180910390a1505050565b6040805161014081018252600c5460ff8082161515835261010080830482161515602080860191909152620100008404831615158587015263010000008404831615156060860152600160201b8404831615156080860152600160281b84048316151560a0860152600160301b9093048216151560c0850152600d5460e0850152600e54808316828601520416610120830152825190810190925260008252610d6b91889188918891889188918891610d73565b505050505050565b610d7b61183c565b6001600160a01b0316336001600160a01b031614158015610da25750610da0336101f3565b155b8015610dbe57503360009081526004602052604090205460ff16155b15610ddb576040516214dc9f60e61b815260040160405180910390fd5b6001600160a01b038816610e015760405162db1a2360e21b815260040160405180910390fd5b6001600160a01b03881660009081526009602052604090205415610e385760405163d7feb16d60e01b815260040160405180910390fd5b60006040518061012001604052808a6001600160a01b0316815260200160006001600160a01b0316815260200160008152602001876007811115610e7e57610e7e611d3f565b8152602001866004811115610e9557610e95611d3f565b815260200185151581526020016001151581526020016000151581526020018481525090506000896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610efa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f2291908101906122fe565b905060008a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610f64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f8c91908101906122fe565b90506060600085511115610fa1575083611020565b8b6001600160a01b03166389ed2edf6040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561100057506040513d6000823e601f3d908101601f19168201604052610ffd91908101906122fe565b60015b61101d5760405163fd590a4360e01b815260040160405180910390fd5b90505b6008805460018181018355600092909252855160079182027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180546001600160a01b039384166001600160a01b031991821617825560208a01517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4840180549190951691161790925560408801517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee582015560608801517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee69091018054899593949293919260ff199091169190849081111561112057611120611d3f565b0217905550608082015160038201805461ff00191661010083600481111561114a5761114a611d3f565b021790555060a08201518160030160026101000a81548160ff02191690831515021790555060c08201518160030160036101000a81548160ff02191690831515021790555060e08201518160030160046101000a81548160ff0219169083151502179055506101008201518160040160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff02191690831515021790555060808201518160000160046101000a81548160ff02191690831515021790555060a08201518160000160056101000a81548160ff02191690831515021790555060c08201518160000160066101000a81548160ff02191690831515021790555060e082015181600101556101008201518160020160006101000a81548160ff021916908360ff1602179055506101208201518160020160016101000a81548160ff021916908360ff16021790555050505050600354600960008e6001600160a01b03166001600160a01b03168152602001908152602001600020819055506003600081548092919061132a90612374565b91905055507fa272a920ad706f01ae3cee9285d565f5d0665372ef0d096ec419b32987b1616b8c8c85858e868f8f8f8f6040516113709a999897969594939291906123b9565b60405180910390a1505050505050505050505050565b6002546006546001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa1580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140991906122c1565b101561142857604051634fd3af0760e01b815260040160405180910390fd5b6002546006546001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016114599190611cad565b602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a91906122c1565b10156114b95760405163569d45cf60e11b815260040160405180910390fd5b6001600160a01b038116600090815260096020526040812054908190036114f55781604051634580ccc360e11b815260040161076e9190611cad565b600254600a60008282546115099190612457565b9091555060009050600861151e60018461228b565b8154811061152e5761152e612229565b6000918252602090912060079091020160018101549091506001600160a01b03161561156d576040516343e17fbb60e11b815260040160405180910390fd5b6002548160020160008282546115839190612457565b909155503390506001820180546001600160a01b0319166001600160a01b03928316179055600654166323b872dd336002546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015230602483015260448201526064016020604051808303816000875af1158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190612258565b50505050565b611638611b96565b6116426000611bc6565b565b61164c611b52565b6001600160a01b0381166000908152600960205260408120546008906116749060019061228b565b8154811061168457611684612229565b60009182526020909120600360079092020101805463ff000000191663010000001790555050565b6116b4611b96565b6001600160a01b0382166116db5760405163016b812760e71b815260040160405180910390fd5b80611700576001600160a01b038216600090815260016020526040812081905561171f565b6001600160a01b03821660009081526001602081905260409091208190555b50816001600160a01b03167f4b5657e84cf8a17ac5587bbeb3cc2bab9826c4c67b8bad81b4849de49d37aac28260405161175d911515815260200190565b60405180910390a25050565b611771611b52565b6001600160a01b0381166000908152600960205260408120546008906117999060019061228b565b815481106117a9576117a9612229565b906000526020600020906007020190508060020154600b60008282546117cf9190612457565b90915550506002810154600a80546000906117eb90849061228b565b909155505060038101805464ffff000000191690556040517f98b341583efd5a371b2e3094e23f9d87c5e4ec187739d33fa26fe6bc08ef4ec790611830908490611cad565b60405180910390a15050565b6000546001600160a01b031690565b611853611b52565b6001600160a01b03811660009081526009602052604081205460089061187b9060019061228b565b8154811061188b5761188b612229565b906000526020600020906007020190508060020154600b60008282546118b19190612457565b90915550506002810154600a80546000906118cd90849061228b565b90915550506000600282015560010180546001600160a01b031916905550565b60006008828154811061190257611902612229565b60009182526020909120600790910201546001600160a01b031692915050565b61192a611c16565b6001600160a01b038216600090815260096020526040812054908190036119665782604051634580ccc360e11b815260040161076e9190611cad565b600861197360018361228b565b8154811061198357611983612229565b60009182526020918290206040805161012081018252600793840290920180546001600160a01b039081168452600182015416948301949094526002840154908201526003830154909291606084019160ff16908111156119e6576119e6611d3f565b60078111156119f7576119f7611d3f565b81526020016003820160019054906101000a900460ff166004811115611a1f57611a1f611d3f565b6004811115611a3057611a30611d3f565b8152600382015460ff6201000080830482161515602080860191909152630100000080850484161515604080880191909152600160201b958690048516151560608089019190915281516101408101835260048a01548088161515825261010080820489161515968301969096529586048716151592810192909252918404851615159181019190915293820483161515608085810191909152600160281b83048416151560a0860152600160301b9092048316151560c0850152600586015460e08501526006909501548083168487015294909404166101208201529101529392505050565b611b1f611b96565b6001600160a01b038116611b4657604051634ece6ecf60e01b815260040160405180910390fd5b611b4f81611bc6565b50565b33611b5b61183c565b6001600160a01b031614158015611b785750611b76336101f3565b155b15611642576040516301eca16760e41b815260040160405180910390fd5b33611b9f61183c565b6001600160a01b03161461164257604051631c62d58f60e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516101208101825260008082526020820181905291810182905290606082019081526020016000815260006020808301829052604080840183905260608085018490528151610140810183528481529283018490529082018390528101829052608081810183905260a0820183905260c0820183905260e08201839052610100820183905261012082019290925291015290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611b4f57600080fd5b60008060408385031215611ce957600080fd5b8235611cf481611cc1565b946020939093013593505050565b600060208284031215611d1457600080fd5b8135611d1f81611cc1565b9392505050565b600060208284031215611d3857600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60088110611d6557611d65611d3f565b9052565b60058110611d6557611d65611d3f565b8051151582526020810151611d92602084018215159052565b506040810151611da6604084018215159052565b506060810151611dba606084018215159052565b506080810151611dce608084018215159052565b5060a0810151611de260a084018215159052565b5060c0810151611df660c084018215159052565b5060e081015160e083015261010080820151611e168285018260ff169052565b50506101208181015160ff81168483015261162a565b81516001600160a01b0390811682526020808401519091169082015260408083015190820152606080830151610240830191611e6a90840182611d55565b506080830151611e7d6080840182611d69565b5060a0830151611e9160a084018215159052565b5060c0830151611ea560c084018215159052565b5060e0830151611eb960e084018215159052565b5061010080840151611ecd82850182611d79565b505092915050565b803560088110611ee457600080fd5b919050565b803560058110611ee457600080fd5b8015158114611b4f57600080fd5b8035611ee481611ef8565b60008060008060008060c08789031215611f2a57600080fd5b8635611f3581611cc1565b95506020870135611f4581611cc1565b945060408701359350611f5a60608801611ed5565b9250611f6860808801611ee9565b915060a0870135611f7881611ef8565b809150509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b0381118282101715611fbf57611fbf611f86565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611fed57611fed611f86565b604052919050565b803560ff81168114611ee457600080fd5b60006001600160401b0382111561201f5761201f611f86565b50601f01601f191660200190565b600082601f83011261203e57600080fd5b813561205161204c82612006565b611fc5565b81815284602083860101111561206657600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600080888a036102208112156120a157600080fd5b89356120ac81611cc1565b985060208a01356120bc81611cc1565b975060408a013596506120d160608b01611ed5565b95506120df60808b01611ee9565b945060a08a01356120ef81611ef8565b935061014060bf19820181131561210557600080fd5b61210d611f9c565b915061211b60c08c01611f06565b825261212960e08c01611f06565b602083015261010061213c818d01611f06565b604084015261012061214f818e01611f06565b606085015261215f838e01611f06565b60808501526121716101608e01611f06565b60a08501526121836101808e01611f06565b60c08501526101a08d013560e08501526121a06101c08e01611ff5565b828501526121b16101e08e01611ff5565b9084015250909250506102008901356001600160401b038111156121d457600080fd5b6121e08b828c0161202d565b9150509295985092959890939650565b6000806040838503121561220357600080fd5b823561220e81611cc1565b9150602083013561221e81611ef8565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03929092168252602082015260400190565b60006020828403121561226a57600080fd5b8151611d1f81611ef8565b634e487b7160e01b600052601160045260246000fd5b8181038181111561229e5761229e612275565b92915050565b6000602082840312156122b657600080fd5b8151611d1f81611cc1565b6000602082840312156122d357600080fd5b5051919050565b60005b838110156122f55781810151838201526020016122dd565b50506000910152565b60006020828403121561231057600080fd5b81516001600160401b0381111561232657600080fd5b8201601f8101841361233757600080fd5b805161234561204c82612006565b81815285602083850101111561235a57600080fd5b61236b8260208301602086016122da565b95945050505050565b60006001820161238657612386612275565b5060010190565b600081518084526123a58160208601602086016122da565b601f01601f19169290920160200192915050565b6001600160a01b038b811682528a166020820152610260604082018190526000906123e68382018c61238d565b905082810360608401526123fa818b61238d565b905088608084015282810360a0840152612414818961238d565b91505061242460c0830187611d55565b61243160e0830186611d69565b831515610100830152612448610120830184611d79565b9b9a5050505050505050505050565b8082018082111561229e5761229e61227556fea26469706673582212207983a28b9111f7cc0188f615d6f7dc1daf5ae7c2107dafcac7745e21e1efd2ef64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003ff3b0361b450e70729006918c14deb6da4103490000000000000000000000000000000000000000000000004563918244f40000

-----Decoded View---------------
Arg [0] : rmrkToken_ (address): 0x3Ff3B0361B450E70729006918c14DEb6Da410349
Arg [1] : collectionVerificationFee_ (uint256): 5000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ff3b0361b450e70729006918c14deb6da410349
Arg [1] : 0000000000000000000000000000000000000000000000004563918244f40000


Block Transaction Gas Used Reward
view all blocks collator

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.