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.
Files changed (19) hide show
  1. {xync_schema-0.0.34.dev1/xync_schema.egg-info → xync_schema-0.0.34.dev3}/PKG-INFO +1 -1
  2. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/models.py +43 -19
  3. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3/xync_schema.egg-info}/PKG-INFO +1 -1
  4. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/.env.sample +0 -0
  5. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/.gitignore +0 -0
  6. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/.pre-commit-config.yaml +0 -0
  7. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/README.md +0 -0
  8. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/makefile +0 -0
  9. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/pyproject.toml +0 -0
  10. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/setup.cfg +0 -0
  11. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/tests/__init__.py +0 -0
  12. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/tests/test_db.py +0 -0
  13. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/__init__.py +0 -0
  14. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/enums.py +0 -0
  15. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema/xtype.py +0 -0
  16. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/SOURCES.txt +0 -0
  17. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/dependency_links.txt +0 -0
  18. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/requires.txt +0 -0
  19. {xync_schema-0.0.34.dev1 → xync_schema-0.0.34.dev3}/xync_schema.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-schema
3
- Version: 0.0.34.dev1
3
+ Version: 0.0.34.dev3
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA
@@ -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) # , status=TransactionStatus.valid
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) # , status=TransactionStatus.valid
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
- return dbt[0] - crd[0]
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, status=TransactionStatus.valid)
322
- .group_by("cur_id")
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, status=TransactionStatus.valid)
329
- .group_by("cur_id")
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
- assert b >= amount, "not enough balance"
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
- """Упаковка транзакции(или запроса, если нет sent_at) в 4+4+8+2+4=22 байт"""
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
- ">LLQHL", self.sender_id or 0, self.receiver_id, self.amount or 0, self.cur_id, int(self.ts.timestamp())
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() + sender_sig)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-schema
3
- Version: 0.0.34.dev1
3
+ Version: 0.0.34.dev3
4
4
  Summary: XyncNet project database model schema
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: EULA