From 2a6c5ef1f97dc66e95a346bfd46990e3ac911202 Mon Sep 17 00:00:00 2001 From: bohd4nx Date: Wed, 20 May 2026 23:45:27 +0300 Subject: [PATCH] refactor: reorganize tonapi module and update imports for account management --- pyfragment/domains/__init__.py | 1 + pyfragment/domains/ads/__init__.py | 5 + pyfragment/domains/ads/recharge.py | 2 +- pyfragment/domains/ads/tonup.py | 2 +- .../domains/anonymous_numbers/__init__.py | 12 +++ pyfragment/domains/giveaways/__init__.py | 11 ++ pyfragment/domains/giveaways/giveaway.py | 2 +- pyfragment/domains/marketplace/__init__.py | 13 +++ pyfragment/domains/purchases/__init__.py | 5 + pyfragment/domains/purchases/purchase.py | 2 +- pyfragment/domains/tonapi/__init__.py | 23 ++++ pyfragment/domains/tonapi/account.py | 102 ++++++++++++++++++ pyfragment/domains/tonapi/balance.py | 92 ---------------- pyfragment/domains/tonapi/info.py | 67 ------------ pyfragment/domains/tonapi/service.py | 2 +- pyfragment/domains/tonapi/transaction.py | 2 +- tests/003_test_balance.py | 4 +- tests/007_test_wallet.py | 12 +-- tests/conftest.py | 2 +- 19 files changed, 187 insertions(+), 174 deletions(-) create mode 100644 pyfragment/domains/tonapi/account.py delete mode 100644 pyfragment/domains/tonapi/balance.py delete mode 100644 pyfragment/domains/tonapi/info.py diff --git a/pyfragment/domains/__init__.py b/pyfragment/domains/__init__.py index e69de29..8611980 100644 --- a/pyfragment/domains/__init__.py +++ b/pyfragment/domains/__init__.py @@ -0,0 +1 @@ +"""Domain-level helpers for Fragment operations.""" diff --git a/pyfragment/domains/ads/__init__.py b/pyfragment/domains/ads/__init__.py index e69de29..50fd95a 100644 --- a/pyfragment/domains/ads/__init__.py +++ b/pyfragment/domains/ads/__init__.py @@ -0,0 +1,5 @@ +from pyfragment.domains.ads.recharge import recharge_ads +from pyfragment.domains.ads.service import AdsService +from pyfragment.domains.ads.tonup import topup_ton + +__all__ = ["AdsService", "recharge_ads", "topup_ton"] diff --git a/pyfragment/domains/ads/recharge.py b/pyfragment/domains/ads/recharge.py index 2ded2a2..5c6285e 100644 --- a/pyfragment/domains/ads/recharge.py +++ b/pyfragment/domains/ads/recharge.py @@ -4,7 +4,7 @@ import json from typing import TYPE_CHECKING from pyfragment.core.constants import ADS_TOPUP_PAGE, DEVICE -from pyfragment.domains.tonapi.info import get_account_info +from pyfragment.domains.tonapi.account import get_account_info from pyfragment.domains.tonapi.transaction import process_transaction from pyfragment.exceptions import ConfigurationError, FragmentAPIError, FragmentError, UnexpectedError, VerificationError from pyfragment.models.payments import AdsRechargeResult diff --git a/pyfragment/domains/ads/tonup.py b/pyfragment/domains/ads/tonup.py index 9e60135..c86a77c 100644 --- a/pyfragment/domains/ads/tonup.py +++ b/pyfragment/domains/ads/tonup.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING from pyfragment.core.constants import ADS_TOPUP_PAGE, DEVICE from pyfragment.domains.payments import parse_required_payment_amount -from pyfragment.domains.tonapi.info import get_account_info +from pyfragment.domains.tonapi.account import get_account_info from pyfragment.domains.tonapi.transaction import process_transaction from pyfragment.exceptions import ( ConfigurationError, diff --git a/pyfragment/domains/anonymous_numbers/__init__.py b/pyfragment/domains/anonymous_numbers/__init__.py index e69de29..9b7bb67 100644 --- a/pyfragment/domains/anonymous_numbers/__init__.py +++ b/pyfragment/domains/anonymous_numbers/__init__.py @@ -0,0 +1,12 @@ +from pyfragment.domains.anonymous_numbers.number import get_login_code, terminate_sessions, toggle_login_codes +from pyfragment.domains.anonymous_numbers.service import AnonymousNumbersService +from pyfragment.models.anonymous_numbers import LoginCodeResult, TerminateSessionsResult + +__all__ = [ + "AnonymousNumbersService", + "LoginCodeResult", + "TerminateSessionsResult", + "get_login_code", + "terminate_sessions", + "toggle_login_codes", +] diff --git a/pyfragment/domains/giveaways/__init__.py b/pyfragment/domains/giveaways/__init__.py index e69de29..eaec868 100644 --- a/pyfragment/domains/giveaways/__init__.py +++ b/pyfragment/domains/giveaways/__init__.py @@ -0,0 +1,11 @@ +from pyfragment.domains.giveaways.giveaway import giveaway_premium, giveaway_stars +from pyfragment.domains.giveaways.service import GiveawaysService +from pyfragment.models.giveaways import PremiumGiveawayResult, StarsGiveawayResult + +__all__ = [ + "GiveawaysService", + "PremiumGiveawayResult", + "StarsGiveawayResult", + "giveaway_premium", + "giveaway_stars", +] diff --git a/pyfragment/domains/giveaways/giveaway.py b/pyfragment/domains/giveaways/giveaway.py index 4e7d766..ab1af30 100644 --- a/pyfragment/domains/giveaways/giveaway.py +++ b/pyfragment/domains/giveaways/giveaway.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, get_args from pyfragment.core.constants import DEVICE, PREMIUM_GIVEAWAY_PAGE, STARS_GIVEAWAY_PAGE from pyfragment.domains.payments import parse_required_payment_amount -from pyfragment.domains.tonapi.info import get_account_info +from pyfragment.domains.tonapi.account import get_account_info from pyfragment.domains.tonapi.transaction import process_transaction from pyfragment.exceptions import ( ConfigurationError, diff --git a/pyfragment/domains/marketplace/__init__.py b/pyfragment/domains/marketplace/__init__.py index e69de29..ed298ed 100644 --- a/pyfragment/domains/marketplace/__init__.py +++ b/pyfragment/domains/marketplace/__init__.py @@ -0,0 +1,13 @@ +from pyfragment.domains.marketplace.search import search_gifts, search_numbers, search_usernames +from pyfragment.domains.marketplace.service import MarketplaceService +from pyfragment.models.marketplace import GiftsResult, NumbersResult, UsernamesResult + +__all__ = [ + "GiftsResult", + "MarketplaceService", + "NumbersResult", + "UsernamesResult", + "search_gifts", + "search_numbers", + "search_usernames", +] diff --git a/pyfragment/domains/purchases/__init__.py b/pyfragment/domains/purchases/__init__.py index e69de29..baa5df2 100644 --- a/pyfragment/domains/purchases/__init__.py +++ b/pyfragment/domains/purchases/__init__.py @@ -0,0 +1,5 @@ +from pyfragment.domains.purchases.purchase import purchase_premium, purchase_stars +from pyfragment.domains.purchases.service import PurchasesService +from pyfragment.models.payments import PremiumResult, StarsResult + +__all__ = ["PremiumResult", "PurchasesService", "StarsResult", "purchase_premium", "purchase_stars"] diff --git a/pyfragment/domains/purchases/purchase.py b/pyfragment/domains/purchases/purchase.py index 62ff944..52d24e4 100644 --- a/pyfragment/domains/purchases/purchase.py +++ b/pyfragment/domains/purchases/purchase.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, get_args from pyfragment.core.constants import DEVICE, PREMIUM_PAGE, STARS_PAGE from pyfragment.domains.payments import parse_required_payment_amount -from pyfragment.domains.tonapi.info import get_account_info +from pyfragment.domains.tonapi.account import get_account_info from pyfragment.domains.tonapi.transaction import process_transaction from pyfragment.exceptions import ( ConfigurationError, diff --git a/pyfragment/domains/tonapi/__init__.py b/pyfragment/domains/tonapi/__init__.py index e69de29..e8f85e3 100644 --- a/pyfragment/domains/tonapi/__init__.py +++ b/pyfragment/domains/tonapi/__init__.py @@ -0,0 +1,23 @@ +from pyfragment.domains.tonapi.account import ( + check_ton_payment_balance, + check_usdt_payment_balance, + get_account_info, + get_usdt_balance, + get_wallet_info, +) +from pyfragment.domains.tonapi.service import TonapiService +from pyfragment.domains.tonapi.transaction import clean_decode, process_transaction +from pyfragment.domains.tonapi.transfer import send_ton_transfer, send_usdt_transfer + +__all__ = [ + "TonapiService", + "clean_decode", + "check_ton_payment_balance", + "check_usdt_payment_balance", + "get_account_info", + "get_usdt_balance", + "get_wallet_info", + "process_transaction", + "send_ton_transfer", + "send_usdt_transfer", +] diff --git a/pyfragment/domains/tonapi/account.py b/pyfragment/domains/tonapi/account.py new file mode 100644 index 0000000..cd150fd --- /dev/null +++ b/pyfragment/domains/tonapi/account.py @@ -0,0 +1,102 @@ +from __future__ import annotations + +import base64 +from typing import TYPE_CHECKING, Any + +from ton_core import NetworkGlobalID +from tonutils.clients import TonapiClient +from tonutils.contracts.jetton import get_wallet_address_get_method, get_wallet_data_get_method +from tonutils.exceptions import ProviderResponseError + +from pyfragment.core.constants import MIN_TON_BALANCE, MIN_USDT_BALANCE, USDT_TON_MASTER_ADDRESS, WALLET_CLASSES +from pyfragment.exceptions import WalletError +from pyfragment.models.wallet import WalletInfo + +if TYPE_CHECKING: + from pyfragment.client import FragmentClient + + +async def get_usdt_balance(ton: Any, wallet_address: str) -> float: + """Return the USDT balance for a Fragment-linked TON wallet.""" + try: + jetton_wallet_address = await get_wallet_address_get_method( + client=ton, + address=USDT_TON_MASTER_ADDRESS, + owner_address=wallet_address, + ) + wallet_data = await get_wallet_data_get_method(client=ton, address=jetton_wallet_address) + raw_balance = int(wallet_data[0]) if wallet_data else 0 + return float(raw_balance) / 1_000_000.0 + except ProviderResponseError as exc: + if exc.code == 404: + return 0.0 + raise WalletError(WalletError.USDT_BALANCE_CHECK_FAILED.format(exc=exc)) from exc + except Exception as exc: + raise WalletError(WalletError.USDT_BALANCE_CHECK_FAILED.format(exc=exc)) from exc + + +async def check_ton_payment_balance( + balance_ton: float, + amount_ton: float, + required_payment_amount: float | None, +) -> None: + """Validate that the TON wallet can cover a TON-denominated payment.""" + tx_price_ton = amount_ton + if required_payment_amount is not None and required_payment_amount > 0: + tx_price_ton = max(tx_price_ton, required_payment_amount) + + required_ton = max(tx_price_ton, MIN_TON_BALANCE) + if balance_ton < required_ton: + raise WalletError(WalletError.LOW_TON_BALANCE.format(balance=balance_ton, required=required_ton)) + + +async def check_usdt_payment_balance( + balance_ton: float, + required_payment_amount: float | None, + ton: Any, + wallet_address: str, +) -> None: + """Validate that the wallet can cover a USDT-denominated payment.""" + if balance_ton < MIN_TON_BALANCE: + raise WalletError(WalletError.LOW_TON_BALANCE.format(balance=balance_ton, required=MIN_TON_BALANCE)) + + usdt_balance = await get_usdt_balance(ton, wallet_address) + required_usdt = required_payment_amount if required_payment_amount is not None else MIN_USDT_BALANCE + if usdt_balance < required_usdt: + raise WalletError(WalletError.LOW_USDT_BALANCE.format(balance=usdt_balance, required=required_usdt)) + + +async def get_account_info(client: FragmentClient) -> dict[str, Any]: + """Build the wallet payload Fragment needs to prepare a transaction.""" + async with TonapiClient(network=NetworkGlobalID.MAINNET, api_key=client.api_key) as ton: + try: + wallet_cls = WALLET_CLASSES[client.wallet_version] + wallet, pub_key, _, _ = wallet_cls.from_mnemonic(client=ton, mnemonic=client.seed) + boc = wallet.state_init.serialize().to_boc() + return { + "address": wallet.address.to_str(False, False), + "publicKey": pub_key.as_hex, + "chain": "-239", + "walletStateInit": base64.b64encode(boc).decode(), + } + except Exception as exc: + raise WalletError(WalletError.ACCOUNT_INFO_FAILED.format(exc=exc)) from exc + + +async def get_wallet_info(client: FragmentClient) -> WalletInfo: + """Fetch the wallet address, chain state, and TON/USDT balances.""" + async with TonapiClient(network=NetworkGlobalID.MAINNET, api_key=client.api_key) as ton: + try: + wallet_cls = WALLET_CLASSES[client.wallet_version] + wallet, _, _, _ = wallet_cls.from_mnemonic(client=ton, mnemonic=client.seed) + await wallet.refresh() + wallet_address = wallet.address.to_str(False, False) + usdt_balance = await get_usdt_balance(ton, wallet_address) + return WalletInfo( + address=wallet.address.to_str(is_user_friendly=True, is_bounceable=False), + state=wallet.state.value, + ton_balance=round(wallet.balance / 1_000_000_000, 4), + usdt_balance=round(usdt_balance, 4), + ) + except Exception as exc: + raise WalletError(WalletError.WALLET_INFO_FAILED.format(exc=exc)) from exc diff --git a/pyfragment/domains/tonapi/balance.py b/pyfragment/domains/tonapi/balance.py deleted file mode 100644 index 125defe..0000000 --- a/pyfragment/domains/tonapi/balance.py +++ /dev/null @@ -1,92 +0,0 @@ -from __future__ import annotations - -from typing import Any - -from tonutils.contracts.jetton import get_wallet_address_get_method, get_wallet_data_get_method -from tonutils.exceptions import ProviderResponseError - -from pyfragment.core.constants import MIN_TON_BALANCE, MIN_USDT_BALANCE, USDT_TON_MASTER_ADDRESS -from pyfragment.exceptions import WalletError - - -async def get_usdt_balance(ton: Any, wallet_address: str) -> float: - """Return the USDT balance for a Fragment-linked TON wallet. - - Args: - ton: Active `TonapiClient` instance used to query the TON network. - wallet_address: Raw wallet address that owns the USDT jetton wallet. - - Returns: - Wallet balance in USDT as a floating-point value. - """ - try: - jetton_wallet_address = await get_wallet_address_get_method( - client=ton, - address=USDT_TON_MASTER_ADDRESS, - owner_address=wallet_address, - ) - wallet_data = await get_wallet_data_get_method(client=ton, address=jetton_wallet_address) - raw_balance = int(wallet_data[0]) if wallet_data else 0 - return float(raw_balance) / 1_000_000.0 - except ProviderResponseError as exc: - # No jetton wallet deployed yet means the balance is effectively zero. - if exc.code == 404: - return 0.0 - raise WalletError(WalletError.USDT_BALANCE_CHECK_FAILED.format(exc=exc)) from exc - except Exception as exc: - raise WalletError(WalletError.USDT_BALANCE_CHECK_FAILED.format(exc=exc)) from exc - - -async def check_ton_payment_balance( - balance_ton: float, - amount_ton: float, - required_payment_amount: float | None, -) -> None: - """Validate that the TON wallet can cover a TON-denominated payment. - - Args: - balance_ton: Current TON balance in the signing wallet. - amount_ton: Requested payment amount in TON. - required_payment_amount: Fragment-provided minimum amount if the API returned one. - """ - tx_price_ton = amount_ton - if required_payment_amount is not None and required_payment_amount > 0: - tx_price_ton = max(tx_price_ton, required_payment_amount) - - required_ton = max(tx_price_ton, MIN_TON_BALANCE) - if balance_ton < required_ton: - raise WalletError( - WalletError.LOW_TON_BALANCE.format( - balance=balance_ton, - required=required_ton, - ) - ) - - -async def check_usdt_payment_balance( - balance_ton: float, - required_payment_amount: float | None, - ton: Any, - wallet_address: str, -) -> None: - """Validate that the wallet can cover a USDT-denominated payment. - - Args: - balance_ton: TON balance used for gas fees. - required_payment_amount: Fragment-provided USDT amount, if available. - ton: Active `TonapiClient` instance used to query jetton balance. - wallet_address: Raw wallet address that owns the USDT jetton wallet. - """ - # USDT payments still need TON for network fees. - if balance_ton < MIN_TON_BALANCE: - raise WalletError( - WalletError.LOW_TON_BALANCE.format( - balance=balance_ton, - required=MIN_TON_BALANCE, - ) - ) - - usdt_balance = await get_usdt_balance(ton, wallet_address) - required_usdt = required_payment_amount if required_payment_amount is not None else MIN_USDT_BALANCE - if usdt_balance < required_usdt: - raise WalletError(WalletError.LOW_USDT_BALANCE.format(balance=usdt_balance, required=required_usdt)) diff --git a/pyfragment/domains/tonapi/info.py b/pyfragment/domains/tonapi/info.py deleted file mode 100644 index 91db14b..0000000 --- a/pyfragment/domains/tonapi/info.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -import base64 -from typing import TYPE_CHECKING, Any - -from ton_core import NetworkGlobalID -from tonutils.clients import TonapiClient - -from pyfragment.core.constants import WALLET_CLASSES -from pyfragment.domains.tonapi.balance import get_usdt_balance -from pyfragment.exceptions import WalletError -from pyfragment.models.wallet import WalletInfo - -if TYPE_CHECKING: - from pyfragment.client import FragmentClient - - -async def get_account_info(client: FragmentClient) -> dict[str, Any]: - """Build the wallet payload Fragment needs to prepare a transaction. - - Args: - client: Authenticated `FragmentClient` instance with seed and API key. - - Returns: - A JSON-serialisable dictionary containing address, public key, chain, - and wallet state-init bytes. - """ - async with TonapiClient(network=NetworkGlobalID.MAINNET, api_key=client.api_key) as ton: - try: - wallet_cls = WALLET_CLASSES[client.wallet_version] - wallet, pub_key, _, _ = wallet_cls.from_mnemonic(client=ton, mnemonic=client.seed) - boc = wallet.state_init.serialize().to_boc() - return { - "address": wallet.address.to_str(False, False), - "publicKey": pub_key.as_hex, - "chain": "-239", - "walletStateInit": base64.b64encode(boc).decode(), - } - except Exception as exc: - raise WalletError(WalletError.ACCOUNT_INFO_FAILED.format(exc=exc)) from exc - - -async def get_wallet_info(client: FragmentClient) -> WalletInfo: - """Fetch the wallet address, chain state, and TON/USDT balances. - - Args: - client: Authenticated `FragmentClient` instance with seed and API key. - - Returns: - `WalletInfo` with the friendly wallet address, current state, - TON balance, and USDT balance. - """ - async with TonapiClient(network=NetworkGlobalID.MAINNET, api_key=client.api_key) as ton: - try: - wallet_cls = WALLET_CLASSES[client.wallet_version] - wallet, _, _, _ = wallet_cls.from_mnemonic(client=ton, mnemonic=client.seed) - await wallet.refresh() - wallet_address = wallet.address.to_str(False, False) - usdt_balance = await get_usdt_balance(ton, wallet_address) - return WalletInfo( - address=wallet.address.to_str(is_user_friendly=True, is_bounceable=False), - state=wallet.state.value, - ton_balance=round(wallet.balance / 1_000_000_000, 4), - usdt_balance=round(usdt_balance, 4), - ) - except Exception as exc: - raise WalletError(WalletError.WALLET_INFO_FAILED.format(exc=exc)) from exc diff --git a/pyfragment/domains/tonapi/service.py b/pyfragment/domains/tonapi/service.py index 789c36a..9914b64 100644 --- a/pyfragment/domains/tonapi/service.py +++ b/pyfragment/domains/tonapi/service.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import TYPE_CHECKING from pyfragment.domains.base import BaseService -from pyfragment.domains.tonapi.info import get_wallet_info +from pyfragment.domains.tonapi.account import get_wallet_info from pyfragment.models.wallet import WalletInfo if TYPE_CHECKING: diff --git a/pyfragment/domains/tonapi/transaction.py b/pyfragment/domains/tonapi/transaction.py index 33930e1..157ba7b 100644 --- a/pyfragment/domains/tonapi/transaction.py +++ b/pyfragment/domains/tonapi/transaction.py @@ -11,7 +11,7 @@ from tonutils.clients import TonapiClient from tonutils.exceptions import ProviderResponseError from pyfragment.core.constants import WALLET_CLASSES -from pyfragment.domains.tonapi.balance import check_ton_payment_balance, check_usdt_payment_balance +from pyfragment.domains.tonapi.account import check_ton_payment_balance, check_usdt_payment_balance from pyfragment.exceptions import ParseError, TransactionError, WalletError from pyfragment.models.enums import PaymentMethod diff --git a/tests/003_test_balance.py b/tests/003_test_balance.py index 2af0d09..3f828c9 100644 --- a/tests/003_test_balance.py +++ b/tests/003_test_balance.py @@ -143,7 +143,7 @@ async def test_duplicate_seqno_raises_after_retries() -> None: @pytest.mark.asyncio async def test_usdt_payment_requires_min_ton_gas_reserve() -> None: wallet = _make_wallet(balance_nanotons=10_000_000) # 0.01 TON below MIN_TON_BALANCE - with _patch_wallet(wallet), patch("pyfragment.domains.tonapi.balance.get_usdt_balance", AsyncMock(return_value=100.0)): + with _patch_wallet(wallet), patch("pyfragment.domains.tonapi.account.get_usdt_balance", AsyncMock(return_value=100.0)): with pytest.raises(WalletError, match="Insufficient TON balance"): await process_transaction(_make_client(), TRANSACTION_DATA, payment_method="usdt_ton") @@ -167,7 +167,7 @@ async def test_usdt_payment_checks_usdt_balance() -> None: with ( _patch_wallet(wallet), patch("pyfragment.domains.tonapi.transaction.clean_decode", return_value=""), - patch("pyfragment.domains.tonapi.balance.get_usdt_balance", AsyncMock(return_value=5.0)), + patch("pyfragment.domains.tonapi.account.get_usdt_balance", AsyncMock(return_value=5.0)), ): with pytest.raises(WalletError, match="Insufficient USDT balance"): await process_transaction( diff --git a/tests/007_test_wallet.py b/tests/007_test_wallet.py index c27b2ff..2010aa6 100644 --- a/tests/007_test_wallet.py +++ b/tests/007_test_wallet.py @@ -19,9 +19,9 @@ async def test_get_wallet_returns_wallet_info(client: FragmentClient) -> None: mock_wallet.address.to_str.return_value = FAKE_ADDRESS with ( - patch("pyfragment.domains.tonapi.info.TonapiClient") as mock_tonapi, - patch("pyfragment.domains.tonapi.info.WALLET_CLASSES") as mock_classes, - patch("pyfragment.domains.tonapi.info.get_usdt_balance", AsyncMock(return_value=12.3456)), + patch("pyfragment.domains.tonapi.account.TonapiClient") as mock_tonapi, + patch("pyfragment.domains.tonapi.account.WALLET_CLASSES") as mock_classes, + patch("pyfragment.domains.tonapi.account.get_usdt_balance", AsyncMock(return_value=12.3456)), ): mock_tonapi.return_value.__aenter__ = AsyncMock(return_value=MagicMock()) mock_tonapi.return_value.__aexit__ = AsyncMock(return_value=False) @@ -45,9 +45,9 @@ async def test_get_wallet_balance_is_zero(client: FragmentClient) -> None: mock_wallet.address.to_str.return_value = FAKE_ADDRESS with ( - patch("pyfragment.domains.tonapi.info.TonapiClient") as mock_tonapi, - patch("pyfragment.domains.tonapi.info.WALLET_CLASSES") as mock_classes, - patch("pyfragment.domains.tonapi.info.get_usdt_balance", AsyncMock(return_value=0.0)), + patch("pyfragment.domains.tonapi.account.TonapiClient") as mock_tonapi, + patch("pyfragment.domains.tonapi.account.WALLET_CLASSES") as mock_classes, + patch("pyfragment.domains.tonapi.account.get_usdt_balance", AsyncMock(return_value=0.0)), ): mock_tonapi.return_value.__aenter__ = AsyncMock(return_value=MagicMock()) mock_tonapi.return_value.__aexit__ = AsyncMock(return_value=False) diff --git a/tests/conftest.py b/tests/conftest.py index 036a39f..94e7f63 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,7 +10,7 @@ import pyfragment.domains.ads.recharge # noqa: F401 import pyfragment.domains.ads.tonup # noqa: F401 import pyfragment.domains.giveaways.giveaway # noqa: F401 import pyfragment.domains.purchases.purchase # noqa: F401 -import pyfragment.domains.tonapi.info # noqa: F401 +import pyfragment.domains.tonapi.account # noqa: F401 import pyfragment.domains.tonapi.transaction # noqa: F401 from pyfragment import FragmentClient from tests.shared import VALID_API_KEY, VALID_COOKIES, VALID_SEED