def create_inquirer(data_directory, should_mock_current_price_queries, mocked_prices) -> Inquirer: # Since this is a singleton and we want it initialized everytime the fixture # is called make sure its instance is always starting from scratch Inquirer._Inquirer__instance = None # type: ignore # Get a cryptocompare without a DB since invoking DB fixture here causes problems # of existing user for some tests cryptocompare = Cryptocompare(data_directory=data_directory, database=None) gecko = Coingecko(data_directory=data_directory) inquirer = Inquirer(data_dir=data_directory, cryptocompare=cryptocompare, coingecko=gecko) if not should_mock_current_price_queries: return inquirer def mock_find_usd_price(asset): # pylint: disable=unused-argument return mocked_prices.get(asset, FVal('1.5')) inquirer.find_usd_price = mock_find_usd_price # type: ignore def mock_query_fiat_pair(base, quote): # pylint: disable=unused-argument return FVal(1) inquirer.query_fiat_pair = mock_query_fiat_pair # type: ignore return inquirer
def test_coingecko_identifiers_are_reachable(data_dir): """ Test that all assets have a coingecko entry and that all the identifiers exist in coingecko """ coingecko = Coingecko(data_directory=data_dir) all_coins = coingecko.all_coins() for asset_data in GlobalDBHandler().get_all_asset_data(mapping=False): identifier = asset_data.identifier if identifier in DELISTED_ASSETS: # delisted assets won't be in the mapping continue if asset_data.asset_type == AssetType.FIAT: continue found = True coingecko_str = asset_data.coingecko msg = f'Asset {identifier} does not have a coingecko entry' assert coingecko_str is not None, msg if coingecko_str != '': found = False for entry in all_coins: if coingecko_str == entry['id']: found = True break suggestions = [] if not found: for entry in all_coins: if entry['symbol'].upper() == asset_data.symbol.upper(): suggestions.append( (entry['id'], entry['name'], entry['symbol'])) continue if entry['name'].upper() == asset_data.symbol.upper(): suggestions.append( (entry['id'], entry['name'], entry['symbol'])) continue msg = f'Asset {identifier} coingecko mapping does not exist.' if len(suggestions) != 0: for s in suggestions: msg += f'\nSuggestion: id:{s[0]} name:{s[1]} symbol:{s[2]}' if not found: test_warnings.warn(UserWarning(msg))
def __init__(self, args: argparse.Namespace) -> None: """Initialize the Rotkehlchen object May Raise: - SystemPermissionError if the given data directory's permissions are not correct. """ self.lock = Semaphore() self.lock.acquire() # Can also be None after unlock if premium credentials did not # authenticate or premium server temporarily offline self.premium: Optional[Premium] = None self.user_is_logged_in: bool = False configure_logging(args) self.sleep_secs = args.sleep_secs if args.data_dir is None: self.data_dir = default_data_directory() else: self.data_dir = Path(args.data_dir) if not os.access(self.data_dir, os.W_OK | os.R_OK): raise SystemPermissionError( f'The given data directory {self.data_dir} is not readable or writable', ) self.args = args self.msg_aggregator = MessagesAggregator() self.greenlet_manager = GreenletManager(msg_aggregator=self.msg_aggregator) self.exchange_manager = ExchangeManager(msg_aggregator=self.msg_aggregator) # Initialize the AssetResolver singleton AssetResolver(data_directory=self.data_dir) self.data = DataHandler(self.data_dir, self.msg_aggregator) self.cryptocompare = Cryptocompare(data_directory=self.data_dir, database=None) self.coingecko = Coingecko() self.icon_manager = IconManager(data_dir=self.data_dir, coingecko=self.coingecko) self.greenlet_manager.spawn_and_track( after_seconds=None, task_name='periodically_query_icons_until_all_cached', method=self.icon_manager.periodically_query_icons_until_all_cached, batch_size=ICONS_BATCH_SIZE, sleep_time_secs=ICONS_QUERY_SLEEP, ) # Initialize the Inquirer singleton Inquirer( data_dir=self.data_dir, cryptocompare=self.cryptocompare, coingecko=self.coingecko, ) # Keeps how many trades we have found per location. Used for free user limiting self.actions_per_location: Dict[str, Dict[Location, int]] = { 'trade': defaultdict(int), 'asset_movement': defaultdict(int), } self.lock.release() self.shutdown_event = gevent.event.Event()
def __init__(self, args: argparse.Namespace) -> None: """Initialize the Rotkehlchen object This runs during backend initialization so it should be as light as possible. May Raise: - SystemPermissionError if the given data directory's permissions are not correct. """ # Can also be None after unlock if premium credentials did not # authenticate or premium server temporarily offline self.premium: Optional[Premium] = None self.user_is_logged_in: bool = False configure_logging(args) self.sleep_secs = args.sleep_secs if args.data_dir is None: self.data_dir = default_data_directory() else: self.data_dir = Path(args.data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) if not os.access(self.data_dir, os.W_OK | os.R_OK): raise SystemPermissionError( f'The given data directory {self.data_dir} is not readable or writable', ) self.main_loop_spawned = False self.args = args self.api_task_greenlets: List[gevent.Greenlet] = [] self.msg_aggregator = MessagesAggregator() self.greenlet_manager = GreenletManager( msg_aggregator=self.msg_aggregator) self.exchange_manager = ExchangeManager( msg_aggregator=self.msg_aggregator) # Initialize the GlobalDBHandler singleton. Has to be initialized BEFORE asset resolver GlobalDBHandler(data_dir=self.data_dir) self.data = DataHandler(self.data_dir, self.msg_aggregator) self.cryptocompare = Cryptocompare(data_directory=self.data_dir, database=None) self.coingecko = Coingecko() self.icon_manager = IconManager(data_dir=self.data_dir, coingecko=self.coingecko) self.assets_updater = AssetsUpdater(self.msg_aggregator) # Initialize the Inquirer singleton Inquirer( data_dir=self.data_dir, cryptocompare=self.cryptocompare, coingecko=self.coingecko, ) # Keeps how many trades we have found per location. Used for free user limiting self.actions_per_location: Dict[str, Dict[Location, int]] = { 'trade': defaultdict(int), 'asset_movement': defaultdict(int), } self.task_manager: Optional[TaskManager] = None self.shutdown_event = gevent.event.Event()
def test_coingecko_identifiers_are_reachable(): """ Test that all assets have a coingecko entry and that all the identifiers exist in coingecko """ coins_delisted_from_coingecko = [ 'FLUZ', 'EBCH', 'GOLOS', 'NPER', 'BLN', 'PIX' ] coingecko = Coingecko() all_coins = coingecko.all_coins() for identifier, asset_data in AssetResolver().assets.items(): if identifier in coins_delisted_from_coingecko: # data = coingecko.asset_data(Asset(identifier)) # Figure out if the removed assets can still be queried # for historical prices. If not, then remove their mapping from # all_assets.json and remove them from this tests. continue asset_type = asset_type_mapping[asset_data['type']] if asset_type == AssetType.FIAT: continue coingecko_str = asset_data.get('coingecko', None) msg = f'Asset {identifier} does not have a coingecko entry' assert coingecko_str is not None, msg if coingecko_str != '': found = False for entry in all_coins: if coingecko_str == entry['id']: found = True break suggestions = [] if not found: for entry in all_coins: if entry['symbol'].upper() == asset_data['symbol']: suggestions.append( (entry['id'], entry['name'], entry['symbol'])) msg = f'Asset {identifier} coingecko mapping does not exist.' if len(suggestions) != 0: for s in suggestions: msg += f'\nSuggestion: id:{s[0]} name:{s[1]} symbol:{s[2]}' assert found, msg
def find_coingecko_by_id(identifier: str, coins): for coingecko_entry in coins: if coingecko_entry['id'] == identifier: return coingecko_entry return None root_dir = Path(__file__).resolve().parent.parent.parent ASSETS_FILE = Path(f'{root_dir}/rotkehlchen/data/all_assets.json') with open(ASSETS_FILE, 'r') as f: assets = json.loads(f.read()) data_dir = default_data_directory() coingecko = Coingecko(data_directory=data_dir) COINGECKO_COINS_FILE = data_dir / 'coingecko.json' if COINGECKO_COINS_FILE.exists(): with open(COINGECKO_COINS_FILE, 'r') as f: coingecko_coins = json.loads(f.read()) else: coingecko_coins = coingecko.all_coins() with open(COINGECKO_COINS_FILE, 'w') as f: f.write(rlk_jsondumps(coingecko_coins)) coingecko_add = { 'FTT': 'farmatrust', 'SNX': 'synthetix-network-token', '0xBTC': '0xbitcoin', '1SG': '1sg',
def fixture_session_coingecko(session_data_dir): return Coingecko(data_directory=session_data_dir)
def test_coingecko_identifiers_are_reachable(): """ Test that all assets have a coingecko entry and that all the identifiers exist in coingecko """ coins_delisted_from_coingecko = [ '1SG', 'FLUZ', 'EBCH', 'GOLOS', 'NPER', 'BLN', 'ADN', 'PIX', 'MTC-2', 'LKY', 'ARB', 'BBI', 'BITCAR', 'BTR', 'OLE', 'ROC', 'VIN', 'FIH', 'WIN-2', 'ADH', 'AUR', 'BAS', 'BYC', 'DGS', 'GMT', 'HST', 'INS', 'IPSX', 'SHP', 'WDC', 'BOST', 'FND', 'LDC', 'ORI', 'RIPT', 'SGR', 'LOCUS', 'REDC', 'SGN', 'SOAR', 'YUP', 'AC', 'APIS', 'BITPARK', 'CO2', 'DAN', 'DEC', 'DLT', 'DROP', 'ERD', 'ETBS', 'GEN', 'STP', 'SYNC', 'TBT', 'TNT', 'WIC', 'XCN', 'XTP', 'FREC', 'PTC', 'ACC-3', 'J8T', 'MRK', 'TTV', ] coingecko = Coingecko() all_coins = coingecko.all_coins() for identifier, asset_data in AssetResolver().assets.items(): if identifier in coins_delisted_from_coingecko: # data = coingecko.asset_data(Asset(identifier)) # Figure out if the removed assets can still be queried # for historical prices. If not, then remove their mapping from # all_assets.json and remove them from this tests. continue asset_type = asset_type_mapping[asset_data['type']] if asset_type == AssetType.FIAT: continue found = True coingecko_str = asset_data.get('coingecko', None) msg = f'Asset {identifier} does not have a coingecko entry' assert coingecko_str is not None, msg if coingecko_str != '': found = False for entry in all_coins: if coingecko_str == entry['id']: found = True break suggestions = [] if not found: for entry in all_coins: if entry['symbol'].upper() == asset_data['symbol'].upper(): suggestions.append( (entry['id'], entry['name'], entry['symbol'])) continue if entry['name'].upper() == asset_data['symbol'].upper(): suggestions.append( (entry['id'], entry['name'], entry['symbol'])) continue msg = f'Asset {identifier} coingecko mapping does not exist.' if len(suggestions) != 0: for s in suggestions: msg += f'\nSuggestion: id:{s[0]} name:{s[1]} symbol:{s[2]}' if not found: test_warnings.warn(UserWarning(msg))
def test_coingecko_identifiers_are_reachable(): """ Test that all assets have a coingecko entry and that all the identifiers exist in coingecko """ coingecko = Coingecko() all_coins = coingecko.all_coins() # If coingecko identifier is missing test is trying to suggest possible assets. symbol_checked_exceptions = ( # This is the list of already checked assets # only 300 in coingecko is spartan coin: https://www.coingecko.com/en/coins/spartan ethaddress_to_identifier('0xaEc98A708810414878c3BCDF46Aad31dEd4a4557'), # no arcade city in coingeko. Got other ARC symbol tokens ethaddress_to_identifier('0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5'), # no avalon in coingecko. Got travalala.com ethaddress_to_identifier('0xeD247980396B10169BB1d36f6e278eD16700a60f'), # no Bionic in coingecko. Got Bnoincoin ethaddress_to_identifier('0xEf51c9377FeB29856E61625cAf9390bD0B67eA18'), # no Bitair in coingecko. Got other BTCA symbol tokens ethaddress_to_identifier('0x02725836ebF3eCDb1cDf1c7b02FcbBfaa2736AF8'), # no Bither in coingecko. Got other BTR symbol tokens ethaddress_to_identifier('0xcbf15FB8246F679F9Df0135881CB29a3746f734b'), # no Content and Ad Network in coingecko. Got other CAN symbol tokens ethaddress_to_identifier('0x5f3789907b35DCe5605b00C0bE0a7eCDBFa8A841'), # no DICE money in coingecko. Got other CET symbol tokens ethaddress_to_identifier('0xF660cA1e228e7BE1fA8B4f5583145E31147FB577'), # no Cyberfi in coingecko. Got other CFI symbol tokens ethaddress_to_identifier('0x12FEF5e57bF45873Cd9B62E9DBd7BFb99e32D73e'), # The DAO is not in coingecko. Got other DAO symbol tokens ethaddress_to_identifier('0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413'), # no Earth Token in coingecko. Got other EARTH symbol token and in BSC ethaddress_to_identifier('0x900b4449236a7bb26b286601dD14d2bDe7a6aC6c'), # no iDice in coingecko. Got other ICE symbol token ethaddress_to_identifier('0x5a84969bb663fb64F6d015DcF9F622Aedc796750'), # no InvestFeed token in coingecko. Got other IFT symbol token ethaddress_to_identifier('0x7654915A1b82D6D2D0AFc37c52Af556eA8983c7E'), # no Invacio token in coingecko. Got other INV symbol token ethaddress_to_identifier('0xEcE83617Db208Ad255Ad4f45Daf81E25137535bb'), # no Live Start token in coingecko. Got other LIVE symbol token ethaddress_to_identifier('0x24A77c1F17C547105E14813e517be06b0040aa76'), # no Musiconomi in coingecko. Got other MCI symbol token ethaddress_to_identifier('0x138A8752093F4f9a79AaeDF48d4B9248fab93c9C'), # no Remicoin in coingecko. Got other RMC symbol token ethaddress_to_identifier('0x7Dc4f41294697a7903C4027f6Ac528C5d14cd7eB'), # no Sola token in coingecko. Got other SOL symbol token ethaddress_to_identifier('0x1F54638b7737193FFd86c19Ec51907A7c41755D8'), # no Bitcoin card token in coingecko. Got other VD symbol token ethaddress_to_identifier('0x9a9bB9b4b11BF8eccff84B58a6CCCCD4058A7f0D'), # no Venus Energy token in coingecko. Got other VENUS symbol token ethaddress_to_identifier('0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca'), # no WinToken in coingecko. Got other WIN symbol token ethaddress_to_identifier('0xBfaA8cF522136C6FAfC1D53Fe4b85b4603c765b8'), # no Snowball in coingecko. Got other SNBL symbol token ethaddress_to_identifier('0x198A87b3114143913d4229Fb0f6D4BCb44aa8AFF'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xFD25676Fc2c4421778B18Ec7Ab86E7C5701DF187'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xcca0c9c383076649604eE31b20248BC04FdF61cA'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xAef38fBFBF932D1AeF3B808Bc8fBd8Cd8E1f8BC5'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0x662aBcAd0b7f345AB7FfB1b1fbb9Df7894f18e66'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0x497bAEF294c11a5f0f5Bea3f2AdB3073DB448B56'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xAbdf147870235FcFC34153828c769A70B3FAe01F'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0x4DF47B4969B2911C966506E3592c41389493953b'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xB563300A3BAc79FC09B93b6F84CE0d4465A2AC27'), 'ACC', # no Adcoin in Coingecko. Got other ACC symbol token 'APH', # no Aphelion in Coingecko. Got other APH symbol token 'ARCH', # no ARCH in Coingecko. Got other ARCH symbol token 'BET-2', # no BetaCoin in Coingecko. Got other BET symbol token 'CCN-2', # no CannaCoin in Coingecko. Got other CCN symbol token 'CHAT', # no ChatCoin in Coingecko. Got other CHAT symbol token 'CMT-2', # no Comet in Coingecko. Got other CMT symbol token 'CRC-2', # no CrownCoin in Coingecko. Got other CRC symbol token 'CYC', # no ConspiracyCoin in Coingecko. Got other CYC symbol token 'EDR-2', # no E-Dinar coin in Coingecko. Got other EDR symbol token 'FLAP', # no FlappyCoin coin in Coingecko. Got other FLAP symbol token 'HC-2', # no Harvest Masternode Coin in Coingecko. Got other HC symbol token 'KEY-3', # no KeyCoin Coin in Coingecko. Got other KEY symbol token 'MUSIC', # Music in coingecko is nftmusic and not our MUSIC 'NAUT', # Token suggestion doesn't match token in db 'OCC', # no Octoin Coin in Coingecko. Got other OCC symbol token 'SPA', # no SpainCoin Coin in Coingecko. Got other SPA symbol token 'WEB-2', # no Webchain in Coingecko. Got other WEB symbol token 'WOLF', # no Insanity Coin in Coingecko. Got other WOLF symbol token 'XAI', # Token suggestion doesn't match token in db 'XPB', # no Pebble Coin in Coingecko. Got other XPB symbol token 'XNS', # no Insolar in Coingecko. Got other XNS symbol token 'PIGGY', # Coingecko listed another asset PIGGY that is not Piggy Coin # coingecko listed CAR that is not our token CarBlock.io ethaddress_to_identifier('0x4D9e23a3842fE7Eb7682B9725cF6c507C424A41B'), # coingecko listed newb farm with symbol NEWB that is not our newb ethaddress_to_identifier('0x5A63Eb358a751b76e58325eadD86c2473fC40e87'), # coingecko has BigBang Core (BBC) that is not tradove ethaddress_to_identifier('0xe7D3e4413E29ae35B0893140F4500965c74365e5'), # MNT is Meownaut in coingecko and not media network token ethaddress_to_identifier('0xA9877b1e05D035899131DBd1e403825166D09f92'), # Project quantum in coingecko but we have Qubitica ethaddress_to_identifier('0xCb5ea3c190d8f82DEADF7ce5Af855dDbf33e3962'), # We have Cashbery Coin for symbol CBC that is not listed in the coingecko list 'CBC-2', # We have Air token for symbol AIR. Got another AIR symbol token ethaddress_to_identifier('0x27Dce1eC4d3f72C3E457Cc50354f1F975dDEf488'), # We have Acorn Collective for symbol OAK. Got another OAK symbol token ethaddress_to_identifier('0x5e888B83B7287EED4fB7DA7b7d0A0D4c735d94b3'), # Coingecko has yearn v1 vault yUSD ethaddress_to_identifier('0x0ff3773a6984aD900f7FB23A9acbf07AC3aDFB06'), # Coingecko has yearn v1 vault yUSD (different vault from above but same symbol) ethaddress_to_identifier('0x4B5BfD52124784745c1071dcB244C6688d2533d3'), # Coingecko has Aston Martin Cognizant Fan Token and we have AeroME 'AM', # Coingecko has Swarm (BZZ) and we have SwarmCoin 'SWARM', # Coingecko has aircoin and we have a different airtoken 'AIR-2', # Coingecko has Attlas Token and we have Authorship ethaddress_to_identifier('0x2dAEE1AA61D60A252DC80564499A69802853583A'), # Coingecko has Lever Network and we have Leverj ethaddress_to_identifier('0x0F4CA92660Efad97a9a70CB0fe969c755439772C'), # Coingecko has Twirl Governance Token and we have Target Coin ethaddress_to_identifier('0xAc3Da587eac229C9896D919aBC235CA4Fd7f72c1'), # Coingecko has MyWish and we have another WISH (ethereum addresses don't match) ethaddress_to_identifier('0x1b22C32cD936cB97C28C5690a0695a82Abf688e6'), # Coingecko has DroneFly and we have KlondikeCoin for symbol KDC 'KDC', # Coingecko has CoinStarter and we have Student Coin for symbol STC ethaddress_to_identifier('0x15B543e986b8c34074DFc9901136d9355a537e7E'), # Coingecko has Nano Dogecoin symbol:ndc and we have NEVERDIE ethaddress_to_identifier('0xA54ddC7B3CcE7FC8b1E3Fa0256D0DB80D2c10970'), # Coingecko has olecoin and we have Olive ethaddress_to_identifier('0x9d9223436dDD466FC247e9dbbD20207e640fEf58'), # Coingecko has orica and we have origami ethaddress_to_identifier('0xd2Fa8f92Ea72AbB35dBD6DECa57173d22db2BA49'), # Coingeckop has a different storm token ethaddress_to_identifier('0xD0a4b8946Cb52f0661273bfbC6fD0E0C75Fc6433'), # We have Centra (CTR) but coingecko has creator platform ethaddress_to_identifier('0x96A65609a7B84E8842732DEB08f56C3E21aC6f8a'), # We have Gladius Token (GLA) but coingecko has Galaxy adventure ethaddress_to_identifier('0x71D01dB8d6a2fBEa7f8d434599C237980C234e4C'), # We have reftoken (REF) and coingecko has Ref Finance ethaddress_to_identifier('0x89303500a7Abfb178B274FD89F2469C264951e1f'), # We have Aidus (AID) and coingecko has aidcoin ethaddress_to_identifier('0xD178b20c6007572bD1FD01D205cC20D32B4A6015'), # We have depository network but coingecko has depo ethaddress_to_identifier('0x89cbeAC5E8A13F0Ebb4C74fAdFC69bE81A501106'), # Sinthetic ETH but coingecko has iEthereum ethaddress_to_identifier('0xA9859874e1743A32409f75bB11549892138BBA1E'), # blocklancer but coingecko has Linker ethaddress_to_identifier('0x63e634330A20150DbB61B15648bC73855d6CCF07'), # Kora network but coingecko Knekted ethaddress_to_identifier('0xfF5c25D2F40B47C4a37f989DE933E26562Ef0Ac0'), # gambit but coingecko has another gambit ethaddress_to_identifier('0xF67451Dc8421F0e0afEB52faa8101034ed081Ed9'), # publica but coingecko has another polkalab ethaddress_to_identifier('0x55648De19836338549130B1af587F16beA46F66B'), # Spin protocol but spinada in coingecko ethaddress_to_identifier('0x4F22310C27eF39FEAA4A756027896DC382F0b5E2'), # REBL but another REBL (rebel finance) in coingecko ethaddress_to_identifier('0x5F53f7A8075614b699Baad0bC2c899f4bAd8FBBF'), # Sp8de (SPX) but another SPX in coingecko ethaddress_to_identifier('0x05aAaA829Afa407D83315cDED1d45EB16025910c'), # marginless but another MRS in coingecko ethaddress_to_identifier('0x1254E59712e6e727dC71E0E3121Ae952b2c4c3b6'), # oyster (PRL) but another PRL in coingecko ethaddress_to_identifier('0x1844b21593262668B7248d0f57a220CaaBA46ab9'), # oyster shell but another SHL in coingecko ethaddress_to_identifier('0x8542325B72C6D9fC0aD2Ca965A78435413a915A0'), # dorado but another DOR in coingecko ethaddress_to_identifier('0x906b3f8b7845840188Eab53c3f5AD348A787752f'), ) for asset_data in GlobalDBHandler().get_all_asset_data(mapping=False): identifier = asset_data.identifier if identifier in DELISTED_ASSETS: # delisted assets won't be in the mapping continue if asset_data.asset_type == AssetType.FIAT: continue found = True coingecko_str = asset_data.coingecko have_id = True if coingecko_str is not None or coingecko_str != '': have_id = False found = coingecko_str in all_coins suggestions = [] if not found: for cc_id, entry in all_coins.items(): if entry['symbol'].upper() == asset_data.symbol.upper(): suggestions.append((cc_id, entry['name'], entry['symbol'])) continue if entry['name'].upper() == asset_data.symbol.upper(): suggestions.append((cc_id, entry['name'], entry['symbol'])) continue if have_id is False and (len(suggestions) == 0 or identifier in symbol_checked_exceptions): continue # no coingecko identifier and no suggestion or is in known exception msg = f'Asset {identifier} with symbol {asset_data.symbol} coingecko mapping does not exist.' # noqa: E501 if len(suggestions) != 0: for s in suggestions: msg += f'\nSuggestion: id:{s[0]} name:{s[1]} symbol:{s[2]}' if not found: test_warnings.warn(UserWarning(msg))
import datetime import os from pathlib import Path import datapane as dp import pandas as pd import yfinance as yf from rotkehlchen.assets.utils import symbol_to_asset_or_token from rotkehlchen.externalapis.coingecko import Coingecko from rotkehlchen.globaldb.handler import GlobalDBHandler db = GlobalDBHandler(Path('.')) gc = Coingecko() rows = [] now = datetime.datetime.now() holdings = pd.read_csv("./holdings.csv", parse_dates=['Date']) current_holdings = holdings.iloc[-1] for ETHC_ticker in ('DTSRF', 'ETHC.NE', '2KV.MU'): ticker = yf.Ticker(ETHC_ticker) currency = symbol_to_asset_or_token(ticker.info['currency']) eth_price = float(gc.query_current_price(symbol_to_asset_or_token('ETH'), currency)) mkr_price = float(gc.query_current_price(symbol_to_asset_or_token('MKR'), currency)) usd_price = float(gc.query_current_price(symbol_to_asset_or_token('USDC'), currency)) shares_outstanding = ticker.info['sharesOutstanding'] shares_outstanding = 33_780_000 price = ticker.history(period='5d').iloc[-1].Close
import pandas as pd import yfinance as yf from rotkehlchen.assets.asset import Asset from rotkehlchen.externalapis.coingecko import Coingecko gc = Coingecko() # https://www.microstrategy.com/content/dam/website-assets/collateral/financial-documents\ # /microstrategy-announces-over-1b-in-total-bitcoin-purchases-in-2020.pdf btc_holdings = 70470 # https://www.sec.gov/ix?doc=/Archives/edgar/data/1050446/000119312521025369/d124926d8k.htm btc_holdings = 71079 avg_buy_price_usd = 15964 for ticker_symbol in ('MSTR', 'MIGA.F'): ticker = yf.Ticker(ticker_symbol) currency = Asset(ticker.info['currency']) if currency.symbol == 'USD': usd_price = 1.0 else: usd_price = float(gc.simple_price(Asset('USD'), currency)) btc_price = float(gc.simple_price(Asset('BTC'), currency)) #btc_buy_price = avg_buy_price_usd * usd_price #h1_2020_mean_price = ticker.history(start='2020-01-01', end='2020-06-01', interval='1wk').Close.mean() price = ticker.history(period='5d').iloc[-1].Close
def find_coingecko_by_id(identifier: str, coins): for coingecko_entry in coins: if coingecko_entry['id'] == identifier: return coingecko_entry return None root_dir = Path(__file__).resolve().parent.parent.parent ASSETS_FILE = Path(f'{root_dir}/rotkehlchen/data/all_assets.json') with open(ASSETS_FILE, 'r') as f: assets = json.loads(f.read()) data_dir = default_data_directory() coingecko = Coingecko() COINGECKO_COINS_FILE = data_dir / 'coingecko.json' if COINGECKO_COINS_FILE.exists(): with open(COINGECKO_COINS_FILE, 'r') as f: coingecko_coins = json.loads(f.read()) else: coingecko_coins = coingecko.all_coins() with open(COINGECKO_COINS_FILE, 'w') as f: f.write(rlk_jsondumps(coingecko_coins)) coingecko_add = { 'FTT': 'farmatrust', 'SNX': 'synthetix-network-token', '0xBTC': '0xbitcoin', '1SG': '1sg',
def test_coingecko_identifiers_are_reachable(): """ Test that all assets have a coingecko entry and that all the identifiers exist in coingecko """ coingecko = Coingecko() all_coins = coingecko.all_coins() # If coingecko identifier is missing test is trying to suggest possible assets. symbol_checked_exceptions = ( # This is the list of already checked assets # only 300 in coingecko is spartan coin: https://www.coingecko.com/en/coins/spartan ethaddress_to_identifier('0xaEc98A708810414878c3BCDF46Aad31dEd4a4557'), # no arcade city in coingeko. Got other ARC symbol tokens ethaddress_to_identifier('0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5'), # no avalon in coingecko. Got travalala.com ethaddress_to_identifier('0xeD247980396B10169BB1d36f6e278eD16700a60f'), # no Bionic in coingecko. Got Bnoincoin ethaddress_to_identifier('0xEf51c9377FeB29856E61625cAf9390bD0B67eA18'), # no Bitair in coingecko. Got other BTCA symbol tokens ethaddress_to_identifier('0x02725836ebF3eCDb1cDf1c7b02FcbBfaa2736AF8'), # no Bither in coingecko. Got other BTR symbol tokens ethaddress_to_identifier('0xcbf15FB8246F679F9Df0135881CB29a3746f734b'), # no Content and Ad Network in coingecko. Got other CAN symbol tokens ethaddress_to_identifier('0x5f3789907b35DCe5605b00C0bE0a7eCDBFa8A841'), # no DICE money in coingecko. Got other CET symbol tokens ethaddress_to_identifier('0xF660cA1e228e7BE1fA8B4f5583145E31147FB577'), # no Cyberfi in coingecko. Got other CFI symbol tokens ethaddress_to_identifier('0x12FEF5e57bF45873Cd9B62E9DBd7BFb99e32D73e'), # The DAO is not in coingecko. Got other DAO symbol tokens ethaddress_to_identifier('0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413'), # no Earth Token in coingecko. Got other EARTH symbol token and in BSC ethaddress_to_identifier('0x900b4449236a7bb26b286601dD14d2bDe7a6aC6c'), # no iDice in coingecko. Got other ICE symbol token ethaddress_to_identifier('0x5a84969bb663fb64F6d015DcF9F622Aedc796750'), # no InvestFeed token in coingecko. Got other IFT symbol token ethaddress_to_identifier('0x7654915A1b82D6D2D0AFc37c52Af556eA8983c7E'), # no Invacio token in coingecko. Got other INV symbol token ethaddress_to_identifier('0xEcE83617Db208Ad255Ad4f45Daf81E25137535bb'), # no Live Start token in coingecko. Got other LIVE symbol token ethaddress_to_identifier('0x24A77c1F17C547105E14813e517be06b0040aa76'), # no Musiconomi in coingecko. Got other MCI symbol token ethaddress_to_identifier('0x138A8752093F4f9a79AaeDF48d4B9248fab93c9C'), # no Remicoin in coingecko. Got other RMC symbol token ethaddress_to_identifier('0x7Dc4f41294697a7903C4027f6Ac528C5d14cd7eB'), # no Sola token in coingecko. Got other SOL symbol token ethaddress_to_identifier('0x1F54638b7737193FFd86c19Ec51907A7c41755D8'), # no Bitcoin card token in coingecko. Got other VD symbol token ethaddress_to_identifier('0x9a9bB9b4b11BF8eccff84B58a6CCCCD4058A7f0D'), # no Venus Energy token in coingecko. Got other VENUS symbol token ethaddress_to_identifier('0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca'), # no WinToken in coingecko. Got other WIN symbol token ethaddress_to_identifier('0xBfaA8cF522136C6FAfC1D53Fe4b85b4603c765b8'), # no Snowball in coingecko. Got other SNBL symbol token ethaddress_to_identifier('0x198A87b3114143913d4229Fb0f6D4BCb44aa8AFF'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xFD25676Fc2c4421778B18Ec7Ab86E7C5701DF187'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xcca0c9c383076649604eE31b20248BC04FdF61cA'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xAef38fBFBF932D1AeF3B808Bc8fBd8Cd8E1f8BC5'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0x662aBcAd0b7f345AB7FfB1b1fbb9Df7894f18e66'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0x497bAEF294c11a5f0f5Bea3f2AdB3073DB448B56'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xAbdf147870235FcFC34153828c769A70B3FAe01F'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0x4DF47B4969B2911C966506E3592c41389493953b'), # Token suggestion doesn't match token in db ethaddress_to_identifier('0xB563300A3BAc79FC09B93b6F84CE0d4465A2AC27'), 'ACC', # no Adcoin in Coingecko. Got other ACC symbol token 'APH', # no Aphelion in Coingecko. Got other APH symbol token 'ARCH', # no ARCH in Coingecko. Got other ARCH symbol token 'BET-2', # no BetaCoin in Coingecko. Got other BET symbol token 'CCN-2', # no CannaCoin in Coingecko. Got other CCN symbol token 'CHAT', # no ChatCoin in Coingecko. Got other CHAT symbol token 'CMT-2', # no Comet in Coingecko. Got other CMT symbol token 'CRC-2', # no CrownCoin in Coingecko. Got other CRC symbol token 'CYC', # no ConspiracyCoin in Coingecko. Got other CYC symbol token 'EDR-2', # no E-Dinar coin in Coingecko. Got other EDR symbol token 'FLAP', # no FlappyCoin coin in Coingecko. Got other FLAP symbol token 'HC-2', # no Harvest Masternode Coin in Coingecko. Got other HC symbol token 'KEY-3', # no KeyCoin Coin in Coingecko. Got other KEY symbol token 'MUSIC', # Music in coingecko is nftmusic and not our MUSIC 'NAUT', # Token suggestion doesn't match token in db 'OCC', # no Octoin Coin in Coingecko. Got other OCC symbol token 'SPA', # no SpainCoin Coin in Coingecko. Got other SPA symbol token 'WEB-2', # no Webchain in Coingecko. Got other WEB symbol token 'WOLF', # no Insanity Coin in Coingecko. Got other WOLF symbol token 'XAI', # Token suggestion doesn't match token in db 'XPB', # no Pebble Coin in Coingecko. Got other XPB symbol token 'XNS', # no Insolar in Coingecko. Got other XNS symbol token 'PIGGY', # Coingecko listed another asset PIGGY that is not Piggy Coin # coingecko listed CAR that is not our token CarBlock.io ethaddress_to_identifier('0x4D9e23a3842fE7Eb7682B9725cF6c507C424A41B'), # coingecko listed newb farm with symbol NEWB that is not our newb ethaddress_to_identifier('0x5A63Eb358a751b76e58325eadD86c2473fC40e87'), # coingecko has BigBang Core (BBC) that is not tradove ethaddress_to_identifier('0xe7D3e4413E29ae35B0893140F4500965c74365e5'), # MNT is Meownaut in coingecko and not media network token ethaddress_to_identifier('0xA9877b1e05D035899131DBd1e403825166D09f92'), # Project quantum in coingecko but we have Qubitica ethaddress_to_identifier('0xCb5ea3c190d8f82DEADF7ce5Af855dDbf33e3962'), # We have Cashbery Coin for symbol CBC that is not listed in the coingecko list 'CBC-2', ) for asset_data in GlobalDBHandler().get_all_asset_data(mapping=False): identifier = asset_data.identifier if identifier in DELISTED_ASSETS: # delisted assets won't be in the mapping continue if asset_data.asset_type == AssetType.FIAT: continue found = True coingecko_str = asset_data.coingecko have_id = True if coingecko_str is not None or coingecko_str != '': have_id = False found = False for entry in all_coins: if coingecko_str == entry['id']: found = True break suggestions = [] if not found: for entry in all_coins: if entry['symbol'].upper() == asset_data.symbol.upper(): suggestions.append( (entry['id'], entry['name'], entry['symbol'])) continue if entry['name'].upper() == asset_data.symbol.upper(): suggestions.append( (entry['id'], entry['name'], entry['symbol'])) continue if have_id is False and (len(suggestions) == 0 or identifier in symbol_checked_exceptions): continue # no coingecko identifier and no suggestion or is in known exception msg = f'Asset {identifier} with symbol {asset_data.symbol} coingecko mapping does not exist.' # noqa: E501 if len(suggestions) != 0: for s in suggestions: msg += f'\nSuggestion: id:{s[0]} name:{s[1]} symbol:{s[2]}' if not found: test_warnings.warn(UserWarning(msg))
def __init__(self, data_directory='.'): # pylint: disable=super-init-not-called self.data_directory = Path(data_directory) with open(self.data_directory / 'buchfink.yaml', 'r') as cfg: yaml_config = yaml.load(cfg, Loader=yaml.SafeLoader) self.config = config_schema(yaml_config) self.accounts = accounts_from_config(self.config) # type: List[Account] self._active_eth_address = None # type: Optional[ChecksumEthAddress] self.reports_directory = self.data_directory / "reports" self.trades_directory = self.data_directory / "trades" self.cache_directory = self.data_directory / "cache" self.balances_directory = self.data_directory / "balances" self.annotations_directory = self.data_directory / "annotations" self.user_data_dir = self.data_directory / "user" self.reports_directory.mkdir(exist_ok=True) self.trades_directory.mkdir(exist_ok=True) self.balances_directory.mkdir(exist_ok=True) self.cache_directory.mkdir(exist_ok=True) (self.cache_directory / 'cryptocompare').mkdir(exist_ok=True) (self.cache_directory / 'history').mkdir(exist_ok=True) (self.cache_directory / 'inquirer').mkdir(exist_ok=True) (self.cache_directory / 'coingecko').mkdir(exist_ok=True) self.last_write_ts: Optional[Timestamp] = None self._amm_swaps = [] # type: List[AMMSwap] self._eth_tx = [] # type: List[EthereumTransaction] self._eth_receipts_store = pickledb.load(self.cache_directory / 'receipts.db', False) self.cryptocompare = Cryptocompare(self.cache_directory / 'cryptocompare', self) self.coingecko = Coingecko() self.historian = PriceHistorian( self.cache_directory / 'history', self.cryptocompare, self.coingecko ) self.inquirer = Inquirer(self.cache_directory / 'inquirer', self.cryptocompare, self.coingecko ) self.msg_aggregator = MessagesAggregator() self.greenlet_manager = GreenletManager(msg_aggregator=self.msg_aggregator) # Initialize blockchain querying modules self.etherscan = Etherscan(database=self, msg_aggregator=self.msg_aggregator) GlobalDBHandler._GlobalDBHandler__instance = None self.globaldb = GlobalDBHandler(self.cache_directory) self.asset_resolver = AssetResolver() self.assets_updater = AssetsUpdater(self.msg_aggregator) self.ethereum_manager = EthereumManager( database=self, ethrpc_endpoint=self.get_eth_rpc_endpoint(), etherscan=self.etherscan, msg_aggregator=self.msg_aggregator, greenlet_manager=self.greenlet_manager, connect_at_start=[] ) self.inquirer.inject_ethereum(self.ethereum_manager) self.inquirer.set_oracles_order(self.get_settings().current_price_oracles) self.historian.set_oracles_order(self.get_settings().historical_price_oracles) self.beaconchain = BeaconChain(database=self, msg_aggregator=self.msg_aggregator)
def test_coingecko_identifiers_are_reachable(data_dir): """ Test that all assets have a coingecko entry and that all the identifiers exist in coingecko """ coingecko = Coingecko(data_directory=data_dir) all_coins = coingecko.all_coins() # If coingecko identifier is missing test is trying to suggest possible assets. symbol_checked_exceptions = ( # This is the list of already checked assets # only 300 in coingecko is spartan coin: https://www.coingecko.com/en/coins/spartan ethaddress_to_identifier('0xaEc98A708810414878c3BCDF46Aad31dEd4a4557'), # no arcade city in coingeko. Got other ARC symbol tokens ethaddress_to_identifier('0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5'), # no avalon in coingecko. Got travalala.com ethaddress_to_identifier('0xeD247980396B10169BB1d36f6e278eD16700a60f'), # no Bionic in coingecko. Got Bnoincoin ethaddress_to_identifier('0xEf51c9377FeB29856E61625cAf9390bD0B67eA18'), # no Bitair in coingecko. Got other BTCA symbol tokens ethaddress_to_identifier('0x02725836ebF3eCDb1cDf1c7b02FcbBfaa2736AF8'), # no Bither in coingecko. Got other BTR symbol tokens ethaddress_to_identifier('0xcbf15FB8246F679F9Df0135881CB29a3746f734b'), # no Content and Ad Network in coingecko. Got other CAN symbol tokens ethaddress_to_identifier('0x5f3789907b35DCe5605b00C0bE0a7eCDBFa8A841'), # no DICE money in coingecko. Got other CET symbol tokens ethaddress_to_identifier('0xF660cA1e228e7BE1fA8B4f5583145E31147FB577'), # no Cyberfi in coingecko. Got other CFI symbol tokens ethaddress_to_identifier('0x12FEF5e57bF45873Cd9B62E9DBd7BFb99e32D73e'), # The DAO is not in coingecko. Got other DAO symbol tokens ethaddress_to_identifier('0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413'), # no Earth Token in coingecko. Got other EARTH symbol token and in BSC ethaddress_to_identifier('0x900b4449236a7bb26b286601dD14d2bDe7a6aC6c'), # no iDice in coingecko. Got other ICE symbol token ethaddress_to_identifier('0x5a84969bb663fb64F6d015DcF9F622Aedc796750'), # no InvestFeed token in coingecko. Got other IFT symbol token ethaddress_to_identifier('0x7654915A1b82D6D2D0AFc37c52Af556eA8983c7E'), # no Invacio token in coingecko. Got other INV symbol token ethaddress_to_identifier('0xEcE83617Db208Ad255Ad4f45Daf81E25137535bb'), # no Live Start token in coingecko. Got other LIVE symbol token ethaddress_to_identifier('0x24A77c1F17C547105E14813e517be06b0040aa76'), # no Musiconomi in coingecko. Got other MCI symbol token ethaddress_to_identifier('0x138A8752093F4f9a79AaeDF48d4B9248fab93c9C'), # no Remicoin in coingecko. Got other RMC symbol token ethaddress_to_identifier('0x7Dc4f41294697a7903C4027f6Ac528C5d14cd7eB'), # no Sola token in coingecko. Got other SOL symbol token ethaddress_to_identifier('0x1F54638b7737193FFd86c19Ec51907A7c41755D8'), # no Bitcoin card token in coingecko. Got other VD symbol token ethaddress_to_identifier('0x9a9bB9b4b11BF8eccff84B58a6CCCCD4058A7f0D'), # no Venus Energy token in coingecko. Got other VENUS symbol token ethaddress_to_identifier('0xEbeD4fF9fe34413db8fC8294556BBD1528a4DAca'), # no WinToken in coingecko. Got other WIN symbol token ethaddress_to_identifier('0xBfaA8cF522136C6FAfC1D53Fe4b85b4603c765b8'), # no Snowball in coingecko. Got other SNBL symbol token ethaddress_to_identifier('0x198A87b3114143913d4229Fb0f6D4BCb44aa8AFF'), 'ACC', # no Adcoin in Coingecko. Got other ACC symbol token 'APH', # no Aphelion in Coingecko. Got other APH symbol token 'ARCH', # no ARCH in Coingecko. Got other ARCH symbol token 'BET-2', # no BetaCoin in Coingecko. Got other BET symbol token 'CCN-2', # no CannaCoin in Coingecko. Got other CCN symbol token 'CHAT', # no ChatCoin in Coingecko. Got other CHAT symbol token 'CMT-2', # no Comet in Coingecko. Got other CMT symbol token 'CRC-2', # no CrownCoin in Coingecko. Got other CRC symbol token 'CYC', # no ConspiracyCoin in Coingecko. Got other CYC symbol token 'EDR-2', # no E-Dinar coin in Coingecko. Got other EDR symbol token 'FLAP', # no FlappyCoin coin in Coingecko. Got other FLAP symbol token 'HC-2', # no Harvest Masternode Coin in Coingecko. Got other HC symbol token 'KEY-3', # no KeyCoin Coin in Coingecko. Got other KEY symbol token 'OCC', # no Octoin Coin in Coingecko. Got other OCC symbol token 'SPA', # no SpainCoin Coin in Coingecko. Got other SPA symbol token 'WEB-2', # no Webchain in Coingecko. Got other WEB symbol token 'WOLF', # no Insanity Coin in Coingecko. Got other WOLF symbol token 'XPB', # no Pebble Coin in Coingecko. Got other XPB symbol token 'XNS', # no Insolar in Coingecko. Got other XNS symbol token ) for asset_data in GlobalDBHandler().get_all_asset_data(mapping=False): identifier = asset_data.identifier if identifier in DELISTED_ASSETS: # delisted assets won't be in the mapping continue if asset_data.asset_type == AssetType.FIAT: continue found = True coingecko_str = asset_data.coingecko have_id = True if coingecko_str is not None or coingecko_str != '': have_id = False found = False for entry in all_coins: if coingecko_str == entry['id']: found = True break suggestions = [] if not found: for entry in all_coins: if entry['symbol'].upper() == asset_data.symbol.upper(): suggestions.append((entry['id'], entry['name'], entry['symbol'])) continue if entry['name'].upper() == asset_data.symbol.upper(): suggestions.append((entry['id'], entry['name'], entry['symbol'])) continue if have_id is False and (len(suggestions) == 0 or identifier in symbol_checked_exceptions): continue # no coingecko identifier and no suggestion or is in known exception msg = f'Asset {identifier} with symbol {asset_data.symbol} coingecko mapping does not exist.' # noqa: E501 if len(suggestions) != 0: for s in suggestions: msg += f'\nSuggestion: id:{s[0]} name:{s[1]} symbol:{s[2]}' if not found: test_warnings.warn(UserWarning(msg))
def create_inquirer( data_directory, should_mock_current_price_queries, mocked_prices, current_price_oracles_order, ethereum_manager, ignore_mocked_prices_for=None, ) -> Inquirer: # Since this is a singleton and we want it initialized everytime the fixture # is called make sure its instance is always starting from scratch Inquirer._Inquirer__instance = None # type: ignore # Get a cryptocompare without a DB since invoking DB fixture here causes problems # of existing user for some tests cryptocompare = Cryptocompare(data_directory=data_directory, database=None) gecko = Coingecko() inquirer = Inquirer( data_dir=data_directory, cryptocompare=cryptocompare, coingecko=gecko, ) if ethereum_manager is not None: inquirer.inject_ethereum(ethereum_manager) uniswap_v2_oracle = UniswapV2Oracle(ethereum_manager) uniswap_v3_oracle = UniswapV3Oracle(ethereum_manager) saddle_oracle = SaddleOracle(ethereum_manager) Inquirer().add_defi_oracles( uniswap_v2=uniswap_v2_oracle, uniswap_v3=uniswap_v3_oracle, saddle=saddle_oracle, ) inquirer.set_oracles_order(current_price_oracles_order) if not should_mock_current_price_queries: return inquirer def mock_find_price( from_asset, to_asset, ignore_cache: bool = False, # pylint: disable=unused-argument ): return mocked_prices.get((from_asset, to_asset), FVal('1.5')) def mock_find_usd_price(asset, ignore_cache: bool = False): # pylint: disable=unused-argument return mocked_prices.get(asset, FVal('1.5')) if ignore_mocked_prices_for is None: inquirer.find_price = mock_find_price # type: ignore inquirer.find_usd_price = mock_find_usd_price # type: ignore else: def mock_some_prices(from_asset, to_asset, ignore_cache=False): if from_asset.symbol in ignore_mocked_prices_for: return inquirer.find_price_old(from_asset, to_asset, ignore_cache) return mock_find_price(from_asset, to_asset, ignore_cache) def mock_some_usd_prices(asset, ignore_cache=False): if asset.symbol in ignore_mocked_prices_for: return inquirer.find_usd_price_old(asset, ignore_cache) return mock_find_usd_price(asset, ignore_cache) inquirer.find_price_old = inquirer.find_price # type: ignore inquirer.find_usd_price_old = inquirer.find_usd_price # type: ignore inquirer.find_price = mock_some_prices # type: ignore inquirer.find_usd_price = mock_some_usd_prices # type: ignore def mock_query_fiat_pair(base, quote): # pylint: disable=unused-argument return FVal(1) inquirer._query_fiat_pair = mock_query_fiat_pair # type: ignore return inquirer
def fixture_session_coingecko(): return Coingecko()
def session_coingecko(): return Coingecko()