Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dynamic configuration, context and rollback improvements, bugfixes #49

Merged
merged 82 commits into from
Jun 15, 2021
Merged
Changes from 1 commit
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
26d6197
Dexter initial
droserasprout May 19, 2021
cb88d2e
Trader stats for dexter and quipu
droserasprout May 19, 2021
4d99175
Symbol
droserasprout May 19, 2021
78d4cfb
WIP
droserasprout May 20, 2021
c699f03
WIP
droserasprout May 20, 2021
7d5900e
update_totals trigger
droserasprout May 20, 2021
c43692d
Fix typenames
droserasprout May 20, 2021
1f91abb
Fis some bugs, add config generator
droserasprout May 21, 2021
93f87e5
WIP
droserasprout May 24, 2021
3d15242
Merge branch 'master' into feat/quipuswap-dexter
droserasprout May 24, 2021
9d06749
WIP
droserasprout May 24, 2021
798edd8
WIP
droserasprout May 25, 2021
da1d8a4
Revert quipuswap, WIP
droserasprout May 25, 2021
5749714
WIP
droserasprout May 25, 2021
48c2e22
WIP
droserasprout May 25, 2021
03325ff
WIP
droserasprout May 25, 2021
de945a1
WIP
droserasprout May 25, 2021
22b64d1
WIP
droserasprout May 25, 2021
2c51c52
WIP
droserasprout May 25, 2021
8972ce5
WIP
droserasprout May 25, 2021
d2aa1c0
Codegen
droserasprout May 25, 2021
51c62c1
Fix updating summary view
droserasprout May 28, 2021
3f20655
Merge branch 'master' into feat/quipuswap-dexter
droserasprout May 31, 2021
425dd05
Fix divesting liquidity to empty pools
droserasprout May 31, 2021
9ef950e
WIP
droserasprout May 31, 2021
1a1aff8
Cleanup
droserasprout May 31, 2021
d704a29
Fix tests
droserasprout May 31, 2021
f05bde1
Backport quipuswap fixes
droserasprout May 31, 2021
bad1ddf
WIP
droserasprout Jun 1, 2021
145deb5
Merge branch 'master' into feat/quipuswap-dexter
droserasprout Jun 1, 2021
bcca181
WIP
droserasprout Jun 1, 2021
3cb734c
WIP
droserasprout Jun 1, 2021
6bf0391
Drop dynamic templates
droserasprout Jun 2, 2021
0b831ec
WIP
droserasprout Jun 2, 2021
dbf055c
WIP
droserasprout Jun 2, 2021
52cd097
Codegen docs
droserasprout Jun 3, 2021
7e47e15
Docs
droserasprout Jun 3, 2021
682969a
More docs
droserasprout Jun 3, 2021
0e5fdd5
WIP
droserasprout Jun 3, 2021
2d4086f
Bugfixes
droserasprout Jun 3, 2021
92f20ef
Pass originations to multiple indexes
droserasprout Jun 3, 2021
391de4d
Bugfixes
droserasprout Jun 6, 2021
8c27fea
WIP executor refactoring
droserasprout Jun 6, 2021
4d4eaf5
Merge branch 'master' into feat/quipuswap-dexter
droserasprout Jun 6, 2021
9a88c43
Fix executor, biig map matching
droserasprout Jun 6, 2021
5037086
Rewrite executor, fix updating index level
droserasprout Jun 6, 2021
e4cc892
WIP
droserasprout Jun 6, 2021
46d33c0
Atomicity fix WIP
droserasprout Jun 7, 2021
2a6a333
Codegen fixes
droserasprout Jun 7, 2021
b505747
Limit queue to 2000 (still blocking loop), more docs
droserasprout Jun 7, 2021
a1ea5cc
Lint, sync twice on start
droserasprout Jun 8, 2021
e904543
Docs
droserasprout Jun 8, 2021
fc79339
WIP
droserasprout Jun 10, 2021
44e68cf
WIP
droserasprout Jun 10, 2021
631bccf
BigMap WIP
droserasprout Jun 10, 2021
74861c2
Move State to indexes
droserasprout Jun 10, 2021
d443336
Oneshot flag
droserasprout Jun 10, 2021
ab0f586
Move and rename context classes
droserasprout Jun 10, 2021
b9811a6
Fix handlers, fix oneshot mode
droserasprout Jun 10, 2021
17a49a4
Fix integration tests
droserasprout Jun 10, 2021
083a2e1
Factory context helpers
droserasprout Jun 10, 2021
0bfc1aa
Move hashes fetching from config, fix bigmap message callback
droserasprout Jun 10, 2021
1f2deb1
Make pipelines green
droserasprout Jun 10, 2021
88def3b
Cleanup
droserasprout Jun 10, 2021
d1f36fc
Migration for handlers
droserasprout Jun 11, 2021
38004cf
Even cooler migrations
droserasprout Jun 11, 2021
6fa5378
Migrate demos
droserasprout Jun 11, 2021
cc5c166
Do not restart on migration
droserasprout Jun 11, 2021
c74a86b
Rewrite rollbacks
droserasprout Jun 11, 2021
a1a91cb
Cleanup, fix tests
droserasprout Jun 11, 2021
1d1e82d
Fix schema fetching
droserasprout Jun 11, 2021
0d7c1e7
Monkeypatch Tortoise to fix get_or_create
droserasprout Jun 14, 2021
49a42c3
Lock Tortoise to 0.17.4
droserasprout Jun 14, 2021
1cab662
Make keepalive_timeout configurable, log DB ConnectionErrors on retry
droserasprout Jun 14, 2021
5b9ced5
Do not close connector, log request before sending
droserasprout Jun 14, 2021
a47b46b
Usa single session
droserasprout Jun 14, 2021
c7b03a6
Keepalive
droserasprout Jun 14, 2021
e91d4af
Lock asyncpg
droserasprout Jun 14, 2021
845fe9a
Drop tortoise hacks, close aiohttp sessions on exit
droserasprout Jun 14, 2021
dd7471c
Lint
droserasprout Jun 14, 2021
a64dcd8
Enforce using transaction inside `in_global_transaction` wrapper
droserasprout Jun 15, 2021
245feba
Tests for in_global_transaction
droserasprout Jun 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
WIP
droserasprout committed May 25, 2021
commit de945a1524a72862cfcc8cdb1f8162732eef7b8a
6 changes: 3 additions & 3 deletions src/demo_dex/config.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from symbol import factor
from pydantic import BaseModel
from dipdup.config import ContractConfig, DipDupConfig, StaticTemplateConfig

from typing import Dict, List, cast

from pydantic import BaseModel

from dipdup.config import ContractConfig, DipDupConfig, StaticTemplateConfig
from dipdup.datasources import DatasourceT
from dipdup.datasources.bcd.datasource import BcdDatasource
from dipdup.datasources.tzkt.datasource import TzktDatasource
4 changes: 2 additions & 2 deletions src/demo_dex/handlers/on_fa12_divest_liquidity.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from decimal import Decimal

import demo_dex.models as models
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from demo_dex.types.quipuswap_fa12.parameter.divest_liquidity import DivestLiquidityParameter
from demo_dex.types.quipuswap_fa12.storage import QuipuswapFa12Storage
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from dipdup.models import OperationHandlerContext, TransactionContext


4 changes: 2 additions & 2 deletions src/demo_dex/handlers/on_fa12_invest_liquidity.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from decimal import Decimal

import demo_dex.models as models
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from demo_dex.types.quipuswap_fa12.parameter.invest_liquidity import InvestLiquidityParameter
from demo_dex.types.quipuswap_fa12.storage import QuipuswapFa12Storage
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from dipdup.models import OperationHandlerContext, TransactionContext


6 changes: 2 additions & 4 deletions src/demo_dex/handlers/on_fa12_origination.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
from typing import Optional, Union
from demo_dex.types.dexter_fa12.storage import DexterFa12Storage

from dipdup.models import OperationData, OperationHandlerContext, OriginationContext, TransactionContext

import demo_dex.models as models

from demo_dex.types.dexter_fa12.storage import DexterFa12Storage
from demo_dex.types.quipuswap_fa12.storage import QuipuswapFa12Storage
from dipdup.models import OperationData, OperationHandlerContext, OriginationContext, TransactionContext


async def on_fa12_origination(
6 changes: 3 additions & 3 deletions src/demo_dex/handlers/on_fa12_tez_to_token.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from decimal import Decimal
from demo_dex.handlers.utils import update_totals

import demo_dex.models as models
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from demo_dex.handlers.utils import update_totals
from demo_dex.types.quipuswap_fa12.parameter.tez_to_token_payment import TezToTokenPaymentParameter
from demo_dex.types.quipuswap_fa12.storage import QuipuswapFa12Storage
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from dipdup.models import OperationHandlerContext, TransactionContext


4 changes: 2 additions & 2 deletions src/demo_dex/handlers/on_fa12_token_to_tez.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from decimal import Decimal

import demo_dex.models as models
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from demo_dex.types.quipuswap_fa12.parameter.token_to_tez_payment import TokenToTezPaymentParameter
from demo_dex.types.quipuswap_fa12.storage import QuipuswapFa12Storage
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
from demo_dex.types.token_fa12.storage import TokenFa12Storage
from dipdup.models import OperationHandlerContext, TransactionContext


2 changes: 1 addition & 1 deletion src/demo_dex/handlers/on_fa12_xtz_to_token.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from decimal import Decimal
from typing import Optional
from demo_dex.handlers.utils import update_totals

import demo_dex.models as models
from demo_dex.handlers.utils import update_totals
from demo_dex.types.dexter_fa12.parameter.xtz_to_token import XtzToTokenParameter
from demo_dex.types.dexter_fa12.storage import DexterFa12Storage
from demo_dex.types.token_fa12.parameter.transfer import TransferParameter
8 changes: 4 additions & 4 deletions src/demo_dex/handlers/on_fa2_divest_liquidity.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from decimal import Decimal

import demo_dex.models as models
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from demo_dex.types.quipuswap_fa2.parameter.divest_liquidity import DivestLiquidityParameter
from demo_dex.types.quipuswap_fa2.storage import QuipuswapFa2Storage
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from dipdup.models import OperationHandlerContext, TransactionContext


@@ -49,7 +49,7 @@ async def on_fa2_divest_liquidity(
assert position.shares_qty >= 0, divest_liquidity.data.hash
else:
# NOTE: MEL token
position.realized_pl = 0
position.shares_qty = 0
position.realized_pl = 0 # type: ignore
position.shares_qty = 0 # type: ignore

await position.save()
4 changes: 2 additions & 2 deletions src/demo_dex/handlers/on_fa2_invest_liquidity.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from decimal import Decimal

import demo_dex.models as models
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from demo_dex.types.quipuswap_fa2.parameter.invest_liquidity import InvestLiquidityParameter
from demo_dex.types.quipuswap_fa2.storage import QuipuswapFa2Storage
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from dipdup.models import OperationHandlerContext, TransactionContext


4 changes: 1 addition & 3 deletions src/demo_dex/handlers/on_fa2_origination.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
from typing import Optional

from dipdup.models import OperationData, OperationHandlerContext, OriginationContext, TransactionContext

import demo_dex.models as models

from demo_dex.types.quipuswap_fa2.storage import QuipuswapFa2Storage
from dipdup.models import OperationData, OperationHandlerContext, OriginationContext, TransactionContext


async def on_fa2_origination(
6 changes: 3 additions & 3 deletions src/demo_dex/handlers/on_fa2_tez_to_token.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from decimal import Decimal
from demo_dex.handlers.utils import update_totals

import demo_dex.models as models
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from demo_dex.handlers.utils import update_totals
from demo_dex.types.quipuswap_fa2.parameter.tez_to_token_payment import TezToTokenPaymentParameter
from demo_dex.types.quipuswap_fa2.storage import QuipuswapFa2Storage
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from dipdup.models import OperationHandlerContext, TransactionContext


4 changes: 2 additions & 2 deletions src/demo_dex/handlers/on_fa2_token_to_tez.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from decimal import Decimal

import demo_dex.models as models
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from demo_dex.types.quipuswap_fa2.parameter.token_to_tez_payment import TokenToTezPaymentParameter
from demo_dex.types.quipuswap_fa2.storage import QuipuswapFa2Storage
from demo_dex.types.token_fa2.parameter.transfer import TransferParameter
from demo_dex.types.token_fa2.storage import TokenFa2Storage
from dipdup.models import OperationHandlerContext, TransactionContext


3 changes: 2 additions & 1 deletion src/demo_dex/handlers/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from datetime import datetime, timedelta
from tortoise.transactions import in_transaction

from tortoise.exceptions import OperationalError
from tortoise.transactions import in_transaction


async def update_totals():
2 changes: 1 addition & 1 deletion src/demo_dex/types/quipuswap_fa12/storage.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@

from typing import Dict, Optional

from pydantic import BaseModel, Extra
from pydantic import BaseModel


class Ledger(BaseModel):
2 changes: 1 addition & 1 deletion src/demo_tzbtc/handlers/on_balance_update.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from decimal import Decimal
from datetime import datetime
from decimal import Decimal

import demo_tzbtc.models as models

2 changes: 1 addition & 1 deletion src/dipdup/datasources/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Union

from dipdup.datasources.bcd.datasource import BcdDatasource
from dipdup.datasources.tzkt.datasource import TzktDatasource


DatasourceT = Union[TzktDatasource, BcdDatasource]
7 changes: 5 additions & 2 deletions src/dipdup/datasources/bcd/datasource.py
Original file line number Diff line number Diff line change
@@ -6,14 +6,17 @@


class BcdDatasource:
def __init__(self, url: str, network: str, cache: bool):
def __init__(self, url: str, network: str, cache: bool) -> None:
super().__init__()
self._url = url.rstrip('/')
self._network = network
self._logger = logging.getLogger(__name__)
self._proxy = DatasourceRequestProxy(cache)

async def run(self):
async def run(self) -> None:
pass

async def resync(self) -> None:
pass

async def get_tokens(self, address: Address) -> List[Dict[str, Any]]:
13 changes: 7 additions & 6 deletions src/dipdup/datasources/tzkt/datasource.py
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
from collections import deque
from enum import Enum
from operator import index
import random
from typing import Any, Awaitable, Callable, Deque, Dict, List, Optional, Union, cast

from aiosignalrcore.hub.base_hub_connection import BaseHubConnection # type: ignore
@@ -17,7 +18,6 @@
ROLLBACK_HANDLER,
BigMapHandlerConfig,
BigMapIndexConfig,
BlockIndexConfig,
ContractConfig,
DipDupConfig,
IndexConfigTemplateT,
@@ -29,9 +29,9 @@
StaticTemplateConfig,
TzktDatasourceConfig,
)
from dipdup.datasources.proxy import DatasourceRequestProxy
from dipdup.datasources.tzkt.cache import BigMapCache, OperationCache
from dipdup.datasources.tzkt.enums import TzktMessageType
from dipdup.datasources.proxy import DatasourceRequestProxy
from dipdup.models import (
BigMapAction,
BigMapContext,
@@ -266,7 +266,6 @@ def __init__(self, url: str, cache: bool):
self._logger = logging.getLogger(__name__)
self._operation_index_by_name: Dict[IndexName, OperationIndexConfig] = {}
self._big_map_index_by_name: Dict[IndexName, BigMapIndexConfig] = {}
self._big_map_index_by_address: Dict[Address, BigMapIndexConfig] = {}
self._callback_lock = asyncio.Lock()
self._operation_subscriptions: Dict[Address, List[OperationType]] = {}
self._contract_subscriptions: List[ContractSubscription] = []
@@ -347,16 +346,13 @@ async def add_subscriptions(self) -> None:
await self.add_big_map_subscription(pattern_config.contract_config.address, pattern_config.path)

async def fetch_index(self, index_name: str, index_config: IndexConfigTemplateT, level: int) -> None:
if index_name in self._synched_indexes:
return
self._logger.info('Synchronizing `%s`', index_name)
if isinstance(index_config, OperationIndexConfig):
await self.fetch_operations(index_config, level)
elif isinstance(index_config, BigMapIndexConfig):
await self.fetch_big_maps(index_config, level)
else:
raise NotImplementedError
self._synched_indexes.append(index_name)

async def run(self):
self._logger.info('Starting datasource')
@@ -921,3 +917,8 @@ async def get_originated_contracts(self, address: Address) -> List[Address]:

async def get_contract_storage(self, address: Address) -> Dict[str, Any]:
return await self._proxy.http_request('get', url=f'{self._url}/v1/contracts/{address}/storage')

async def resync(self) -> None:
self._operations_synchronized.clear()
self._big_maps_synchronized.clear()
await self.on_connect()
23 changes: 16 additions & 7 deletions src/dipdup/dipdup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import asyncio
from genericpath import exists
import hashlib
import importlib
import logging
@@ -8,21 +7,22 @@
from posix import listdir
from typing import Dict, List, cast

from genericpath import exists
from tortoise import Tortoise
from tortoise.exceptions import OperationalError
from tortoise.utils import get_schema_sql
from tortoise.transactions import in_transaction
from tortoise.utils import get_schema_sql

import dipdup.codegen as codegen
from dipdup import __version__
from dipdup.config import (
BcdDatasourceConfig,
DatasourceConfigT,
IndexConfigTemplateT,
ROLLBACK_HANDLER,
BcdDatasourceConfig,
ContractConfig,
DatasourceConfigT,
DipDupConfig,
DynamicTemplateConfig,
IndexConfigTemplateT,
PostgresDatabaseConfig,
SqliteDatabaseConfig,
StaticTemplateConfig,
@@ -53,7 +53,7 @@ async def init(self) -> None:
await codegen.generate_handlers(self._config)
await codegen.cleanup(self._config)

async def configure(self) -> None:
async def configure(self, runtime=False) -> None:
if not self._datasources:
raise RuntimeError('Call `create_datasources` first')

@@ -64,6 +64,8 @@ async def configure(self) -> None:
self._config.pre_initialize()
await self._config.initialize()

await self.spawn_indexes(runtime)

async def create_datasources(self) -> None:
datasource: DatasourceT
for name, datasource_config in self._config.datasources.items():
@@ -124,6 +126,7 @@ async def resolve_dynamic_templates(self):
del self._config.indexes[index_name]

async def spawn_indexes(self, runtime=False) -> None:
resync_datasources = []
for index_name, index_config in self._config.indexes.items():
if index_name in self._spawned_indexes:
continue
@@ -134,15 +137,21 @@ async def spawn_indexes(self, runtime=False) -> None:

self._logger.info('Processing index `%s`', index_name)
datasource = cast(TzktDatasource, self._datasources_by_config[index_config.datasource_config])
if datasource not in resync_datasources:
resync_datasources.append(datasource)

await datasource.add_index(index_name, index_config)

self._spawned_indexes.append(index_name)

if runtime:
for datasource in resync_datasources:
await datasource.resync()

async def configuration_loop(self, interval: int):
while True:
await asyncio.sleep(interval)
await self.configure()
await self.configure(runtime=True)

async def run(self) -> None:
url = self._config.database.connection_string
12 changes: 6 additions & 6 deletions tests/integration_tests/quipuswap.yml
Original file line number Diff line number Diff line change
@@ -8,22 +8,22 @@ database:
contracts:
kusd_dex_mainnet:
address: KT1CiSKXR68qYSxnbzjwvfeMCRburaSDonT2
typename: quipuswap_fa12
typename: quipu_fa12
tzbtc_dex_mainnet:
address: KT1N1wwNPqT5jGhM91GQ2ae5uY8UzFaXHMJS
typename: quipuswap_fa12
typename: quipu_fa12
kusd_token_mainnet:
address: KT1K9gCRgaLRFKTErYt1wVxA3Frb9FjasjTV
typename: token_fa12
typename: fa12_token
tzbtc_token_mainnet:
address: KT1PWx2mnDueood7fEmfbBDKx1D9BAnnXitn
typename: token_fa12
typename: fa12_token
hdao_dex_mainnet:
address: KT1V41fGzkdTJki4d11T1Rp9yPkCmDhB7jph
typename: quipuswap_fa2
typename: quipu_fa2
hdao_token_mainnet:
address: KT1AFA2mwNUMNd4SsujE1YYp29vd8BZejyKW
typename: token_fa2
typename: fa2_token

datasources:
tzkt_staging_mainnet:
8 changes: 4 additions & 4 deletions tests/integration_tests/test_demos.py
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@
from tortoise.transactions import in_transaction

import demo_hic_et_nunc.models
import demo_dex.models
import demo_quipuswap.models
import demo_tezos_domains.models
import demo_tezos_domains_big_map.models
import demo_tzcolors.models
@@ -53,9 +53,9 @@ async def test_hic_et_nunc(self):
async def test_quipuswap(self):
self.run_dipdup('quipuswap.yml')

async with tortoise_wrapper('sqlite:///tmp/dipdup/db.sqlite3', 'demo_dex.models'):
trades = await demo_dex.models.Trade.filter().count()
positions = await demo_dex.models.Position.filter().count()
async with tortoise_wrapper('sqlite:///tmp/dipdup/db.sqlite3', 'demo_quipuswap.models'):
trades = await demo_quipuswap.models.Trade.filter().count()
positions = await demo_quipuswap.models.Position.filter().count()
async with in_transaction() as conn:
symbols = (await conn.execute_query('select count(distinct(symbol)) from trade group by symbol;'))[0]
self.assertEqual(2, symbols)