Passing variables through permalink structure in custom post types

The one issue I see immediately with your rewrite rule is this part:

index.php?pagename=charities

You don’t have a page named “charities”, you have a custom post type, so that should be:

index.php?charities=$matches[1]

assuming your custom post type query var is charities.

HOWEVER, that said, I would not add rewrite rules for this, WordPress will take care of much of the heavy lifting if you use add_rewrite_endpoint instead:

add_rewrite_endpoint( 'contacts', EP_PERMALINK );
add_rewrite_endpoint( 'donation-info', EP_PERMALINK );
add_rewrite_endpoint( 'comments', EP_PERMALINK );

After adding these and flushing rewrites, you will be able to check if the contacts, donation-info, and comments array keys exist in $wp_query->query_vars.