interface IERC1155Tradable {
  /**
   * @dev Creates a new token type and assigns _initialSupply to an address
   * @param _maxSupply max supply allowed
   * @param _initialSupply Optional amount to supply the first owner
   * @param _uri Optional URI for this token type
   * @param _data Optional data to pass if receiver is contract
   * @return tokenId The newly created token ID
   */
  function create(
    uint256 _maxSupply,
    uint256 _initialSupply,
    string calldata _uri,
    bytes calldata _data,
    address _beneficiary,
    uint256 _residualsFee,
    bool _residualsRequired
  ) external returns (uint256 tokenId);

  function mint(
    address _to,
    uint256 _id,
    uint256 _quantity,
    bytes calldata _data
  ) external;
}
/**
 * @title ERC1155Tradable
 * ERC1155Tradable - ERC1155 contract that whitelists an operator address, 
 * has create and mint functionality, and supports useful standards from OpenZeppelin,
 like _exists(), name(), symbol(), and totalSupply()
 */
function create(
  uint256 _maxSupply,
  uint256 _initialSupply,
  string calldata _uri,
  bytes calldata _data,
  address _beneficiary,
  uint256 _residualsFee,
  bool _residualsRequired
) external returns (uint256 tokenId);

/**
 * @dev Creates a new token type and assigns _initialSupply to an address
 * @param _maxSupply max supply allowed
 * @param _initialSupply Optional amount to supply the first owner
 * @param _uri Optional URI for this token type
 * @param _data Optional data to pass if receiver is contract
 * @return tokenId The newly created token ID
 */