From 82e6d372f88c7db529d45119e1130e36f2104793 Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Tue, 18 May 2021 12:55:28 +0200 Subject: [PATCH 1/6] Add the assets table and foreign key relations in user DB --- rotkehlchen/db/schema.py | 57 ++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/rotkehlchen/db/schema.py b/rotkehlchen/db/schema.py index 4fae951a66..7257c9812b 100644 --- a/rotkehlchen/db/schema.py +++ b/rotkehlchen/db/schema.py @@ -142,6 +142,12 @@ INSERT OR IGNORE INTO action_type(type, seq) VALUES ('D', 4); """ +DB_CREATE_ASSETS = """ +CREATE TABLE IF NOT EXISTS assets ( + identifier TEXT NOT NULL PRIMARY KEY +); +""" + DB_CREATE_IGNORED_ACTIONS = """ CREATE TABLE IF NOT EXISTS ignored_actions ( type CHAR(1) NOT NULL DEFAULT('A') REFERENCES action_type(type), @@ -154,9 +160,10 @@ CREATE TABLE IF NOT EXISTS timed_balances ( category CHAR(1) NOT NULL DEFAULT('A') REFERENCES balance_category(category), time INTEGER, - currency VARCHAR[12], + currency TEXT, amount TEXT, usd_value TEXT, + FOREIGN KEY(currency) REFERENCES assets(identifier) ON UPDATE CASCADE, PRIMARY KEY (time, currency, category) ); """ @@ -200,13 +207,15 @@ timestamp INTEGER NOT NULL, tx_hash VARCHAR[66] NOT NULL, log_index INTEGER NOT NULL, - asset1 VARCHAR[12] NOT NULL, + asset1 TEXT NOT NULL, asset1_amount TEXT NOT NULL, asset1_usd_value TEXT NOT NULL, - asset2 VARCHAR[12], + asset2 TEXT, asset2amount_borrowrate_feeamount TEXT, asset2usd_value_accruedinterest_feeusdvalue TEXT, borrow_rate_mode VARCHAR[10], + FOREIGN KEY(asset1) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(asset2) REFERENCES assets(identifier) ON UPDATE CASCADE, PRIMARY KEY (event_type, tx_hash, log_index) ); """ @@ -215,10 +224,10 @@ CREATE TABLE IF NOT EXISTS yearn_vaults_events ( address VARCHAR[42] NOT NULL, event_type VARCHAR[10] NOT NULL, - from_asset VARCHAR[44] NOT NULL, + from_asset TEXT NOT NULL, from_amount TEXT NOT NULL, from_usd_value TEXT NOT NULL, - to_asset VARCHAR[44] NOT NULL, + to_asset TEXT NOT NULL, to_amount TEXT NOT NULL, to_usd_value TEXT NOT NULL, pnl_amount TEXT, @@ -227,6 +236,8 @@ timestamp INTEGER NOT NULL, tx_hash VARCHAR[66] NOT NULL, log_index INTEGER NOT NULL, + FOREIGN KEY(from_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(to_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, PRIMARY KEY (event_type, tx_hash, log_index) ); """ @@ -287,10 +298,11 @@ DB_CREATE_MANUALLY_TRACKED_BALANCES = """ CREATE TABLE IF NOT EXISTS manually_tracked_balances ( - asset VARCHAR[24] NOT NULL, + asset TEXT NOT NULL, label TEXT NOT NULL PRIMARY KEY, amount TEXT, - location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location) + location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location), + FOREIGN KEY(asset) REFERENCES assets(identifier) ON UPDATE CASCADE ); """ @@ -324,9 +336,12 @@ amount TEXT NOT NULL, rate TEXT NOT NULL, fee TEXT, - fee_currency TEXT[10], + fee_currency TEXT, link TEXT, - notes TEXT + notes TEXT, + FOREIGN KEY(base_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(quote_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(fee_currency) REFERENCES assets(identifier) ON UPDATE CASCADE ); """ @@ -337,11 +352,13 @@ open_time INTEGER, close_time INTEGER, profit_loss TEXT, - pl_currency VARCHAR[10], + pl_currency TEXT NOT NULL, fee TEXT, - fee_currency VARCHAR[10], + fee_currency TEXT, link TEXT, - notes TEXT + notes TEXT, + FOREIGN KEY(pl_currency) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(fee_currency) REFERENCES assets(identifier) ON UPDATE CASCADE ); """ @@ -353,11 +370,13 @@ address TEXT, transaction_id TEXT, time INTEGER, - asset VARCHAR[10], + asset TEXT NOT NULL, amount TEXT, - fee_asset VARCHAR[10], + fee_asset TEXT, fee TEXT, - link TEXT + link TEXT, + FOREIGN KEY(asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(fee_asset) REFERENCES assets(identifier) ON UPDATE CASCADE ); """ @@ -372,7 +391,9 @@ rate TEXT, rate_asset TEXT, link TEXT, - notes TEXT + notes TEXT, + FOREIGN KEY(asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(rate_asset) REFERENCES assets(identifier) ON UPDATE CASCADE ); """ @@ -517,6 +538,7 @@ channel_id TEXT, token TEXT, log_index INTEGER, + FOREIGN KEY(token) REFERENCES assets(identifier) ON UPDATE CASCADE, PRIMARY KEY (tx_hash, address, type, log_index) ); """ @@ -603,7 +625,7 @@ DB_SCRIPT_CREATE_TABLES = """ PRAGMA foreign_keys=off; BEGIN TRANSACTION; -{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} +{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} COMMIT; PRAGMA foreign_keys=on; """.format( @@ -611,6 +633,7 @@ DB_CREATE_LOCATION, DB_CREATE_ASSET_MOVEMENT_CATEGORY, DB_CREATE_BALANCE_CATEGORY, + DB_CREATE_ASSETS, DB_CREATE_TIMED_BALANCES, DB_CREATE_TIMED_LOCATION_DATA, DB_CREATE_USER_CREDENTIALS, From f060641c29af109e6175c70794fa3735f5e5bd50 Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Tue, 18 May 2021 12:56:08 +0200 Subject: [PATCH 2/6] Add asset table upgrade in v25->v26 upgrade --- rotkehlchen/db/upgrade_manager.py | 2 +- rotkehlchen/db/upgrades/v25_v26.py | 394 ++++++++++++++++++++++++++++- 2 files changed, 394 insertions(+), 2 deletions(-) diff --git a/rotkehlchen/db/upgrade_manager.py b/rotkehlchen/db/upgrade_manager.py index b7e982c40b..56517ccf93 100644 --- a/rotkehlchen/db/upgrade_manager.py +++ b/rotkehlchen/db/upgrade_manager.py @@ -262,7 +262,7 @@ def _perform_single_upgrade(self, upgrade: UpgradeRecord) -> None: raise DBUpgradeError(error_message) from e # for some upgrades even for success keep the backup of the previous db - if upgrade.from_version == 24: + if upgrade.from_version in (24, 25): shutil.copyfile( tmp_db_path, os.path.join(self.db.user_data_dir, tmp_db_filename), diff --git a/rotkehlchen/db/upgrades/v25_v26.py b/rotkehlchen/db/upgrades/v25_v26.py index 00f425940a..29de7db380 100644 --- a/rotkehlchen/db/upgrades/v25_v26.py +++ b/rotkehlchen/db/upgrades/v25_v26.py @@ -1,5 +1,6 @@ -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Set +from rotkehlchen.globaldb.handler import GlobalDBHandler from rotkehlchen.user_messages import MessagesAggregator if TYPE_CHECKING: @@ -30,6 +31,7 @@ def __init__(self, msg_aggregator: MessagesAggregator) -> None: 'ftx': 'Z', 'rotkehlchen': 'A', } + self.asset_ids: Set[str] = set() def upgrade_user_credentials(self, cursor: 'Cursor') -> None: # get old data @@ -108,6 +110,394 @@ def purge_binanceus(cursor: 'Cursor') -> None: cursor.execute('DELETE FROM trades WHERE location = "S";') cursor.execute('DELETE FROM asset_movements WHERE location = "S";') + def _process_asset_identifiers( + self, + cursor: 'Cursor', + asset_ids: Set[str], + table_name: str, + ) -> bool: + """Processes the given asset id and adds it to the assets table if not there + + If an asset can't be found in the global db False is returned + """ + asset_ids = asset_ids - {None} # remove empty identifiers + if asset_ids.issubset(self.asset_ids): + return True + + globaldb = GlobalDBHandler() + + for asset_id in asset_ids: + if asset_id in self.asset_ids: + continue + + data = globaldb.get_asset_data(identifier=asset_id, form_with_incomplete_data=True) + if data is None: + self.msg_aggregator.add_warning( + f'During v25 -> v26 DB upgrade found {table_name} entry of unknown asset ' + f'{asset_id}. This will not be in the upgraded DB.', + ) + return False + + cursor.execute('INSERT OR IGNORE INTO assets(identifier) VALUES(?);', (asset_id,)) + globaldb_conn = globaldb._conn + globaldb_cursor = globaldb_conn.cursor() + globaldb_cursor.execute( + 'INSERT OR IGNORE INTO user_owned_assets(asset_id) VALUES(?)', + (asset_id,), + ) + globaldb_conn.commit() + return True + + def upgrade_timed_balances(self, cursor: 'Cursor') -> None: + query = cursor.execute( + 'SELECT category, time, currency, amount, usd_value FROM timed_balances;', + ) + old_tuples = query.fetchall() + cursor.execute('DROP TABLE IF EXISTS timed_balances;') + new_tuples = [] + for entry in old_tuples: + should_write = self._process_asset_identifiers( + cursor=cursor, + asset_ids={entry[2]}, + table_name='timed_balances', + ) + if not should_write: + continue + + new_tuples.append(entry) + + # create the new table and insert all values into it + cursor.execute(""" + CREATE TABLE IF NOT EXISTS timed_balances ( + category CHAR(1) NOT NULL DEFAULT('A') REFERENCES balance_category(category), + time INTEGER, + currency TEXT, + amount TEXT, + usd_value TEXT, + FOREIGN KEY(currency) REFERENCES assets(identifier) ON UPDATE CASCADE, + PRIMARY KEY (time, currency, category) + ); + """) + cursor.executemany( + 'INSERT INTO timed_balances(category, time, currency, amount, usd_value) ' + 'VALUES(?, ?, ?, ?, ?);', + new_tuples, + ) + + def upgrade_manually_tracked_balances(self, cursor: 'Cursor') -> None: + query = cursor.execute( + 'SELECT asset, label, amount, location FROM manually_tracked_balances;', + ) + old_tuples = query.fetchall() + cursor.execute('DROP TABLE IF EXISTS manually_tracked_balances;') + new_tuples = [] + for entry in old_tuples: + should_write = self._process_asset_identifiers( + cursor=cursor, + asset_ids={entry[0]}, + table_name='manually_tracked_balances', + ) + if not should_write: + continue + + new_tuples.append(entry) + + # create the new table and insert all values into it + cursor.execute(""" + CREATE TABLE IF NOT EXISTS manually_tracked_balances ( + asset TEXT NOT NULL, + label TEXT NOT NULL PRIMARY KEY, + amount TEXT, + location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location), + FOREIGN KEY(asset) REFERENCES assets(identifier) ON UPDATE CASCADE + ); + """) + cursor.executemany( + 'INSERT INTO manually_tracked_balances(asset, label, amount, location) ' + 'VALUES(?, ?, ?, ?);', + new_tuples, + ) + + def upgrade_margin_positions(self, cursor: 'Cursor') -> None: + query = cursor.execute( + 'SELECT id, location, open_time, close_time, profit_loss, pl_currency, fee, fee_currency, link, notes FROM margin_positions;', # noqa: E501 + ) + old_tuples = query.fetchall() + cursor.execute('DROP TABLE IF EXISTS margin_positions;') + new_tuples = [] + for entry in old_tuples: + should_write = self._process_asset_identifiers( + cursor=cursor, + asset_ids={entry[5], entry[7]}, + table_name='margin_positions', + ) + if not should_write: + continue + + new_tuples.append(entry) + + # create the new table and insert all values into it + cursor.execute(""" + CREATE TABLE IF NOT EXISTS margin_positions ( + id TEXT PRIMARY KEY, + location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location), + open_time INTEGER, + close_time INTEGER, + profit_loss TEXT, + pl_currency TEXT NOT NULL, + fee TEXT, + fee_currency TEXT, + link TEXT, + notes TEXT, + FOREIGN KEY(pl_currency) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(fee_currency) REFERENCES assets(identifier) ON UPDATE CASCADE + ); + """) + cursor.executemany( + 'INSERT INTO margin_positions(' + 'id, location, open_time, close_time, profit_loss, pl_currency, fee, ' + 'fee_currency, link, notes' + ') VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', + new_tuples, + ) + + def upgrade_asset_movements(self, cursor: 'Cursor') -> None: + query = cursor.execute( + 'SELECT id, location, category, address, transaction_id, time, asset, amount, fee_asset, fee, link FROM asset_movements;', # noqa: E501 + ) + old_tuples = query.fetchall() + cursor.execute('DROP TABLE IF EXISTS asset_movements;') + new_tuples = [] + for entry in old_tuples: + should_write = self._process_asset_identifiers( + cursor=cursor, + asset_ids={entry[6], entry[8]}, + table_name='asset_movements', + ) + if not should_write: + continue + + new_tuples.append(entry) + + # create the new table and insert all values into it + cursor.execute(""" + CREATE TABLE IF NOT EXISTS asset_movements ( + id TEXT PRIMARY KEY, + location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location), + category CHAR(1) NOT NULL DEFAULT('A') REFERENCES asset_movement_category(category), + address TEXT, + transaction_id TEXT, + time INTEGER, + asset TEXT NOT NULL, + amount TEXT, + fee_asset TEXT, + fee TEXT, + link TEXT, + FOREIGN KEY(asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(fee_asset) REFERENCES assets(identifier) ON UPDATE CASCADE + ); + """) + cursor.executemany( + 'INSERT INTO asset_movements(' + 'id, location, category, address, transaction_id, time, ' + 'asset, amount, fee_asset, fee, link' + ') VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', + new_tuples, + ) + + def upgrade_ledger_actions(self, cursor: 'Cursor') -> None: + query = cursor.execute( + 'SELECT identifier, timestamp, type, location, amount, asset, rate, rate_asset, link, notes FROM ledger_actions;', # noqa: E501 + ) + old_tuples = query.fetchall() + cursor.execute('DROP TABLE IF EXISTS ledger_actions;') + new_tuples = [] + for entry in old_tuples: + should_write = self._process_asset_identifiers( + cursor=cursor, + asset_ids={entry[5], entry[7]}, + table_name='ledger_actions', + ) + if not should_write: + continue + + new_tuples.append(entry) + + # create the new table and insert all values into it + cursor.execute(""" + CREATE TABLE IF NOT EXISTS ledger_actions ( + identifier INTEGER NOT NULL PRIMARY KEY, + timestamp INTEGER NOT NULL, + type CHAR(1) NOT NULL DEFAULT('A') REFERENCES ledger_action_type(type), + location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location), + amount TEXT NOT NULL, + asset TEXT NOT NULL, + rate TEXT, + rate_asset TEXT, + link TEXT, + notes TEXT, + FOREIGN KEY(asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(rate_asset) REFERENCES assets(identifier) ON UPDATE CASCADE + ); + """) + cursor.executemany( + 'INSERT INTO ledger_actions(' + 'identifier, timestamp, type, location, amount, asset, rate, rate_asset, link, notes' + ') VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', + new_tuples, + ) + + def upgrade_trades(self, cursor: 'Cursor') -> None: + query = cursor.execute( + 'SELECT id, time, location, base_asset, quote_asset, type, amount, rate, fee, fee_currency, link, notes FROM trades;', # noqa: E501 + ) + old_tuples = query.fetchall() + cursor.execute('DROP TABLE IF EXISTS trades;') + new_tuples = [] + for entry in old_tuples: + should_write = self._process_asset_identifiers( + cursor=cursor, + asset_ids={entry[3], entry[4], entry[9]}, + table_name='trades', + ) + if not should_write: + continue + + new_tuples.append(entry) + + # create the new table and insert all values into it + cursor.execute(""" + CREATE TABLE IF NOT EXISTS trades ( + id TEXT PRIMARY KEY NOT NULL, + time INTEGER NOT NULL, + location CHAR(1) NOT NULL DEFAULT('A') REFERENCES location(location), + base_asset TEXT NOT NULL, + quote_asset TEXT NOT NULL, + type CHAR(1) NOT NULL DEFAULT ('A') REFERENCES trade_type(type), + amount TEXT NOT NULL, + rate TEXT NOT NULL, + fee TEXT, + fee_currency TEXT, + link TEXT, + notes TEXT, + FOREIGN KEY(base_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(quote_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(fee_currency) REFERENCES assets(identifier) ON UPDATE CASCADE + ); + """) + cursor.executemany( + 'INSERT INTO trades(' + 'id, time, location, base_asset, quote_asset, type, ' + 'amount, rate, fee, fee_currency, link, notes' + ') VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', + new_tuples, + ) + + def introduce_assets_table(self, cursor: 'Cursor') -> None: + """ + Does the migration to the assets table. + https://github.com/rotki/rotki/issues/2906 + This is a table containing all assets owned by the user and creates foreign + key relations from all other tables to it. + + Tables containing asset identifiers. [X] -> should not be deleted and repulled + + - adex_events + - aave_events + - yearn_vaults_events + - ethereum_accounts_details + - timed_balances [X] + - manually_tracked_balances [X] + - margin_positions [X] + - asset_movements [X] + - ledger_actions [X] + - trades [X] + + Tables that are not touched due to the unknown token construct: + - amm_swaps + - uniswap_events + - balancer pools + + -> Remember to also clear relevant used_query_ranges for the deleted tables + """ + # First just drop and recreate tables that can easily be repulled + cursor.execute('DROP TABLE IF EXISTS adex_events;') + cursor.execute('DELETE FROM used_query_ranges WHERE name LIKE "adex_events%";') + cursor.execute(""" + CREATE TABLE IF NOT EXISTS adex_events ( + tx_hash VARCHAR[42] NOT NULL, + address VARCHAR[42] NOT NULL, + identity_address VARCHAR[42] NOT NULL, + timestamp INTEGER NOT NULL, + type TEXT NOT NULL, + pool_id TEXT NOT NULL, + amount TEXT NOT NULL, + usd_value TEXT NOT NULL, + bond_id TEXT, + nonce INT, + slashed_at INTEGER, + unlock_at INTEGER, + channel_id TEXT, + token TEXT, + log_index INTEGER, + FOREIGN KEY(token) REFERENCES assets(identifier) ON UPDATE CASCADE, + PRIMARY KEY (tx_hash, address, type, log_index) + ); + """) + cursor.execute('DROP TABLE IF EXISTS aave_events;') + cursor.execute('DELETE FROM used_query_ranges WHERE name LIKE "aave_events%";') + cursor.execute(""" + CREATE TABLE IF NOT EXISTS aave_events ( + address VARCHAR[42] NOT NULL, + event_type VARCHAR[10] NOT NULL, + block_number INTEGER NOT NULL, + timestamp INTEGER NOT NULL, + tx_hash VARCHAR[66] NOT NULL, + log_index INTEGER NOT NULL, + asset1 TEXT NOT NULL, + asset1_amount TEXT NOT NULL, + asset1_usd_value TEXT NOT NULL, + asset2 TEXT, + asset2amount_borrowrate_feeamount TEXT, + asset2usd_value_accruedinterest_feeusdvalue TEXT, + borrow_rate_mode VARCHAR[10], + FOREIGN KEY(asset1) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(asset2) REFERENCES assets(identifier) ON UPDATE CASCADE, + PRIMARY KEY (event_type, tx_hash, log_index) + ); + """) + cursor.execute('DROP TABLE IF EXISTS yearn_vaults_events;') + cursor.execute('DELETE FROM used_query_ranges WHERE name LIKE "yearn_vaults_events%";') + cursor.execute(""" + CREATE TABLE IF NOT EXISTS yearn_vaults_events ( + address VARCHAR[42] NOT NULL, + event_type VARCHAR[10] NOT NULL, + from_asset TEXT NOT NULL, + from_amount TEXT NOT NULL, + from_usd_value TEXT NOT NULL, + to_asset TEXT NOT NULL, + to_amount TEXT NOT NULL, + to_usd_value TEXT NOT NULL, + pnl_amount TEXT, + pnl_usd_value TEXT, + block_number INTEGER NOT NULL, + timestamp INTEGER NOT NULL, + tx_hash VARCHAR[66] NOT NULL, + log_index INTEGER NOT NULL, + FOREIGN KEY(from_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + FOREIGN KEY(to_asset) REFERENCES assets(identifier) ON UPDATE CASCADE, + PRIMARY KEY (event_type, tx_hash, log_index) + ); + """) + cursor.execute('DELETE FROM ethereum_accounts_details;') + + self.upgrade_timed_balances(cursor) + self.upgrade_manually_tracked_balances(cursor) + self.upgrade_margin_positions(cursor) + self.upgrade_asset_movements(cursor) + self.upgrade_ledger_actions(cursor) + self.upgrade_trades(cursor) + def upgrade_v25_to_v26(db: 'DBHandler') -> None: """Upgrades the DB from v25 to v26 @@ -121,6 +511,7 @@ def upgrade_v25_to_v26(db: 'DBHandler') -> None: For that reason we need to purge used query ranges and data of binance_us - Delete the unused anonymized logs setting from the DB + - Introduce assets table and foreign key relationships for assets """ helper = V25V26UpgradeHelper(db.msg_aggregator) cursor = db.conn.cursor() @@ -128,5 +519,6 @@ def upgrade_v25_to_v26(db: 'DBHandler') -> None: helper.migrate_kraken_account_type(cursor) helper.purge_binanceus(cursor) cursor.execute('DELETE from settings WHERE name="anonymized_logs";') + helper.introduce_assets_table(cursor) del helper db.conn.commit() From 12217d867e9bbc91ee60514f80f5365740f8fe8e Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Tue, 18 May 2021 23:18:18 +0200 Subject: [PATCH 3/6] Read all assets from global DB into user DB during upgrade --- rotkehlchen/db/upgrades/v25_v26.py | 39 +++++++++++++----------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/rotkehlchen/db/upgrades/v25_v26.py b/rotkehlchen/db/upgrades/v25_v26.py index 29de7db380..d0388e1ca6 100644 --- a/rotkehlchen/db/upgrades/v25_v26.py +++ b/rotkehlchen/db/upgrades/v25_v26.py @@ -31,7 +31,11 @@ def __init__(self, msg_aggregator: MessagesAggregator) -> None: 'ftx': 'Z', 'rotkehlchen': 'A', } - self.asset_ids: Set[str] = set() + globaldb = GlobalDBHandler() + globaldb_conn = globaldb._conn + globaldb_cursor = globaldb_conn.cursor() + query = globaldb_cursor.execute('SELECT identifier from assets;') + self.all_asset_ids = {x[0] for x in query} def upgrade_user_credentials(self, cursor: 'Cursor') -> None: # get old data @@ -116,36 +120,22 @@ def _process_asset_identifiers( asset_ids: Set[str], table_name: str, ) -> bool: - """Processes the given asset id and adds it to the assets table if not there + """Processes the given asset ids of an entry and determines if the entry can be used. - If an asset can't be found in the global db False is returned + If an asset can't be found in the global db False is returned and warning logged. """ asset_ids = asset_ids - {None} # remove empty identifiers - if asset_ids.issubset(self.asset_ids): + if asset_ids.issubset(self.all_asset_ids): return True - globaldb = GlobalDBHandler() - for asset_id in asset_ids: - if asset_id in self.asset_ids: - continue - - data = globaldb.get_asset_data(identifier=asset_id, form_with_incomplete_data=True) - if data is None: + if asset_id not in self.all_asset_ids: self.msg_aggregator.add_warning( f'During v25 -> v26 DB upgrade found {table_name} entry of unknown asset ' f'{asset_id}. This will not be in the upgraded DB.', ) - return False - - cursor.execute('INSERT OR IGNORE INTO assets(identifier) VALUES(?);', (asset_id,)) - globaldb_conn = globaldb._conn - globaldb_cursor = globaldb_conn.cursor() - globaldb_cursor.execute( - 'INSERT OR IGNORE INTO user_owned_assets(asset_id) VALUES(?)', - (asset_id,), - ) - globaldb_conn.commit() + return False + return True def upgrade_timed_balances(self, cursor: 'Cursor') -> None: @@ -420,7 +410,12 @@ def introduce_assets_table(self, cursor: 'Cursor') -> None: -> Remember to also clear relevant used_query_ranges for the deleted tables """ - # First just drop and recreate tables that can easily be repulled + # First populate all assets table with all identifiers of the global db assets + cursor.executemany( + 'INSERT OR IGNORE INTO assets(identifier) VALUES(?);', + [(x,) for x in self.all_asset_ids], + ) + # Then just drop and recreate tables that can easily be repulled cursor.execute('DROP TABLE IF EXISTS adex_events;') cursor.execute('DELETE FROM used_query_ranges WHERE name LIKE "adex_events%";') cursor.execute(""" From 509f7a67016460f35d17376c4dc4a0d4eae529fc Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Wed, 19 May 2021 10:36:56 +0200 Subject: [PATCH 4/6] Add/delete assets from user assets table when needed --- rotkehlchen/api/rest.py | 19 ++++++++++++------- rotkehlchen/db/dbhandler.py | 30 ++++++++++++++++++++++++++++++ rotkehlchen/db/upgrades/v25_v26.py | 7 ------- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/rotkehlchen/api/rest.py b/rotkehlchen/api/rest.py index a318eb6e2a..b29cefafee 100644 --- a/rotkehlchen/api/rest.py +++ b/rotkehlchen/api/rest.py @@ -48,7 +48,7 @@ from rotkehlchen.chain.ethereum.typing import CustomEthereumToken from rotkehlchen.constants.assets import A_ETH from rotkehlchen.constants.misc import ZERO -from rotkehlchen.constants.resolver import ETHEREUM_DIRECTIVE +from rotkehlchen.constants.resolver import ETHEREUM_DIRECTIVE, ethaddress_to_identifier from rotkehlchen.db.ledger_actions import DBLedgerActions from rotkehlchen.db.queried_addresses import QueriedAddresses from rotkehlchen.db.settings import ModifiableDBSettings @@ -1311,8 +1311,7 @@ def get_asset_types() -> Response: types = [str(x) for x in AssetType] return api_response(_wrap_in_ok_result(types), status_code=HTTPStatus.OK) - @staticmethod - def add_custom_asset(asset_type: AssetType, **kwargs: Any) -> Response: + def add_custom_asset(self, asset_type: AssetType, **kwargs: Any) -> Response: globaldb = GlobalDBHandler() # There is no good way to figure out if an asset already exists in the DB # Best approximation we can do is this. @@ -1341,6 +1340,7 @@ def add_custom_asset(asset_type: AssetType, **kwargs: Any) -> Response: except InputError as e: return api_response(wrap_in_fail_result(str(e)), status_code=HTTPStatus.CONFLICT) + self.rotkehlchen.data.db.add_asset_identifiers([asset_id]) return api_response( _wrap_in_ok_result({'identifier': asset_id}), status_code=HTTPStatus.OK, @@ -1362,6 +1362,7 @@ def delete_custom_asset(self, identifier: str) -> Response: # Before deleting, also make sure we have up to date global DB owned data self.rotkehlchen.data.db.update_owned_assets_in_globaldb() try: + self.rotkehlchen.data.db.delete_asset_identifier(identifier) GlobalDBHandler().delete_custom_asset(identifier) except InputError as e: return api_response(wrap_in_fail_result(str(e)), status_code=HTTPStatus.CONFLICT) @@ -1391,10 +1392,8 @@ def get_custom_ethereum_tokens(address: Optional[ChecksumEthAddress]) -> Respons log_result=False, ) - @staticmethod - def add_custom_ethereum_token(token: CustomEthereumToken) -> Response: - # TODO: hacky. Clean this up when we allow addition of all assets - identifier = ETHEREUM_DIRECTIVE + token.address + def add_custom_ethereum_token(self, token: CustomEthereumToken) -> Response: + identifier = ethaddress_to_identifier(token.address) try: GlobalDBHandler().add_asset( asset_id=identifier, @@ -1404,6 +1403,7 @@ def add_custom_ethereum_token(token: CustomEthereumToken) -> Response: except InputError as e: return api_response(wrap_in_fail_result(str(e)), status_code=HTTPStatus.CONFLICT) + self.rotkehlchen.data.db.add_asset_identifiers([identifier]) return api_response( _wrap_in_ok_result({'identifier': identifier}), status_code=HTTPStatus.OK, @@ -1428,7 +1428,9 @@ def edit_custom_ethereum_token(token: CustomEthereumToken) -> Response: def delete_custom_ethereum_token(self, address: ChecksumEthAddress) -> Response: # Before deleting, also make sure we have up to date global DB owned data self.rotkehlchen.data.db.update_owned_assets_in_globaldb() + try: + self.rotkehlchen.data.db.delete_asset_identifier(ethaddress_to_identifier(address)) identifier = GlobalDBHandler().delete_ethereum_token(address=address) except InputError as e: return api_response(wrap_in_fail_result(str(e)), status_code=HTTPStatus.CONFLICT) @@ -2959,6 +2961,9 @@ def _perform_assets_updates( return {'result': None, 'message': str(e), 'status_code': HTTPStatus.BAD_GATEWAY} if result is None: + cursor = GlobalDBHandler()._conn.cursor() # after succesfull update add all asset ids + query = cursor.execute('SELECT identifier from assets;') + self.rotkehlchen.data.db.add_asset_identifiers([x[0] for x in query]) return OK_RESULT return { diff --git a/rotkehlchen/db/dbhandler.py b/rotkehlchen/db/dbhandler.py index 0e917a278d..d6700ec101 100644 --- a/rotkehlchen/db/dbhandler.py +++ b/rotkehlchen/db/dbhandler.py @@ -3243,6 +3243,36 @@ def update_owned_assets_in_globaldb(self) -> None: assets = self.query_owned_assets() GlobalDBHandler().add_user_owned_assets(assets) + def add_asset_identifiers(self, asset_identifiers: List[str]) -> None: + """Adds an asset to the user db asset identifier table""" + cursor = self.conn.cursor() + cursor.executemany( + 'INSERT OR IGNORE INTO assets(identifier) VALUES(?);', + [(x,) for x in asset_identifiers], + ) + self.conn.commit() + self.update_last_write() + + def delete_asset_identifier(self, asset_id: str) -> None: + """Deletes an asset identifier from the user db asset identifier table + + May raise: + - InputError if a foreign key error is encountered during deletion + """ + cursor = self.conn.cursor() + try: + cursor.execute( + 'DELETE FROM assets WHERE identifier=?;', + (asset_id,), + ) + except sqlcipher.IntegrityError as e: # pylint: disable=no-member + raise InputError( + f'Failed to delete asset with id {asset_id} from the DB due to {e}', + ) from e + + self.conn.commit() + self.update_last_write() + def get_latest_location_value_distribution(self) -> List[LocationData]: """Gets the latest location data diff --git a/rotkehlchen/db/upgrades/v25_v26.py b/rotkehlchen/db/upgrades/v25_v26.py index d0388e1ca6..2c6714fffa 100644 --- a/rotkehlchen/db/upgrades/v25_v26.py +++ b/rotkehlchen/db/upgrades/v25_v26.py @@ -116,7 +116,6 @@ def purge_binanceus(cursor: 'Cursor') -> None: def _process_asset_identifiers( self, - cursor: 'Cursor', asset_ids: Set[str], table_name: str, ) -> bool: @@ -147,7 +146,6 @@ def upgrade_timed_balances(self, cursor: 'Cursor') -> None: new_tuples = [] for entry in old_tuples: should_write = self._process_asset_identifiers( - cursor=cursor, asset_ids={entry[2]}, table_name='timed_balances', ) @@ -183,7 +181,6 @@ def upgrade_manually_tracked_balances(self, cursor: 'Cursor') -> None: new_tuples = [] for entry in old_tuples: should_write = self._process_asset_identifiers( - cursor=cursor, asset_ids={entry[0]}, table_name='manually_tracked_balances', ) @@ -217,7 +214,6 @@ def upgrade_margin_positions(self, cursor: 'Cursor') -> None: new_tuples = [] for entry in old_tuples: should_write = self._process_asset_identifiers( - cursor=cursor, asset_ids={entry[5], entry[7]}, table_name='margin_positions', ) @@ -260,7 +256,6 @@ def upgrade_asset_movements(self, cursor: 'Cursor') -> None: new_tuples = [] for entry in old_tuples: should_write = self._process_asset_identifiers( - cursor=cursor, asset_ids={entry[6], entry[8]}, table_name='asset_movements', ) @@ -304,7 +299,6 @@ def upgrade_ledger_actions(self, cursor: 'Cursor') -> None: new_tuples = [] for entry in old_tuples: should_write = self._process_asset_identifiers( - cursor=cursor, asset_ids={entry[5], entry[7]}, table_name='ledger_actions', ) @@ -346,7 +340,6 @@ def upgrade_trades(self, cursor: 'Cursor') -> None: new_tuples = [] for entry in old_tuples: should_write = self._process_asset_identifiers( - cursor=cursor, asset_ids={entry[3], entry[4], entry[9]}, table_name='trades', ) From 7ce3247aab001cbf5d08f68f5113862990a959d4 Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Wed, 19 May 2021 20:38:13 +0200 Subject: [PATCH 5/6] Add test for the assets table and foreign keys in v25->v26 ugprade --- rotkehlchen/api/rest.py | 2 +- rotkehlchen/tests/data/v25_rotkehlchen.db | Bin 327680 -> 376832 bytes rotkehlchen/tests/db/test_db_upgrades.py | 187 +++++++++++++++++++++- 3 files changed, 182 insertions(+), 7 deletions(-) diff --git a/rotkehlchen/api/rest.py b/rotkehlchen/api/rest.py index b29cefafee..e81448691c 100644 --- a/rotkehlchen/api/rest.py +++ b/rotkehlchen/api/rest.py @@ -48,7 +48,7 @@ from rotkehlchen.chain.ethereum.typing import CustomEthereumToken from rotkehlchen.constants.assets import A_ETH from rotkehlchen.constants.misc import ZERO -from rotkehlchen.constants.resolver import ETHEREUM_DIRECTIVE, ethaddress_to_identifier +from rotkehlchen.constants.resolver import ethaddress_to_identifier from rotkehlchen.db.ledger_actions import DBLedgerActions from rotkehlchen.db.queried_addresses import QueriedAddresses from rotkehlchen.db.settings import ModifiableDBSettings diff --git a/rotkehlchen/tests/data/v25_rotkehlchen.db b/rotkehlchen/tests/data/v25_rotkehlchen.db index 6ad4a1487db489ea79c9c758f454f8dc2511a931..9e55133b2fcfaf17d839b5dcc8393d2e53203233 100644 GIT binary patch delta 132147 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 NwB-E{3d delta 82607 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%0AR;EEX9lX|{ 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 O(*I(86D$>`a0HMz019>h diff --git a/rotkehlchen/tests/db/test_db_upgrades.py b/rotkehlchen/tests/db/test_db_upgrades.py index 6f405464e0..55a3262119 100644 --- a/rotkehlchen/tests/db/test_db_upgrades.py +++ b/rotkehlchen/tests/db/test_db_upgrades.py @@ -10,6 +10,8 @@ from rotkehlchen.accounting.structures import BalanceType from rotkehlchen.assets.asset import Asset +from rotkehlchen.assets.typing import AssetType +from rotkehlchen.chain.ethereum.typing import CustomEthereumToken from rotkehlchen.data_handler import DataHandler from rotkehlchen.db.dbhandler import DBHandler from rotkehlchen.db.old_create import OLD_DB_SCRIPT_CREATE_TABLES @@ -29,6 +31,7 @@ from rotkehlchen.errors import DBUpgradeError from rotkehlchen.tests.utils.database import mock_dbhandler_update_owned_assets from rotkehlchen.tests.utils.factories import make_ethereum_address +from rotkehlchen.typing import ChecksumEthAddress from rotkehlchen.user_messages import MessagesAggregator creation_patch = patch( @@ -1772,12 +1775,24 @@ def test_upgrade_db_24_to_25(user_data_dir): # pylint: disable=unused-argument @pytest.mark.parametrize('use_clean_caching_directory', [True]) @pytest.mark.parametrize('have_kraken', [True, False]) @pytest.mark.parametrize('have_kraken_setting', [True, False]) -def test_upgrade_db_25_to_26(user_data_dir, have_kraken, have_kraken_setting): # pylint: disable=unused-argument # noqa: E501 +def test_upgrade_db_25_to_26(globaldb, user_data_dir, have_kraken, have_kraken_setting): # pylint: disable=unused-argument # noqa: E501 """Test upgrading the DB from version 25 to version 26""" msg_aggregator = MessagesAggregator() v25_conn = _init_prepared_db(user_data_dir, 'v25_rotkehlchen.db') cursor = v25_conn.cursor() + # make sure the globaldb has a custom token used in the DB + globaldb.add_asset( + asset_id='_ceth_0x48Fb253446873234F2fEBbF9BdeAA72d9d387f94', + asset_type=AssetType.ETHEREUM_TOKEN, + data=CustomEthereumToken( + address=ChecksumEthAddress('0x48Fb253446873234F2fEBbF9BdeAA72d9d387f94'), + decimals=18, + name='foo', + symbol='FOO', + ), + ) + # Checks before migration credentials = cursor.execute( 'SELECT name, api_key, api_secret, passphrase from user_credentials', @@ -1822,7 +1837,8 @@ def test_upgrade_db_25_to_26(user_data_dir, have_kraken, have_kraken_setting): ).fetchone() assert settings == ('anonymized_logs', 'True') - # check trades/assets movements and used query ranges are there + # check all tables are there before the upgrade + assert cursor.execute('SELECT COUNT(*) from timed_balances;').fetchone()[0] == 392 trades_query = cursor.execute( 'SELECT id, time, location, base_asset, quote_asset, type, amount, rate, fee,' 'fee_currency, link, notes from trades ORDER BY time ASC;', @@ -1830,12 +1846,66 @@ def test_upgrade_db_25_to_26(user_data_dir, have_kraken, have_kraken_setting): assert trades_query == [ ('foo1', 1, 'S', 'ETH', 'BTC', 'A', '1', '1', '1', 'ETH', '', ''), ('foo2', 1, 'B', 'ETH', 'BTC', 'A', '1', '1', '1', 'ETH', '', ''), + ('fac279d109466a908119816d2ee7af90fba28f1ae60437bcbfab10e40a62bbc7', 1493227049, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '867.46673624', '0.00114990', '0.00249374', 'BTC', 'l1', None), # noqa: E501 + ('56775b4b80f46d1dfc1b53fc0f6b61573c14142499bfe3a62e3371f7afc166db', 1493228252, 'D', '_ceth_0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c', 'BTC', 'A', '11348.12286689', '0.00008790', '0.00249374', 'BTC', 'l2', None), # noqa: E501 + ('d38687c92fd4b56f7241b38653390a72022709ef8835c289f6d49cc436b8e05a', 1498949799, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '150.00000000', '0.00091705', '0.00034389', 'BTC', 'l3', None), # noqa: E501 + ('cc31283b6e723f4a7364496b349869564b06b4320da3a14d95dcda1801369361', 1498966605, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '1000.00000000', '0.00091409', '0.00228521', 'BTC', 'l4', None), # noqa: E501 + ('c76a42bc8b32407b7444da89cc9f73c22fd6a1bc0055b7d4112e3e59709b2b5b', 1499011364, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '200.00000000', '0.00092401', '0.00046200', 'BTC', 'l5', None), # noqa: E501 + ('18810df423b24bb438360b23b50bd0fc11ed2d3701420651ef716f4840367894', 1499051024, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '120.00000000', '0.00091603', '0.00027480', 'BTC', 'l6', None), # noqa: E501 + ('27bb15dfc1a008c2efa2c5510b30808d8246ab903cf9f950ea7a175f0779925d', 1499675187, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '200.00000000', '0.00091747', '0.00045869', 'BTC', 'l7', None), # noqa: E501 + ('b0c4d1d816fa3448ba1ab1a285a35d71a42ff27d68438626eacecc4bf927ab07', 1499677638, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '1135.00000000', '0.00088101', '0.00249985', 'BTC', 'l8', None), # noqa: E501 + ('6b91fc81d40c121af7397c5f3351547de4bd3f288fe483ace14b7b7922cfcd36', 1500494329, 'D', '_ceth_0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c', 'BTC', 'B', '10490.34064784', '0.00024385', '0.00639521', 'BTC', 'l9', None), # noqa: E501 + ('59ea4f98a815467122d201d737b97f910c8918cfe8f476a74d51a4006ef1aaa8', 1500501003, 'D', '_ceth_0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c', 'BTC', 'B', '857.78221905', '0.00018099', '0.00038812', 'BTC', 'l10', None), # noqa: E501 + ('dc4a8a1dd3ef78b6eae5ee69f24bed73196ba3677150015f80d28a70b963253c', 1501194075, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '510.21713000', '0.00039101', '0.00049875', 'BTC', 'l11', None), # noqa: E501 + ('8ba98869f1398d9d64d974a13bc1e686746c7068b765223a46f886ef9c100722', 1501585385, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '731.28354007', '0.00034101', '0.00062343', 'BTC', 'l12', None), # noqa: E501 + ('6f583c1297a86beadb46e8876db9589bb2ca60c603a4eca77b331611a49cd482', 1599751485, 'A', 'ETH', 'EUR', 'A', '150', '210.15', '0.2', 'EUR', None, None), # noqa: E501 + ('3fc94b6b91de61d98b21bdba9a6e449b3ff25756f34a14d17dcf3979d08c4ee3', 1607172606, 'D', 'MAID', 'BTC', 'B', '15515.00000000', '0.00001299', '0.00040305', 'BTC', 'l13', None), # noqa: E501 + ('ecd64dba4367a42292988abb34ed46b3dda0d48728c629f9727706d198023d6c', 1610915040, 'A', 'ETH', 'EUR', 'A', '5', '0.1', '0.001', '_ceth_0x111111111117dC0aa78b770fA6A738034120C302', 'dsad', 'ads'), # noqa: E501c + ('7aae102d9240f7d5f7f0669d6eefb47f2d1cf5bba462b0cee267719e9272ffde', 1612302374, 'A', '_ceth_0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', 'ETH', 'A', '1', '0.01241', '0', '_ceth_0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', None, None), # noqa: E501 ] asset_movements_query = cursor.execute('SELECT id, location, category, address, transaction_id, time, asset, amount, fee_asset, fee, link from asset_movements ORDER BY time ASC;').fetchall() # noqa: E501 assert asset_movements_query == [ - ('foo1', 'S', 'B', '0xaddy', '0xtxid', 1, 'YFI', '1', 'GNO', '1', 'customlink'), - ('foo2', 'B', 'B', '0xaddy', '0xtxid', 1, 'YFI', '1', 'GNO', '1', 'customlink'), + ('foo1', 'S', 'B', '0xaddy', '0xtxid', 1, 'ETH', '1', 'BTC', '1', 'customlink'), + ('foo2', 'B', 'B', '0xaddy', '0xtxid', 1, 'ETH', '1', '_ceth_0x6B175474E89094C44Da98b954EedeAC495271d0F', '1', 'customlink'), # noqa: E501 + ('822511b6035c5d2a7a7ff82c21b61381016e76764e84f656aedcfbc3b7a2e2f4', 'L', 'B', '0xaddy', '0xtxid', 1, '_ceth_0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e', '1', '_ceth_0x6810e776880C02933D47DB1b9fc05908e5386b96', '1', 'customlink'), # noqa: E501 + ('98c8378892955d3c95cc24277188ad33504d2e668441ba23a270b6c65f00be43', 'D', 'A', '0xaddress', '0xtxid', 1493226738, 'BTC', '2.00000000', 'BTC', '0', 'link3'), # noqa: E501 + ('9713d2c2f90edfc375bfea1d014599e9f3a20eded94625c0a2483c4ab2692ff9', 'D', 'A', '0xaddress', '0xtxid', 1498941726, 'BTC', '4.20000000', 'BTC', '0', 'link2'), # noqa: E501 + ('86f6cda4bcd36e2fd0e8938fd3b31ebe895af2df6d8b60479c401cd846a3ccf8', 'D', 'B', '0xaddress', '0xtxid', 1501161076, 'BTC', '3.91944853', 'BTC', '0.00100000', 'link5'), # noqa: E501 + ('9a3ab62aea2892e9000c868ce29a471e34f57d3bbae7691b920bcf58fbea10ce', 'D', 'A', '0xaddress', '0xtxid', 1577666912, 'MAID', '15515.00000000', 'MAID', '0', 'link1'), # noqa: E501 + ('79d6d91d1fd2acf02a9d244e33ff340c04a938faaf0d1ba10aba9d8ae55b11cc', 'D', 'B', '0xaddress', '0xtxid', 1607094370, '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', '4753.96740631', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', '160.00000000', 'link4'), # noqa: E501 + ] + # Check manually tracked balances before upgrade + query = cursor.execute('SELECT asset, label, amount, location from manually_tracked_balances;') # noqa: E501 + assert query.fetchall() == [ + ('EUR', 'test eur balance', '1', 'A'), + ('USD', 'test usd balance', '1', 'A'), + ('CNY', 'test CNY balance', '1', 'A'), + ('_ceth_0x8Ab7404063Ec4DBcfd4598215992DC3F8EC853d7', 'exotic asset', '1500', 'A'), + ('_ceth_0x111111111117dC0aa78b770fA6A738034120C302', 'test for duplication', '100000', 'J'), # noqa: E501 + ('_ceth_0x48Fb253446873234F2fEBbF9BdeAA72d9d387f94', 'test custom token balance', '65', 'A'), # noqa: E501 + ('_ceth_0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9', 'test_asset_with_same_symbol', '85', 'A'), # noqa: E501 + ('_ceth_0xdb89d55d8878680FED2233ea6E1Ae7DF79C7073e', 'test_custom_token', '25', 'A'), # since this token is not known this won't be here after the upgrade # noqa: E501 + ] + # Check ledger actions before upgrade + query = cursor.execute('SELECT identifier, timestamp, type, location, amount, asset, rate, rate_asset, link, notes from ledger_actions;') # noqa: E501 + assert query.fetchall() == [ + (1, 1611260690, 'A', 'A', '1', '_ceth_0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6', None, None, None, None), # noqa: E501 + (2, 1610483475, 'A', 'A', '1', '_ceth_0xB6eD7644C69416d67B522e20bC294A9a9B405B31', None, None, 'sad', 'asdsad'), # noqa: E501 + ] + # Check margin positions before upgrade + query = cursor.execute('SELECT id, location, open_time, close_time, profit_loss, pl_currency, fee, fee_currency, link, notes from margin_positions;') # noqa: E501 + raw_upgraded = query.fetchall() + assert raw_upgraded == [ + ("3ebd1ff33f6b6431778db56393e6105b94b0b23d0976462d70279e6f82db9924", "C", 1, 5, "500", "ETH", "1", "_ceth_0x6810e776880C02933D47DB1b9fc05908e5386b96", "", ""), # noqa: E501 + ("2ecdf50622f0ad6277b2c4b28954118753db195c9ae2005ce7da7b30d4a873c4", "A", 1, 5, "1", "BTC", "1", "_ceth_0x255Aa6DF07540Cb5d3d297f0D0D4D84cb52bc8e6", "", ""), # noqa: E501 + ("bec34827cd9ce879e91d45dfe11942752f810504439701ff7f3d005850f458a8", "A", 0, 5, "1", "_ceth_0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", "1", "_ceth_0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b", "", ""), # noqa: E501 ] + # Check the tables that are just gonna get deleted have data before the upgrade + assert cursor.execute('SELECT COUNT(*) from adex_events;').fetchone()[0] == 1 + assert cursor.execute('SELECT COUNT(*) from aave_events;').fetchone()[0] == 1 + assert cursor.execute('SELECT COUNT(*) from yearn_vaults_events;').fetchone()[0] == 1 + assert cursor.execute('SELECT COUNT(*) from ethereum_accounts_details;').fetchone()[0] == 1 + # Check used query ranges before upgrade used_query_ranges = cursor.execute('SELECT * from used_query_ranges').fetchall() assert used_query_ranges == [ ('binance_us_trades', 0, 1), @@ -1898,18 +1968,123 @@ def test_upgrade_db_25_to_26(user_data_dir, have_kraken, have_kraken_setting): assert mapping is None # check trades/assets movements and used query ranges of binanceus were purged + # Also check tables were properly migrated and we lost no data trades_query = cursor.execute( 'SELECT id, time, location, base_asset, quote_asset, type, amount, rate, fee,' 'fee_currency, link, notes from trades ORDER BY time ASC;', ).fetchall() - assert trades_query == [('foo2', 1, 'B', 'ETH', 'BTC', 'A', '1', '1', '1', 'ETH', '', '')] + assert trades_query == [ + ('foo2', 1, 'B', 'ETH', 'BTC', 'A', '1', '1', '1', 'ETH', '', ''), + ('fac279d109466a908119816d2ee7af90fba28f1ae60437bcbfab10e40a62bbc7', 1493227049, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '867.46673624', '0.00114990', '0.00249374', 'BTC', 'l1', None), # noqa: E501 + ('56775b4b80f46d1dfc1b53fc0f6b61573c14142499bfe3a62e3371f7afc166db', 1493228252, 'D', '_ceth_0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c', 'BTC', 'A', '11348.12286689', '0.00008790', '0.00249374', 'BTC', 'l2', None), # noqa: E501 + ('d38687c92fd4b56f7241b38653390a72022709ef8835c289f6d49cc436b8e05a', 1498949799, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '150.00000000', '0.00091705', '0.00034389', 'BTC', 'l3', None), # noqa: E501 + ('cc31283b6e723f4a7364496b349869564b06b4320da3a14d95dcda1801369361', 1498966605, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '1000.00000000', '0.00091409', '0.00228521', 'BTC', 'l4', None), # noqa: E501 + ('c76a42bc8b32407b7444da89cc9f73c22fd6a1bc0055b7d4112e3e59709b2b5b', 1499011364, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '200.00000000', '0.00092401', '0.00046200', 'BTC', 'l5', None), # noqa: E501 + ('18810df423b24bb438360b23b50bd0fc11ed2d3701420651ef716f4840367894', 1499051024, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '120.00000000', '0.00091603', '0.00027480', 'BTC', 'l6', None), # noqa: E501 + ('27bb15dfc1a008c2efa2c5510b30808d8246ab903cf9f950ea7a175f0779925d', 1499675187, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '200.00000000', '0.00091747', '0.00045869', 'BTC', 'l7', None), # noqa: E501 + ('b0c4d1d816fa3448ba1ab1a285a35d71a42ff27d68438626eacecc4bf927ab07', 1499677638, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '1135.00000000', '0.00088101', '0.00249985', 'BTC', 'l8', None), # noqa: E501 + ('6b91fc81d40c121af7397c5f3351547de4bd3f288fe483ace14b7b7922cfcd36', 1500494329, 'D', '_ceth_0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c', 'BTC', 'B', '10490.34064784', '0.00024385', '0.00639521', 'BTC', 'l9', None), # noqa: E501 + ('59ea4f98a815467122d201d737b97f910c8918cfe8f476a74d51a4006ef1aaa8', 1500501003, 'D', '_ceth_0x08711D3B02C8758F2FB3ab4e80228418a7F8e39c', 'BTC', 'B', '857.78221905', '0.00018099', '0.00038812', 'BTC', 'l10', None), # noqa: E501 + ('dc4a8a1dd3ef78b6eae5ee69f24bed73196ba3677150015f80d28a70b963253c', 1501194075, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '510.21713000', '0.00039101', '0.00049875', 'BTC', 'l11', None), # noqa: E501 + ('8ba98869f1398d9d64d974a13bc1e686746c7068b765223a46f886ef9c100722', 1501585385, 'D', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', 'BTC', 'A', '731.28354007', '0.00034101', '0.00062343', 'BTC', 'l12', None), # noqa: E501 + ('6f583c1297a86beadb46e8876db9589bb2ca60c603a4eca77b331611a49cd482', 1599751485, 'A', 'ETH', 'EUR', 'A', '150', '210.15', '0.2', 'EUR', None, None), # noqa: E501 + ('3fc94b6b91de61d98b21bdba9a6e449b3ff25756f34a14d17dcf3979d08c4ee3', 1607172606, 'D', 'MAID', 'BTC', 'B', '15515.00000000', '0.00001299', '0.00040305', 'BTC', 'l13', None), # noqa: E501 + ('ecd64dba4367a42292988abb34ed46b3dda0d48728c629f9727706d198023d6c', 1610915040, 'A', 'ETH', 'EUR', 'A', '5', '0.1', '0.001', '_ceth_0x111111111117dC0aa78b770fA6A738034120C302', 'dsad', 'ads'), # noqa: E501c + ('7aae102d9240f7d5f7f0669d6eefb47f2d1cf5bba462b0cee267719e9272ffde', 1612302374, 'A', '_ceth_0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', 'ETH', 'A', '1', '0.01241', '0', '_ceth_0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', None, None), # noqa: E501 + ] asset_movements_query = cursor.execute('SELECT id, location, category, address, transaction_id, time, asset, amount, fee_asset, fee, link from asset_movements ORDER BY time ASC;').fetchall() # noqa: E501 - assert asset_movements_query == [('foo2', 'B', 'B', '0xaddy', '0xtxid', 1, 'YFI', '1', 'GNO', '1', 'customlink')] # noqa: E501 + assert asset_movements_query == [ + ('foo2', 'B', 'B', '0xaddy', '0xtxid', 1, 'ETH', '1', '_ceth_0x6B175474E89094C44Da98b954EedeAC495271d0F', '1', 'customlink'), # noqa: E501 + ('822511b6035c5d2a7a7ff82c21b61381016e76764e84f656aedcfbc3b7a2e2f4', 'L', 'B', '0xaddy', '0xtxid', 1, '_ceth_0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e', '1', '_ceth_0x6810e776880C02933D47DB1b9fc05908e5386b96', '1', 'customlink'), # noqa: E501 + ('98c8378892955d3c95cc24277188ad33504d2e668441ba23a270b6c65f00be43', 'D', 'A', '0xaddress', '0xtxid', 1493226738, 'BTC', '2.00000000', 'BTC', '0', 'link3'), # noqa: E501 + ('9713d2c2f90edfc375bfea1d014599e9f3a20eded94625c0a2483c4ab2692ff9', 'D', 'A', '0xaddress', '0xtxid', 1498941726, 'BTC', '4.20000000', 'BTC', '0', 'link2'), # noqa: E501 + ('86f6cda4bcd36e2fd0e8938fd3b31ebe895af2df6d8b60479c401cd846a3ccf8', 'D', 'B', '0xaddress', '0xtxid', 1501161076, 'BTC', '3.91944853', 'BTC', '0.00100000', 'link5'), # noqa: E501 + ('9a3ab62aea2892e9000c868ce29a471e34f57d3bbae7691b920bcf58fbea10ce', 'D', 'A', '0xaddress', '0xtxid', 1577666912, 'MAID', '15515.00000000', 'MAID', '0', 'link1'), # noqa: E501 + ('79d6d91d1fd2acf02a9d244e33ff340c04a938faaf0d1ba10aba9d8ae55b11cc', 'D', 'B', '0xaddress', '0xtxid', 1607094370, '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', '4753.96740631', '_ceth_0xB9e7F8568e08d5659f5D29C4997173d84CdF2607', '160.00000000', 'link4'), # noqa: E501 + ] # noqa: E501 + query = cursor.execute('SELECT identifier, timestamp, type, location, amount, asset, rate, rate_asset, link, notes from ledger_actions;') # noqa: E501 + assert query.fetchall() == [ + (1, 1611260690, 'A', 'A', '1', '_ceth_0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6', None, None, None, None), # noqa: E501 + (2, 1610483475, 'A', 'A', '1', '_ceth_0xB6eD7644C69416d67B522e20bC294A9a9B405B31', None, None, 'sad', 'asdsad'), # noqa: E501 + ] + # Check manually tracked balances after upgrades + query = cursor.execute('SELECT asset, label, amount, location from manually_tracked_balances;') # noqa: E501 + assert query.fetchall() == [ + ('EUR', 'test eur balance', '1', 'A'), + ('USD', 'test usd balance', '1', 'A'), + ('CNY', 'test CNY balance', '1', 'A'), + ('_ceth_0x8Ab7404063Ec4DBcfd4598215992DC3F8EC853d7', 'exotic asset', '1500', 'A'), + ('_ceth_0x111111111117dC0aa78b770fA6A738034120C302', 'test for duplication', '100000', 'J'), # noqa: E501 + ('_ceth_0x48Fb253446873234F2fEBbF9BdeAA72d9d387f94', 'test custom token balance', '65', 'A'), # noqa: E501 + ('_ceth_0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9', 'test_asset_with_same_symbol', '85', 'A'), # noqa: E501 + ] + # Check margin positions after upgrade + query = cursor.execute('SELECT id, location, open_time, close_time, profit_loss, pl_currency, fee, fee_currency, link, notes from margin_positions;') # noqa: E501 + raw_upgraded = query.fetchall() + assert raw_upgraded == [ + ("3ebd1ff33f6b6431778db56393e6105b94b0b23d0976462d70279e6f82db9924", "C", 1, 5, "500", "ETH", "1", "_ceth_0x6810e776880C02933D47DB1b9fc05908e5386b96", "", ""), # noqa: E501 + ("2ecdf50622f0ad6277b2c4b28954118753db195c9ae2005ce7da7b30d4a873c4", "A", 1, 5, "1", "BTC", "1", "_ceth_0x255Aa6DF07540Cb5d3d297f0D0D4D84cb52bc8e6", "", ""), # noqa: E501 + ("bec34827cd9ce879e91d45dfe11942752f810504439701ff7f3d005850f458a8", "A", 0, 5, "1", "_ceth_0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", "1", "_ceth_0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b", "", ""), # noqa: E501 + ] used_query_ranges = cursor.execute('SELECT * from used_query_ranges').fetchall() assert used_query_ranges == [ ('kraken_trades', 0, 1), ('kraken_asset_movements', 0, 1), ] + # Check the tables that should have had their data deleted had them + assert cursor.execute('SELECT COUNT(*) from adex_events;').fetchone()[0] == 0 + assert cursor.execute('SELECT COUNT(*) from aave_events;').fetchone()[0] == 0 + assert cursor.execute('SELECT COUNT(*) from yearn_vaults_events;').fetchone()[0] == 0 + assert cursor.execute('SELECT COUNT(*) from ethereum_accounts_details;').fetchone()[0] == 0 + # check that the timed balances are still there and are correct. + # 3 balances of unknown tokens should be gone + assert cursor.execute('SELECT COUNT(*) from timed_balances;').fetchone()[0] == 389 + query = cursor.execute('SELECT category, time, currency, amount, usd_value from timed_balances;') # noqa: E501 + for idx, entry in enumerate(query): + # the test DB also has some custom tokens which are not in the globalDB as of this writing + # 1st one is random fake address, 2nd one is vBNT + if entry[2] in ('_ceth_0xdb89d55d8878680FED2233ea6E1Ae7DF79C7073e', '_ceth_0x48Fb253446873234F2fEBbF9BdeAA72d9d387f94'): # noqa: E501 + continue + + # make sure the asset is understood + _ = Asset(entry[2]) + # check some specific entries + if idx == 388: + assert entry == ( + 'A', + 1616766011, + '_ceth_0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9', + '85', + '2909.55', + ) + elif idx == 384: + assert entry == ( + 'A', + 1616766011, + '_ceth_0x8Ab7404063Ec4DBcfd4598215992DC3F8EC853d7', + '1500', + '76.986000', + ) + elif idx == 2: + assert entry == ( + 'A', + 1610559319, + '_ceth_0x6B175474E89094C44Da98b954EedeAC495271d0F', + '90.5639', + '90.54578722', + ) + elif idx == 1: + assert entry == ( + 'A', + 1610559319, + '_ceth_0x4DC3643DbC642b72C158E7F3d2ff232df61cb6CE', + '0.1', + '0.001504', + ) + userdb_assets_num = cursor.execute('SELECT COUNT(*) from assets;').fetchone()[0] + globaldb_cursor = globaldb._conn.cursor() + globaldb_assets_num = globaldb_cursor.execute('SELECT COUNT(*) from assets;').fetchone()[0] + assert globaldb_assets_num == userdb_assets_num # Finally also make sure that we have updated to the target version assert db.get_version() == 26 From 5bda3064511e4514dae0430281ddf9e7d8ffaa96 Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Thu, 20 May 2021 00:02:06 +0200 Subject: [PATCH 6/6] Fix tests after assets identifier in user DB changes --- rotkehlchen/api/rest.py | 6 +++--- rotkehlchen/db/dbhandler.py | 15 ++++++++++++--- rotkehlchen/tests/api/test_custom_assets.py | 9 +++------ .../tests/api/test_custom_ethereum_tokens.py | 11 ++++------- rotkehlchen/tests/db/test_db.py | 11 ++--------- rotkehlchen/tests/db/test_db_upgrades.py | 19 +++++++++++-------- rotkehlchen/tests/utils/database.py | 8 ++++++++ rotkehlchen/tests/utils/premium.py | 9 ++++++--- rotkehlchen/tests/utils/rotkehlchen.py | 8 -------- 9 files changed, 49 insertions(+), 47 deletions(-) diff --git a/rotkehlchen/api/rest.py b/rotkehlchen/api/rest.py index e81448691c..7e449d05c1 100644 --- a/rotkehlchen/api/rest.py +++ b/rotkehlchen/api/rest.py @@ -1311,6 +1311,7 @@ def get_asset_types() -> Response: types = [str(x) for x in AssetType] return api_response(_wrap_in_ok_result(types), status_code=HTTPStatus.OK) + @require_loggedin_user() def add_custom_asset(self, asset_type: AssetType, **kwargs: Any) -> Response: globaldb = GlobalDBHandler() # There is no good way to figure out if an asset already exists in the DB @@ -1392,6 +1393,7 @@ def get_custom_ethereum_tokens(address: Optional[ChecksumEthAddress]) -> Respons log_result=False, ) + @require_loggedin_user() def add_custom_ethereum_token(self, token: CustomEthereumToken) -> Response: identifier = ethaddress_to_identifier(token.address) try: @@ -2961,9 +2963,7 @@ def _perform_assets_updates( return {'result': None, 'message': str(e), 'status_code': HTTPStatus.BAD_GATEWAY} if result is None: - cursor = GlobalDBHandler()._conn.cursor() # after succesfull update add all asset ids - query = cursor.execute('SELECT identifier from assets;') - self.rotkehlchen.data.db.add_asset_identifiers([x[0] for x in query]) + self.rotkehlchen.data.db.add_globaldb_assetids() return OK_RESULT return { diff --git a/rotkehlchen/db/dbhandler.py b/rotkehlchen/db/dbhandler.py index d6700ec101..3c38fdadf1 100644 --- a/rotkehlchen/db/dbhandler.py +++ b/rotkehlchen/db/dbhandler.py @@ -249,6 +249,7 @@ def __init__( if initial_settings is not None: self.set_settings(initial_settings) self.update_owned_assets_in_globaldb() + self.add_globaldb_assetids() def __del__(self) -> None: if hasattr(self, 'conn') and self.conn: @@ -750,8 +751,9 @@ def add_multiple_balances(self, balances: List[DBAssetBalance]) -> None: ) except sqlcipher.IntegrityError: # pylint: disable=no-member self.msg_aggregator.add_warning( - f'Tried to add a timed_balance for {entry.asset.identifier} at' - f' already existing timestamp {entry.time}. Skipping.', + f'Adding timed_balance failed. Either asset with identifier ' + f'{entry.asset.identifier} is not known or an entry for timestamp ' + f'{entry.time} already exists. Skipping.', ) continue self.conn.commit() @@ -3253,6 +3255,12 @@ def add_asset_identifiers(self, asset_identifiers: List[str]) -> None: self.conn.commit() self.update_last_write() + def add_globaldb_assetids(self) -> None: + """Makes sure that all the GlobalDB asset identifiers are mirrored in the user DB""" + cursor = GlobalDBHandler()._conn.cursor() # after succesfull update add all asset ids + query = cursor.execute('SELECT identifier from assets;') + self.add_asset_identifiers([x[0] for x in query]) + def delete_asset_identifier(self, asset_id: str) -> None: """Deletes an asset identifier from the user db asset identifier table @@ -3267,7 +3275,8 @@ def delete_asset_identifier(self, asset_id: str) -> None: ) except sqlcipher.IntegrityError as e: # pylint: disable=no-member raise InputError( - f'Failed to delete asset with id {asset_id} from the DB due to {e}', + f'Failed to delete asset with id {asset_id} from the DB since ' + f'the user owns it now or did some time in the past', ) from e self.conn.commit() diff --git a/rotkehlchen/tests/api/test_custom_assets.py b/rotkehlchen/tests/api/test_custom_assets.py index b003bb5fb6..79b4b8d924 100644 --- a/rotkehlchen/tests/api/test_custom_assets.py +++ b/rotkehlchen/tests/api/test_custom_assets.py @@ -16,7 +16,7 @@ @pytest.mark.parametrize('use_clean_caching_directory', [True]) -@pytest.mark.parametrize('start_with_logged_in_user', [False]) +@pytest.mark.parametrize('start_with_logged_in_user', [True]) def test_adding_custom_assets(rotkehlchen_api_server, globaldb): """Test that the endpoint for adding a custom asset works""" @@ -136,7 +136,7 @@ def test_adding_custom_assets(rotkehlchen_api_server, globaldb): @pytest.mark.parametrize('use_clean_caching_directory', [True]) -@pytest.mark.parametrize('start_with_logged_in_user', [False]) +@pytest.mark.parametrize('start_with_logged_in_user', [True]) def test_editing_custom_assets(rotkehlchen_api_server, globaldb): """Test that the endpoint for editing a custom asset works""" @@ -417,10 +417,7 @@ def test_custom_asset_delete_guard(rotkehlchen_api_server): ), json={'identifier': custom1_id}, ) - expected_msg = ( - 'Tried to delete asset with name "foo token" and symbol "FOO" but its deletion ' - 'would violate a constraint' - ) + expected_msg = 'Failed to delete asset with id' assert_error_response( response=response, contained_in_msg=expected_msg, diff --git a/rotkehlchen/tests/api/test_custom_ethereum_tokens.py b/rotkehlchen/tests/api/test_custom_ethereum_tokens.py index 5c51af0b29..89feecdef8 100644 --- a/rotkehlchen/tests/api/test_custom_ethereum_tokens.py +++ b/rotkehlchen/tests/api/test_custom_ethereum_tokens.py @@ -92,7 +92,7 @@ def test_query_custom_tokens(rotkehlchen_api_server): @pytest.mark.parametrize('use_clean_caching_directory', [True]) -@pytest.mark.parametrize('start_with_logged_in_user', [False]) +@pytest.mark.parametrize('start_with_logged_in_user', [True]) @pytest.mark.parametrize('custom_ethereum_tokens', [INITIAL_TOKENS]) def test_adding_custom_tokens(rotkehlchen_api_server): """Test that the endpoint for adding a custom ethereum token works""" @@ -233,7 +233,7 @@ def test_adding_custom_tokens(rotkehlchen_api_server): @pytest.mark.parametrize('use_clean_caching_directory', [True]) -@pytest.mark.parametrize('start_with_logged_in_user', [False]) +@pytest.mark.parametrize('start_with_logged_in_user', [True]) @pytest.mark.parametrize('custom_ethereum_tokens', [INITIAL_TOKENS]) def test_editing_custom_tokens(rotkehlchen_api_server): """Test that the endpoint for editing a custom ethereum token works""" @@ -348,7 +348,7 @@ def test_deleting_custom_tokens(rotkehlchen_api_server): ) expected_msg = ( f'Tried to delete ethereum token with address {non_existing_address} ' - f'but it was not found in the DB', + f'but it was not found in the DB' ) assert_error_response( response=response, @@ -462,10 +462,7 @@ def test_custom_tokens_delete_guard(rotkehlchen_api_server): ), json={'address': INITIAL_TOKENS[0].address}, ) - expected_msg = ( - f'Tried to delete ethereum token with address {INITIAL_TOKENS[0].address} ' - f'but its deletion would violate a constraint so deletion failed.' - ) + expected_msg = 'Failed to delete asset with id' assert_error_response( response=response, contained_in_msg=expected_msg, diff --git a/rotkehlchen/tests/db/test_db.py b/rotkehlchen/tests/db/test_db.py index a768c0132f..6940bde76f 100644 --- a/rotkehlchen/tests/db/test_db.py +++ b/rotkehlchen/tests/db/test_db.py @@ -86,6 +86,7 @@ from rotkehlchen.utils.serialization import rlk_jsondumps TABLES_AT_INIT = [ + 'assets', 'aave_events', 'yearn_vaults_events', 'timed_balances', @@ -619,13 +620,6 @@ def test_query_owned_assets(data_dir, username): ), ]) data.db.add_multiple_balances(balances) - cursor = data.db.conn.cursor() - cursor.execute( - 'INSERT INTO timed_balances(' - ' time, currency, amount, usd_value, category) ' - ' VALUES(?, ?, ?, ?, ?)', - (1469326500, 'ADSADX', '10.1', '100.5', 'A'), - ) data.db.conn.commit() # also make sure that assets from trades are included @@ -697,8 +691,7 @@ def test_query_owned_assets(data_dir, username): assert set(assets_list) == {A_USD, A_ETH, A_DAI, A_BTC, A_XMR, A_SDC, A_SDT2, A_SUSHI, A_1INCH} # noqa: E501 assert all(isinstance(x, Asset) for x in assets_list) warnings = data.db.msg_aggregator.consume_warnings() - assert len(warnings) == 1 - assert 'Unknown/unsupported asset ADSADX' in warnings[0] + assert len(warnings) == 0 def test_get_latest_location_value_distribution(data_dir, username): diff --git a/rotkehlchen/tests/db/test_db_upgrades.py b/rotkehlchen/tests/db/test_db_upgrades.py index 55a3262119..1efc0be6e3 100644 --- a/rotkehlchen/tests/db/test_db_upgrades.py +++ b/rotkehlchen/tests/db/test_db_upgrades.py @@ -29,7 +29,10 @@ ) from rotkehlchen.db.upgrades.v13_v14 import REMOVED_ASSETS, REMOVED_ETH_TOKENS from rotkehlchen.errors import DBUpgradeError -from rotkehlchen.tests.utils.database import mock_dbhandler_update_owned_assets +from rotkehlchen.tests.utils.database import ( + mock_dbhandler_add_globaldb_assetids, + mock_dbhandler_update_owned_assets, +) from rotkehlchen.tests.utils.factories import make_ethereum_address from rotkehlchen.typing import ChecksumEthAddress from rotkehlchen.user_messages import MessagesAggregator @@ -319,7 +322,7 @@ def test_upgrade_db_1_to_2(data_dir, username): ethereum accounts are now checksummed""" msg_aggregator = MessagesAggregator() data = DataHandler(data_dir, msg_aggregator) - with creation_patch, target_patch(1), mock_dbhandler_update_owned_assets(): + with creation_patch, target_patch(1), mock_dbhandler_update_owned_assets(), mock_dbhandler_add_globaldb_assetids(): # noqa: E501 data.unlock(username, '123', create_new=True) # Manually input a non checksummed account data.db.conn.commit() @@ -348,14 +351,14 @@ def test_upgrade_db_1_to_2(data_dir, username): def test_upgrade_db_2_to_3(user_data_dir): """Test upgrading the DB from version 2 to version 3, rename BCHSV to BSV""" msg_aggregator = MessagesAggregator() - with creation_patch: + with creation_patch, mock_dbhandler_add_globaldb_assetids(): db = _init_db_with_target_version( target_version=2, user_data_dir=user_data_dir, msg_aggregator=msg_aggregator, ) - with mock_dbhandler_update_owned_assets(): + with mock_dbhandler_update_owned_assets(), mock_dbhandler_add_globaldb_assetids(): populate_db_and_check_for_asset_renaming( db=db, user_data_dir=user_data_dir, @@ -372,7 +375,7 @@ def test_upgrade_db_3_to_4(data_dir, username): the eth_rpc_port setting is changed to eth_rpc_endpoint""" msg_aggregator = MessagesAggregator() data = DataHandler(data_dir, msg_aggregator) - with creation_patch, target_patch(3), mock_dbhandler_update_owned_assets(): + with creation_patch, target_patch(3), mock_dbhandler_update_owned_assets(), mock_dbhandler_add_globaldb_assetids(): # noqa: E501 data.unlock(username, '123', create_new=True) # Manually set version and input the old rpcport setting cursor = data.db.conn.cursor() @@ -387,7 +390,7 @@ def test_upgrade_db_3_to_4(data_dir, username): data.db.conn.commit() # now relogin and check that the setting has been changed and the version bumped - with mock_dbhandler_update_owned_assets(): + with mock_dbhandler_update_owned_assets(), mock_dbhandler_add_globaldb_assetids(): del data data = DataHandler(data_dir, msg_aggregator) with target_patch(target_version=4): @@ -409,14 +412,14 @@ def test_upgrade_db_3_to_4(data_dir, username): def test_upgrade_db_4_to_5(user_data_dir): """Test upgrading the DB from version 4 to version 5, rename BCC to BCH""" msg_aggregator = MessagesAggregator() - with creation_patch: + with creation_patch, mock_dbhandler_add_globaldb_assetids(): db = _init_db_with_target_version( target_version=4, user_data_dir=user_data_dir, msg_aggregator=msg_aggregator, ) - with mock_dbhandler_update_owned_assets(): + with mock_dbhandler_update_owned_assets(), mock_dbhandler_add_globaldb_assetids(): populate_db_and_check_for_asset_renaming( db=db, user_data_dir=user_data_dir, diff --git a/rotkehlchen/tests/utils/database.py b/rotkehlchen/tests/utils/database.py index 90f538844f..14d3bbc879 100644 --- a/rotkehlchen/tests/utils/database.py +++ b/rotkehlchen/tests/utils/database.py @@ -98,3 +98,11 @@ def mock_dbhandler_update_owned_assets() -> _patch: 'rotkehlchen.db.dbhandler.DBHandler.update_owned_assets_in_globaldb', lambda x: None, ) + + +def mock_dbhandler_add_globaldb_assetids() -> _patch: + """Just make sure add globalds assetids does nothing for older DB tests""" + return patch( + 'rotkehlchen.db.dbhandler.DBHandler.add_globaldb_assetids', + lambda x: None, + ) diff --git a/rotkehlchen/tests/utils/premium.py b/rotkehlchen/tests/utils/premium.py index f353ef0d4a..3263c80e9b 100644 --- a/rotkehlchen/tests/utils/premium.py +++ b/rotkehlchen/tests/utils/premium.py @@ -15,7 +15,7 @@ from rotkehlchen.tests.utils.mock import MockResponse # Probably invalid remote data but bigger than the test local DB -INVALID_BUT_BIGGER_REMOTE_DATA = base64.b64encode(make_random_b64bytes(16048)).decode() +INVALID_BUT_BIGGER_REMOTE_DATA = base64.b64encode(make_random_b64bytes(86048)).decode() # Remote data containing a different main currency (GBP) REMOTE_DATA = b'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' # noqa: E501 # Remote data containing an older DB version @@ -208,9 +208,12 @@ def assert_db_got_replaced(rotkehlchen_instance: Rotkehlchen, username: str): assert rotkehlchen_instance.data.db.get_main_currency() == A_GBP # Also check a copy of our old DB is kept around. directory = os.path.join(rotkehlchen_instance.data.data_directory, username) - files = [os.path.join(directory, f) for f in os.listdir(directory)] + files = [ + os.path.join(directory, f) for f in os.listdir(directory) + if not f.endswith('backup') or f.startswith('rotkehlchen_db') + ] msg = f'Expected 2 or 3 files in the directory but got {files}' - assert len(files) in (2, 3, 4), msg # 3rd file is the dbinfo.json, 4th v24 DB ackup + assert len(files) in (2, 3), msg # 3rd file is the dbinfo.json # The order of the files is not guaranteed main_db_exists = False backup_db_exists = False diff --git a/rotkehlchen/tests/utils/rotkehlchen.py b/rotkehlchen/tests/utils/rotkehlchen.py index 965606f32a..a2b957e4a5 100644 --- a/rotkehlchen/tests/utils/rotkehlchen.py +++ b/rotkehlchen/tests/utils/rotkehlchen.py @@ -209,14 +209,6 @@ def add_starting_balances(datahandler) -> List[DBAssetBalance]: ), ] datahandler.db.add_multiple_balances(balances) - # Also add an unknown/invalid asset. This will generate a warning - cursor = datahandler.db.conn.cursor() - cursor.execute( - 'INSERT INTO timed_balances(' - ' time, currency, amount, usd_value) ' - ' VALUES(?, ?, ?, ?)', - (1469326500, 'ADSADX', '10.1', '100.5'), - ) datahandler.db.conn.commit() location_data = [