interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}
function tokensReceived(
    address operator,
    address from,
    address to,
    uint256 amount,
    bytes calldata userData,
    bytes calldata operatorData
) external;

/**
 * @dev Called by an {IERC777} token contract whenever tokens are being
 * moved or created into a registered account (`to`). The type of operation
 * is conveyed by `from` being the zero address or not.
 *
 * This call occurs _after_ the token contract's state is updated, so
 * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
 *
 * This function may revert to prevent the operation from being executed.
 */