def gpg_list_app_keys( blockchain_id, appname, proxy=None, wallet_keys=None, config_dir=None ):
    """
    List the set of available GPG keys tagged for a given application.
    Return list of {'keyName': key name, 'contentUrl': URL to key data}
    Raise on error
    """

    raise Exception("BROKEN; depends on list_mutable_data")

    assert is_valid_appname(appname)

    config_dir = get_config_dir( config_dir )
    client_config_path = os.path.join(config_dir, blockstack_client.CONFIG_FILENAME )

    if proxy is None:
        proxy = blockstack_client.get_default_proxy( config_path=client_config_path )

    key_info = []
    key_prefix = "gpg.%s." % appname

    # immutable data key listing (look for keys that start with 'appname:')
    immutable_listing = list_immutable_data( blockchain_id, proxy=proxy )
    if 'error' in immutable_listing:
        raise Exception("Blockstack error: %s" % immutable_listing['error'])

    for immutable in immutable_listing['data']:
        name = immutable['data_id']
        data_hash = immutable['hash']
        if name.startswith( key_prefix ):
            key_info.append( {
                'keyName': name[len(key_prefix):],
                'contentUrl': make_immutable_data_url( blockchain_id, name, data_hash )
            })

    # mutable data key listing (look for keys that start with 'appname:')
    # TODO: use 'accounts'
    mutable_listing = list_mutable_data( blockchain_id, proxy=proxy, wallet_keys=wallet_keys )
    if 'error' in mutable_listing:
        raise Exception("Blockstack error: %s" % mutable_listing['error'])

    for mutable in mutable_listing['data']:
        name = mutable['data_id']
        version = mutable['version']
        if name.startswith( key_prefix ):
            key_info.append( {
                'keyName': name[len(key_prefix):],
                'contentUrl': make_mutable_data_url( blockchain_id, name, version )
            })

    return key_info