mirror of
https://github.com/bohd4nx/FragmentAPI.git
synced 2026-07-25 14:24:31 +00:00
e3706f01bf
- tonutils 2.0.0: TonapiClient → ToncenterV3Client, wallet.transfer() - classes → plain async functions across all utils and methods - core/: constants.py, cookies.py, exceptions.py extracted - DEVICE constant in constants.py (single source of truth) - account/device serialised with json.dumps() in all tx payloads - tests: unittest → pytest, conftest.py fixtures, 001/002 naming - pyproject.toml: pytest + ruff config - min balance check: 0.056 TON
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import logging
|
|
from typing import Any
|
|
|
|
import httpx
|
|
|
|
from app.core.exceptions import RequestError, WalletError
|
|
from app.utils.wallet import link_wallet
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def parse_json_response(response: httpx.Response, context: str) -> dict[str, Any]:
|
|
try:
|
|
return response.json()
|
|
except Exception as exc:
|
|
raise RequestError(
|
|
f"Fragment API returned an unparseable response for '{context}': {exc}"
|
|
) from exc
|
|
|
|
|
|
async def execute_transaction_request(
|
|
client: httpx.AsyncClient,
|
|
headers: dict,
|
|
cookies: dict,
|
|
account: dict[str, Any],
|
|
tx_data: dict[str, Any],
|
|
fragment_hash: str,
|
|
) -> dict[str, Any]:
|
|
url = f"https://fragment.com/api?hash={fragment_hash}"
|
|
|
|
resp = await client.post(url, headers=headers, cookies=cookies, data=tx_data)
|
|
transaction = parse_json_response(resp, tx_data.get("method", "transaction"))
|
|
|
|
if transaction.get("need_verify"):
|
|
if not await link_wallet(client, headers, cookies, account, fragment_hash):
|
|
raise WalletError(
|
|
"Failed to link your TON wallet to Fragment. "
|
|
"Make sure the wallet matching your cookies is used."
|
|
)
|
|
resp = await client.post(url, headers=headers, cookies=cookies, data=tx_data)
|
|
transaction = parse_json_response(resp, tx_data.get("method", "transaction"))
|
|
|
|
return transaction
|
|
|