// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {
    IERC721Enumerable
} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

/// @title IOptimismMintableERC721
/// @notice Interface for contracts that are compatible with the OptimismMintableERC721 standard.
///         Tokens that follow this standard can be easily transferred across the ERC721 bridge.
interface IOptimismMintableERC721 is IERC721Enumerable {
    /// @notice Emitted when a token is minted.
    /// @param account Address of the account the token was minted to.
    /// @param tokenId Token ID of the minted token.
    event Mint(address indexed account, uint256 tokenId);

    /// @notice Emitted when a token is burned.
    /// @param account Address of the account the token was burned from.
    /// @param tokenId Token ID of the burned token.
    event Burn(address indexed account, uint256 tokenId);

    /// @notice Mints some token ID for a user, checking first that contract recipients
    ///         are aware of the ERC721 protocol to prevent tokens from being forever locked.
    /// @param _to      Address of the user to mint the token for.
    /// @param _tokenId Token ID to mint.
    function safeMint(address _to, uint256 _tokenId) external;

    /// @notice Burns a token ID from a user.
    /// @param _from    Address of the user to burn the token from.
    /// @param _tokenId Token ID to burn.
    function burn(address _from, uint256 _tokenId) external;

    /// @notice Chain ID of the chain where the remote token is deployed.
    function REMOTE_CHAIN_ID() external view returns (uint256);

    /// @notice Address of the token on the remote domain.
    function REMOTE_TOKEN() external view returns (address);

    /// @notice Address of the ERC721 bridge on this network.
    function BRIDGE() external view returns (address);

    /// @notice Chain ID of the chain where the remote token is deployed.
    function remoteChainId() external view returns (uint256);

    /// @notice Address of the token on the remote domain.
    function remoteToken() external view returns (address);

    /// @notice Address of the ERC721 bridge on this network.
    function bridge() external view returns (address);
}
