xync-schema 0.0.34.dev1__tar.gz → 0.0.34.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {xync_schema-0.0.34.dev1/xync_schema.egg-info → xync_schema-0.0.34.dev3}/PKG-INFO +1 -1
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/models.py +43 -19
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3/xync_schema.egg-info}/PKG-INFO +1 -1
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/.env.sample +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/.gitignore +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/.pre-commit-config.yaml +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/README.md +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/makefile +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/pyproject.toml +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/setup.cfg +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/tests/__init__.py +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/tests/test_db.py +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/__init__.py +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/enums.py +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/xtype.py +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/SOURCES.txt +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/dependency_links.txt +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/requires.txt +0 -0
- {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/top_level.txt +0 -0
|
@@ -304,31 +304,34 @@ class User(TgUser, TsTrait):
|
|
|
304
304
|
async def balance_xp(self, cur_id: int = None) -> dict[int, int] | int:
|
|
305
305
|
if cur_id:
|
|
306
306
|
dbt = (
|
|
307
|
-
await Transaction.filter(receiver=self, cur_id=cur_id
|
|
307
|
+
await Transaction.filter(receiver=self, cur_id=cur_id, status__gt=TransactionStatus.request)
|
|
308
308
|
.group_by("cur_id")
|
|
309
309
|
.annotate(debit=Sum("amount"))
|
|
310
310
|
.values_list("debit", flat=True)
|
|
311
311
|
) or [0]
|
|
312
312
|
crd = (
|
|
313
|
-
await Transaction.filter(sender=self, cur_id=cur_id
|
|
313
|
+
await Transaction.filter(sender=self, cur_id=cur_id, status__gt=TransactionStatus.request)
|
|
314
314
|
.group_by("cur_id")
|
|
315
315
|
.annotate(credit=Sum("amount"))
|
|
316
316
|
.values_list("credit", flat=True)
|
|
317
317
|
) or [0]
|
|
318
|
-
|
|
318
|
+
scale = (await Cur[cur_id]).scale
|
|
319
|
+
return (dbt[0] - crd[0]) * 10 ** (-scale)
|
|
319
320
|
dbt = {
|
|
320
|
-
c: v
|
|
321
|
-
for c, v in await Transaction.filter(receiver=self,
|
|
322
|
-
.
|
|
321
|
+
c: v * 10 ** (-s)
|
|
322
|
+
for c, v, s in await Transaction.filter(receiver=self, status__gt=TransactionStatus.request)
|
|
323
|
+
.prefetch_related("cur")
|
|
324
|
+
.group_by("cur_id", "cur__scale")
|
|
323
325
|
.annotate(debit=Sum("amount"))
|
|
324
|
-
.values_list("cur_id", "debit")
|
|
326
|
+
.values_list("cur_id", "debit", "cur__scale")
|
|
325
327
|
}
|
|
326
328
|
crd = {
|
|
327
|
-
c: v
|
|
328
|
-
for c, v in await Transaction.filter(sender=self,
|
|
329
|
-
.
|
|
329
|
+
c: v * 10 ** (-s)
|
|
330
|
+
for c, v, s in await Transaction.filter(sender=self, status__gt=TransactionStatus.request)
|
|
331
|
+
.prefetch_related("cur")
|
|
332
|
+
.group_by("cur_id", "cur__scale")
|
|
330
333
|
.annotate(credit=Sum("amount"))
|
|
331
|
-
.values_list("cur_id", "credit")
|
|
334
|
+
.values_list("cur_id", "credit", "cur__scale")
|
|
332
335
|
}
|
|
333
336
|
return {c: dbt.get(c, 0) - crd.get(c, 0) for c in dbt.keys() | crd.keys()}
|
|
334
337
|
|
|
@@ -380,11 +383,12 @@ class User(TgUser, TsTrait):
|
|
|
380
383
|
|
|
381
384
|
async def send(self, amount: int, cur_id: int, receiver_id: int) -> "Transaction":
|
|
382
385
|
b = await self.balance_xp(cur_id=cur_id)
|
|
383
|
-
|
|
386
|
+
if b < amount:
|
|
387
|
+
return b
|
|
384
388
|
transaction = await Transaction.create(
|
|
385
389
|
sender=self,
|
|
386
390
|
receiver_id=receiver_id,
|
|
387
|
-
amount=amount,
|
|
391
|
+
amount=amount * 10**2,
|
|
388
392
|
cur_id=cur_id,
|
|
389
393
|
validator_id=await self.get_val_id(amount, cur_id, receiver_id),
|
|
390
394
|
status=TransactionStatus.transfer,
|
|
@@ -403,7 +407,7 @@ class User(TgUser, TsTrait):
|
|
|
403
407
|
req.validator_id = await self.get_val_id(req.amount, req.cur_id, req.receiver_id)
|
|
404
408
|
req.status = TransactionStatus.transfer
|
|
405
409
|
req.ts = datetime.now()
|
|
406
|
-
req.proof = sender_prv.sign(req.pack
|
|
410
|
+
req.proof = sender_prv.sign(req.pack)
|
|
407
411
|
await req.save()
|
|
408
412
|
return req
|
|
409
413
|
# async with in_transaction():
|
|
@@ -1008,10 +1012,30 @@ class Transaction(Model):
|
|
|
1008
1012
|
assert self.proof is None, "It is method for requests only"
|
|
1009
1013
|
return self.sender_id is None or self.sender_id == sender_id
|
|
1010
1014
|
|
|
1015
|
+
@property
|
|
1011
1016
|
def pack(self) -> bytes:
|
|
1012
|
-
|
|
1017
|
+
if self.status == TransactionStatus.request:
|
|
1018
|
+
"""Упаковка запроса в 4+4+4+8+2+4=22 байт"""
|
|
1019
|
+
fmt = ">LLBL"
|
|
1020
|
+
vals = self.id, self.receiver_id, self.cur_id, self.amount
|
|
1021
|
+
if self.sender_id:
|
|
1022
|
+
fmt += "L"
|
|
1023
|
+
vals += (self.sender_id,)
|
|
1024
|
+
if self.ts:
|
|
1025
|
+
fmt += "L"
|
|
1026
|
+
vals += (int((datetime.now() + timedelta(minutes=self.ts)).timestamp()),)
|
|
1027
|
+
return struct.pack(fmt, *vals)
|
|
1028
|
+
"""Упаковка перевода в 4+4+8+2+4+(64/128)=86/150 байт"""
|
|
1029
|
+
proof = self.proof or b""
|
|
1013
1030
|
return struct.pack(
|
|
1014
|
-
">
|
|
1031
|
+
f">LLLQHL{len(proof)}s",
|
|
1032
|
+
self.id,
|
|
1033
|
+
self.sender_id,
|
|
1034
|
+
self.receiver_id,
|
|
1035
|
+
self.amount,
|
|
1036
|
+
self.cur_id,
|
|
1037
|
+
int(self.ts.timestamp()),
|
|
1038
|
+
proof,
|
|
1015
1039
|
)
|
|
1016
1040
|
|
|
1017
1041
|
async def sender_sign(self):
|
|
@@ -1022,7 +1046,7 @@ class Transaction(Model):
|
|
|
1022
1046
|
): # todo: remove check
|
|
1023
1047
|
await self.sender.keygen()
|
|
1024
1048
|
sender_prv = Ed25519PrivateKey.from_private_bytes(self.sender.prv)
|
|
1025
|
-
self.proof = sender_prv.sign(self.pack
|
|
1049
|
+
self.proof = sender_prv.sign(self.pack)
|
|
1026
1050
|
await self.save(update_fields=["proof"])
|
|
1027
1051
|
|
|
1028
1052
|
async def vld_sign(self):
|
|
@@ -1032,7 +1056,7 @@ class Transaction(Model):
|
|
|
1032
1056
|
await self.validator.keygen()
|
|
1033
1057
|
# 1. Проверяем подпись отправителя
|
|
1034
1058
|
snd_pub = Ed25519PublicKey.from_public_bytes(self.sender.pub)
|
|
1035
|
-
snd_pub.verify(self.proof, (trans_packed := self.pack
|
|
1059
|
+
snd_pub.verify(self.proof, (trans_packed := self.pack))
|
|
1036
1060
|
# 2. Подписываем
|
|
1037
1061
|
pk = Ed25519PrivateKey.from_private_bytes(self.validator.prv)
|
|
1038
1062
|
self.proof += pk.sign(trans_packed + self.proof)
|
|
@@ -1048,7 +1072,7 @@ class Transaction(Model):
|
|
|
1048
1072
|
try:
|
|
1049
1073
|
# Проверяем подпись валидатора
|
|
1050
1074
|
vld_pub = Ed25519PublicKey.from_public_bytes(self.validator.pub)
|
|
1051
|
-
vld_pub.verify(vld_sig, self.pack
|
|
1075
|
+
vld_pub.verify(vld_sig, self.pack + sender_sig)
|
|
1052
1076
|
return True
|
|
1053
1077
|
except InvalidSignature as _:
|
|
1054
1078
|
return False # wring sign
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|