mirror of https://github.com/GOSTSec/gostweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
from celery import shared_task |
|
from django.db import transaction |
|
from django.conf import settings |
|
|
|
from decimal import Decimal |
|
|
|
from .models import Account, Address, DepositTransaction, WithdrawalTransaction |
|
|
|
from .gostcoin import GOSTCOIN_CONNECTION as conn |
|
|
|
@shared_task |
|
def check_transactions_task(): |
|
check_received_transactions(conn) |
|
check_confirmed_transactions(conn) |
|
|
|
def check_received_transactions(conn): |
|
for t in conn.listtransactions("", 100): |
|
if "txid" not in t: |
|
continue |
|
elif t["category"] == "receive": |
|
try: |
|
tx = DepositTransaction.objects.get(txid=t["txid"]) |
|
except DepositTransaction.DoesNotExist: |
|
try: |
|
address = Address.objects.get(address=t["address"]) |
|
if not address.used: |
|
address.used = True |
|
address.save() |
|
# create new address |
|
Address.objects.create(account=address.account, |
|
address=conn.getnewaddress(), used=False) |
|
DepositTransaction.objects.create(account=address.account, |
|
txid=t["txid"], address=address, confirmed=False) |
|
except Address.DoesNotExist: |
|
continue |
|
|
|
def check_confirmed_transactions(conn): |
|
""" |
|
Looks for unconfirmed transactions in the database |
|
checks if they are confirmed in gostd |
|
add received coins to balance |
|
""" |
|
unconfirmed_recv = DepositTransaction.objects.filter(confirmed=False) |
|
for t in unconfirmed_recv: |
|
result = conn.gettransaction(t.txid) |
|
if result["confirmations"] >= 6: |
|
amount = Decimal("0") |
|
|
|
for d in result["details"]: |
|
if d["category"] == "receive" and d["address"] == t.address.address: |
|
amount += d["amount"] |
|
|
|
with transaction.atomic(): |
|
t.amount = amount |
|
t.confirmed = True |
|
t.save() |
|
t.account.balance += amount |
|
t.account.save() |
|
|
|
unconfirmed_send = WithdrawalTransaction.objects.filter(confirmed=False) |
|
for t in unconfirmed_send: |
|
result = conn.gettransaction(t.txid) |
|
if result["confirmations"] >= 6: |
|
t.confirmed = True |
|
t.save() |
|
|
|
|