Skip to content

Commit 2648620

Browse files
committed
fix calcualte balance
1 parent 14ada3e commit 2648620

File tree

5 files changed

+106
-21
lines changed

5 files changed

+106
-21
lines changed

app/__init__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,6 @@
2222
sqlite3.register_adapter(decimal.Decimal, lambda x: str(x))
2323
sqlite3.register_converter("DECTEXT", lambda x: decimal.Decimal(x.decode()))
2424

25-
def init_settings_table(db):
26-
create_table_sql = """
27-
CREATE TABLE IF NOT EXISTS settings (
28-
name TEXT PRIMARY KEY,
29-
value TEXT
30-
);
31-
"""
32-
db.query_db2(create_table_sql)
33-
3425
def create_app():
3526

3627
from flask.config import Config
@@ -55,7 +46,6 @@ def __dir__(self):
5546
from . import db
5647

5748
db.init_app(app)
58-
init_settings_table(db)
5949
key_type = "only_read" if app.config.READ_MODE else "onetime"
6050

6151
rows = db.query_db2(f'SELECT public FROM keys WHERE type = "{key_type}"')

app/block_scanner.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ def main_account(self):
9393
"public"
9494
]
9595

96+
@functools.cached_property
97+
def read_mode_account(self):
98+
return query_db2('select * from keys where type = "only_read_finished" ', one=True)[
99+
"public"
100+
]
101+
96102
def get_last_seen_block_num(self) -> int:
97103
row = query_db2(
98104
'SELECT value FROM settings WHERE name = "last_seen_block_num"', one=True

app/tasks.py

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from celery.schedules import crontab
1313
from tronpy.keys import PrivateKey
1414
from tronpy.tron import current_timestamp
15+
from tronpy import Tron
1516
import tronpy.exceptions
1617
import requests
1718
from sqlmodel import Session, select
@@ -263,11 +264,10 @@ def precision_of(symbol):
263264
.functions.decimals()
264265
)
265266

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+
]
271271
for index, account in enumerate(accounts, start=1):
272272
try:
273273
#
@@ -381,9 +381,87 @@ def precision_of(symbol):
381381
stats["exception_num"] += 1
382382
return stats
383383

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
384460

385461
@celery.on_after_configure.connect
386462
def setup_periodic_tasks(sender, **kwargs):
463+
if config.READ_MODE:
464+
sender.add_periodic_task(config.BALANCES_RESCAN_PERIOD, scan_ballance.s())
387465
if config.EXTERNAL_DRAIN_CONFIG:
388466
from .custom.aml.tasks import sweep_accounts, recheck_transactions
389467

app/wallet.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
import tronpy.exceptions
44
from tronpy.keys import PrivateKey
55

6+
from sqlalchemy import func
7+
from sqlmodel import Session, select
8+
from .models import Balance
69
from .config import config
710
from .db import query_db2
11+
from .db import engine
812
from .logging import logger
913
from .connection_manager import ConnectionManager
1014
from .wallet_encryption import wallet_encryption
@@ -38,7 +42,14 @@ def get_contract(self, contract_address=None):
3842

3943
@property
4044
def balance(self):
41-
return self.balance_of(self.main_account["public"])
45+
if config.READ_MODE:
46+
with Session(engine) as session:
47+
total_sum = session.exec(select(func.sum(Balance.balance))).one()
48+
raw_balance = total_sum if total_sum is not None else Decimal(0)
49+
overall_balance = float(round(raw_balance, 6))
50+
return overall_balance
51+
else:
52+
return self.balance_of(self.main_account["public"])
4253

4354
def balance_of(self, address):
4455
if self.symbol == "TRX":

run.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@
1111
#
1212
# Refresh best server
1313
#
14-
#
15-
# Flask
16-
#
17-
18-
server = app.create_app()
1914

2015
refresh_best_server_thread = threading.Thread(
2116
daemon=True,
@@ -24,6 +19,11 @@
2419
)
2520
refresh_best_server_thread.start()
2621

22+
#
23+
# Flask
24+
#
25+
26+
server = app.create_app()
2727

2828
#
2929
# Block scanner

0 commit comments

Comments
 (0)