// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "../libraries/VideoPaymentStorage.sol"; /** * @title IVideoPayment * @dev Interface for VideoPayment contract */ interface IVideoPayment { // Content purchase information structure struct ContentPurchaseInfo { uint256 defaultViewCount; // Default view count (0=unlimited, >0=limited) uint256 viewDuration; // View validity duration in seconds bool isActive; // Whether content is purchasable address[] supportedTokens; // Supported payment tokens (address(0)=native) uint256[] tokenPrices; // Corresponding token prices bool isUnlimitedViewing; // Whether unlimited viewing is allowed } // Custom errors error NotOwner(); error NotAdmin(); error ContractPaused(); error InvalidContent(); error UnsupportedToken(); error InsufficientPayment(); error NoValidPermission(); error ArrayLengthMismatch(); error ZeroAddress(); error InvalidAmount(); error AlreadyPurchased(); // Events - Purchase related event ContentPurchased( address indexed user, uint256 indexed contentId, address paymentToken, uint256 amount, uint256 viewCount, uint256 validUntil ); event BatchPurchased( address indexed user, uint256[] contentIds, address paymentToken, uint256 totalAmount ); event NFTPurchased( address indexed user, uint256 indexed contentId, address nftContract, uint256 tokenId ); // Events - Permission related event ViewConsumed( address indexed user, uint256 indexed contentId, uint256 remainingViews ); event PermissionExpired(address indexed user, uint256 indexed contentId); event ViewCountAdded( address indexed user, uint256 indexed contentId, uint256 addedCount, uint256 totalRemaining ); // Events - Management related event AdminAdded(address indexed admin); event AdminRemoved(address indexed admin); event ContentConfigUpdated(uint256 indexed contentId); event TokenPriceUpdated( uint256 indexed contentId, address indexed token, uint256 price ); event SupportedTokenAdded(address indexed token); event SupportedTokenRemoved(address indexed token); event Paused(); event Unpaused(); // Owner management functions function addAdmin(address admin) external; function removeAdmin(address admin) external; // Content management functions function setContentConfig( uint256 contentId, uint256 nativePrice, uint256 defaultViewCount, uint256 viewDuration, bool isActive ) external; function batchSetContentConfig( uint256[] memory contentIds, uint256[] memory nativePrices, uint256[] memory defaultViewCounts, uint256[] memory viewDurations, bool[] memory isActiveArray ) external; function isContentActive(uint256 contentId) external view returns (bool); // Price management functions function updateTokenPrice( uint256 contentId, address token, uint256 price ) external; function batchUpdateTokenPrice( uint256[] memory contentIds, address token, uint256[] memory prices ) external; // Payment token management functions function addSupportedToken(address token) external; function removeSupportedToken(address token) external; function isSupportedToken(address token) external view returns (bool); // Purchase functions function purchaseContent( uint256 contentId, address paymentToken, uint256 amount ) external payable; function batchPurchase( uint256[] memory contentIds, address paymentToken, uint256 totalAmount ) external payable; function purchaseWithNFT( uint256 contentId, address nftContract, uint256 tokenId ) external; // Permission verification functions function hasViewPermission( address user, uint256 contentId ) external view returns (bool); function getUserPermissions( address user, uint256[] memory contentIds ) external view returns (VideoPaymentStorage.ViewPermission[] memory); function getPermissionDetails( address user, uint256 contentId ) external view returns (VideoPaymentStorage.ViewPermission memory); function consumeView( address user, uint256 contentId ) external returns (bool); function batchConsumeView( address[] memory users, uint256[] memory contentIds ) external returns (bool[] memory); // Emergency control functions function pause() external; function unpause() external; // Content query functions function getContentPurchaseInfo( uint256 contentId ) external view returns (ContentPurchaseInfo memory); // Upgrade functions function version() external view returns (uint256); function migrate() external; }