def process_asset( our_data: Dict[str, Dict[str, Any]], asset_symbol: str, paprika_coins_list: List[Dict[str, Any]], paprika: CoinPaprika, cmc_list: Optional[List[Dict[str, Any]]], cryptocompare_coins_map: Dict[str, Any], always_keep_our_time: bool, ) -> Dict[str, Any]: """ Process a single asset symbol. Compare to all external APIs and if there is no local data on the symbol query the user on which data to use for each asset attribute. """ token_address = None our_asset = our_data[asset_symbol] # Coin paprika does not have info on FIAT currencies if asset_symbol in FIAT_CURRENCIES: return our_data found_coin_id = find_paprika_coin_id(asset_symbol, paprika_coins_list) if found_coin_id: print(f'paprika id: {found_coin_id}') paprika_coin_data = paprika.get_coin_by_id(found_coin_id) paprika_token_address = get_paprika_data_eth_token_address( paprika_data=paprika_coin_data, asset_symbol=asset_symbol, ) check_paprika_token_address( paprika_token_address=paprika_token_address, given_token_address=token_address, asset_symbol=asset_symbol, ) else: paprika_coin_data = None cmc_coin_data = find_cmc_coin_data(asset_symbol, cmc_list) our_data = timerange_check( asset_symbol=asset_symbol, our_asset=our_asset, our_data=our_data, paprika_data=paprika_coin_data, cmc_data=cmc_coin_data, always_keep_our_time=always_keep_our_time, token_address=token_address, ) our_data = name_check( asset_symbol=asset_symbol, our_asset=our_asset, our_data=our_data, paprika_data=paprika_coin_data, cmc_data=cmc_coin_data, ) our_data = active_check( asset_symbol=asset_symbol, our_asset=our_asset, our_data=our_data, paprika_data=paprika_coin_data, cmc_data=cmc_coin_data, ) our_data = typeinfo_check( asset_symbol=asset_symbol, our_asset=our_asset, our_data=our_data, paprika_data=paprika_coin_data, cmc_data=cmc_coin_data, ) # add the symbol as an asset attribute in the data symbol = asset_symbol match = re.search('(.*)-\\d+', symbol) # If our key is a numbered key, like 'PAI-2', 'PAI-3' e.t.c. use the # non suffixed symbol, iow just 'PAI' if match: symbol = match.group(1) our_data[asset_symbol]['symbol'] = symbol # Make sure that the asset is also known to cryptocompare cryptocompare_symbol = WORLD_TO_CRYPTOCOMPARE.get(asset_symbol, asset_symbol) cryptocompare_problem = ( asset_symbol not in KNOWN_TO_MISS_FROM_CRYPTOCOMPARE and cryptocompare_symbol not in cryptocompare_coins_map) if cryptocompare_problem: print(f'Asset {asset_symbol} is not in cryptocompare') sys.exit(1) return our_data
def main(): arg_parser = aggregator_args() args = arg_parser.parse_args() msg_aggregator = MessagesAggregator() user_data_dir = Path(default_data_directory()) / args.db_user database = DBHandler( user_data_dir=user_data_dir, password=args.db_password, msg_aggregator=msg_aggregator, ) our_data = AssetResolver().assets paprika = CoinPaprika() cmc = None cmc_list = None root_path = os.path.dirname( os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) data_directory = f'{Path.home()}/.rotkehlchen' if args.cmc_api_key: cmc = Coinmarketcap( data_directory=data_directory, api_key=args.cmc_api_key, ) cmc_list = cmc.get_cryptocyrrency_map() cryptocompare = Cryptocompare(data_directory=data_directory, database=database) paprika_coins_list = paprika.get_coins_list() cryptocompare_coins_map = cryptocompare.all_coins() if args.input_file: if not os.path.isfile(args.input_file): print(f'Given input file {args.input_file} is not a file') sys.exit(1) with open(args.input_file, 'r') as f: input_data = rlk_jsonloads(f.read()) given_symbols = set(input_data.keys()) current_symbols = set(our_data.keys()) if not given_symbols.isdisjoint(current_symbols): print( f'The following given input symbols already exist in the ' f'all_assets.json file {given_symbols.intersection(current_symbols)}', ) sys.exit(1) # If an input file is given, iterate only its assets and perform checks for asset_symbol in input_data.keys(): input_data = process_asset( our_data=input_data, asset_symbol=asset_symbol, paprika_coins_list=paprika_coins_list, paprika=paprika, cmc_list=cmc_list, cryptocompare_coins_map=cryptocompare_coins_map, always_keep_our_time=args.always_keep_our_time, ) # and now combine the two dictionaries to get the final one. Note that no # checks are perfomed for what was in all_assets.json before the script # ran in this case our_data = {**our_data, **input_data} else: # Iterate all of the assets of the all_assets.json file and perform checks for asset_symbol in our_data.keys(): our_data = process_asset( our_data=our_data, asset_symbol=asset_symbol, paprika_coins_list=paprika_coins_list, paprika=paprika, cmc_list=cmc_list, cryptocompare_coins_map=cryptocompare_coins_map, always_keep_our_time=args.always_keep_our_time, ) # Finally overwrite the all_assets.json with the modified assets with open( os.path.join(root_path, 'rotkehlchen', 'data', 'all_assets.json'), 'w') as f: f.write(json.dumps( our_data, sort_keys=True, indent=4, ), )