|
12 | 12 | from celery.schedules import crontab
|
13 | 13 | from tronpy.keys import PrivateKey
|
14 | 14 | from tronpy.tron import current_timestamp
|
| 15 | +from tronpy import Tron |
15 | 16 | import tronpy.exceptions
|
16 | 17 | import requests
|
17 | 18 | from sqlmodel import Session, select
|
@@ -263,11 +264,10 @@ def precision_of(symbol):
|
263 | 264 | .functions.decimals()
|
264 | 265 | )
|
265 | 266 |
|
266 |
| - query = 'SELECT public FROM keys WHERE type = ?' |
267 |
| - accounts_onetime = [row["public"] for row in query_db(query, ("onetime",))] |
268 |
| - accounts_read_mode = [row["public"] for row in query_db(query, ("only_read",))] |
269 |
| - accounts = accounts_read_mode if config.READ_MODE else accounts_onetime |
270 |
| - |
| 267 | + accounts = [ |
| 268 | + row["public"] |
| 269 | + for row in query_db('SELECT public FROM keys WHERE type = "only_read_finished"') |
| 270 | + ] |
271 | 271 | for index, account in enumerate(accounts, start=1):
|
272 | 272 | try:
|
273 | 273 | #
|
@@ -381,9 +381,87 @@ def precision_of(symbol):
|
381 | 381 | stats["exception_num"] += 1
|
382 | 382 | return stats
|
383 | 383 |
|
| 384 | +@celery.task(bind=True) |
| 385 | +@skip_if_running |
| 386 | +def scan_ballance(self, *args, **kwargs): |
| 387 | + """ |
| 388 | + Scans accounts balances (TRX and TRC20), |
| 389 | + """ |
| 390 | + from .db import engine |
| 391 | + from .models import Balance |
| 392 | + from tronpy import Tron |
| 393 | + client = Tron() |
| 394 | + with Session(engine) as session: |
| 395 | + stats = { |
| 396 | + "balances": collections.defaultdict(Decimal), |
| 397 | + "exception_num": 0, |
| 398 | + } |
| 399 | + |
| 400 | + accounts = [ |
| 401 | + row["public"] |
| 402 | + for row in query_db('SELECT public FROM keys WHERE type = "only_read_finished"') |
| 403 | + ] |
| 404 | + |
| 405 | + for index, account in enumerate(accounts, start=1): |
| 406 | + try: |
| 407 | + # === TRX BALANCE === |
| 408 | + trx_balance = client.get_account_balance(account) |
| 409 | + stats["balances"]["TRX"] += trx_balance |
| 410 | + logger.debug(f"[TRX] {account} -> {trx_balance} TRX") |
| 411 | + |
| 412 | + if config.READ_MODE: |
| 413 | + acc_balance = session.exec( |
| 414 | + select(Balance).where(Balance.account == account, Balance.symbol == "TRX") |
| 415 | + ).first() |
| 416 | + if acc_balance: |
| 417 | + acc_balance.balance = trx_balance |
| 418 | + else: |
| 419 | + acc_balance = Balance( |
| 420 | + account=account, |
| 421 | + symbol="TRX", |
| 422 | + balance=trx_balance, |
| 423 | + ) |
| 424 | + session.add(acc_balance) |
| 425 | + session.commit() |
| 426 | + |
| 427 | + # === TRC20 TOKENS === |
| 428 | + for token in config.get_tokens(): |
| 429 | + symbol = token.symbol |
| 430 | + contract_address = token.contract_address |
| 431 | + contract = client.get_contract(contract_address) |
| 432 | + |
| 433 | + # balanceOf returns balance in raw token units |
| 434 | + raw_balance = contract.functions.balanceOf(account) |
| 435 | + trc20_balance = Decimal(raw_balance) / (10 ** token.decimal) |
| 436 | + |
| 437 | + stats["balances"][symbol] += trc20_balance |
| 438 | + logger.debug(f"[{symbol}] {account} -> {trc20_balance} tokens") |
| 439 | + |
| 440 | + if config.READ_MODE: |
| 441 | + acc_balance = session.exec( |
| 442 | + select(Balance).where(Balance.account == account, Balance.symbol == symbol) |
| 443 | + ).first() |
| 444 | + if acc_balance: |
| 445 | + acc_balance.balance = trc20_balance |
| 446 | + else: |
| 447 | + acc_balance = Balance( |
| 448 | + account=account, |
| 449 | + symbol=symbol, |
| 450 | + balance=trc20_balance, |
| 451 | + ) |
| 452 | + session.add(acc_balance) |
| 453 | + session.commit() |
| 454 | + |
| 455 | + except Exception as e: |
| 456 | + stats["exception_num"] += 1 |
| 457 | + logger.warning(f"[ERROR] {account} scan error: {e}") |
| 458 | + |
| 459 | + return stats |
384 | 460 |
|
385 | 461 | @celery.on_after_configure.connect
|
386 | 462 | def setup_periodic_tasks(sender, **kwargs):
|
| 463 | + if config.READ_MODE: |
| 464 | + sender.add_periodic_task(config.BALANCES_RESCAN_PERIOD, scan_ballance.s()) |
387 | 465 | if config.EXTERNAL_DRAIN_CONFIG:
|
388 | 466 | from .custom.aml.tasks import sweep_accounts, recheck_transactions
|
389 | 467 |
|
|
0 commit comments