interface StickerMarket {

    event ClaimedTokens(address indexed _token, address indexed _controller, uint256 _amount);
    event MarketState(State state);
    event RegisterFee(uint256 value);
    event BurnRate(uint256 value);

    enum State { Invalid, Open, BuyOnly, Controlled, Closed }

    function state() external view returns(State);
    function snt() external view returns (address);
    function stickerPack() external view returns (address);
    function stickerType() external view returns (address);

    /**
     * @dev Mints NFT StickerPack in `_destination` account, and Transfers SNT using user allowance
     * emit NonfungibleToken.Transfer(`address(0)`, `_destination`, `tokenId`)
     * @notice buy a pack from market pack owner, including a StickerPack's token in `_destination` account with same metadata of `_packId`
     * @param _packId id of market pack
     * @param _destination owner of token being brought
     * @param _price agreed price
     * @return tokenId generated StickerPack token
     */
    function buyToken(
        uint256 _packId,
        address _destination,
        uint256 _price
    )
        external
        returns (uint256 tokenId);

    /**
     * @dev emits StickerMarket.Register(`packId`, `_urlHash`, `_price`, `_contenthash`)
     * @notice Registers to sell a sticker pack
     * @param _price cost in wei to users minting this pack
     * @param _donate value between 0-10000 representing percentage of `_price` that is donated to StickerMarket at every buy
     * @param _category listing category
     * @param _owner address of the beneficiary of buys
     * @param _contenthash EIP1577 pack contenthash for listings
     * @param _fee Fee msg.sender agrees to pay for this registration
     * @return packId Market position of Sticker Pack data.
     */
    function registerPack(
        uint256 _price,
        uint256 _donate,
        bytes4[] calldata _category,
        address _owner,
        bytes calldata _contenthash,
        uint256 _fee
    )
        external
        returns(uint256 packId);

}
/**
 * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
 * @notice interface for StickerMarket
 */
function buyToken(
    uint256 _packId,
    address _destination,
    uint256 _price
)
    external
    returns (uint256 tokenId);

/**
 * @dev Mints NFT StickerPack in `_destination` account, and Transfers SNT using user allowance
 * emit NonfungibleToken.Transfer(`address(0)`, `_destination`, `tokenId`)
 * @notice buy a pack from market pack owner, including a StickerPack's token in `_destination` account with same metadata of `_packId`
 * @param _packId id of market pack
 * @param _destination owner of token being brought
 * @param _price agreed price
 * @return tokenId generated StickerPack token
 */