xync-client 0.0.43.dev17__tar.gz → 0.0.43.dev24__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 (105) hide show
  1. {xync_client-0.0.43.dev17/xync_client.egg-info → xync_client-0.0.43.dev24}/PKG-INFO +1 -1
  2. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/Ex.py +1 -1
  3. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/agent.py +46 -30
  4. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/agent.py +50 -5
  5. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/etype/test.py +21 -8
  6. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24/xync_client.egg-info}/PKG-INFO +1 -1
  7. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/.env.sample +0 -0
  8. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/.gitignore +0 -0
  9. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/.pre-commit-config.yaml +0 -0
  10. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/README.md +0 -0
  11. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/makefile +0 -0
  12. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/pyproject.toml +0 -0
  13. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/setup.cfg +0 -0
  14. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/TestAgent.py +0 -0
  15. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/TestAsset.py +0 -0
  16. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/TestEx.py +0 -0
  17. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/TestOrder.py +0 -0
  18. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Binance/test_binance.py +0 -0
  19. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  20. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  21. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Gate/test_gate.py +0 -0
  22. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  23. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  24. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  25. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/__init__.py +0 -0
  26. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/tests/_todo_refact/_test_ex.py +0 -0
  27. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/Agent.py +0 -0
  28. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/Asset.py +0 -0
  29. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/AuthTrait.py +0 -0
  30. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/Base.py +0 -0
  31. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/BaseTest.py +0 -0
  32. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/InAgent.py +0 -0
  33. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/Order.py +0 -0
  34. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Abc/types.py +0 -0
  35. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/__init__.py +0 -0
  36. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/binance_async.py +0 -0
  37. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/earn_api.py +0 -0
  38. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/etype/ad.py +0 -0
  39. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/etype/pm.py +0 -0
  40. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/ex.py +0 -0
  41. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/exceptions.py +0 -0
  42. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/sapi.py +0 -0
  43. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Binance/web_c2c.py +0 -0
  44. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/__init__.py +0 -0
  45. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/agent.py +0 -0
  46. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/base.py +0 -0
  47. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/etype/ad.py +0 -0
  48. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/etype/pm.py +0 -0
  49. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/ex.py +0 -0
  50. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/req.mjs +0 -0
  51. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BingX/sign.js +0 -0
  52. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BitGet/__init__.py +0 -0
  53. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BitGet/agent.py +0 -0
  54. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BitGet/etype/ad.py +0 -0
  55. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BitGet/ex.py +0 -0
  56. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BitGet/req.mjs +0 -0
  57. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/BitPapa/ex.py +0 -0
  58. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/InAgent.py +0 -0
  59. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/etype/ad.py +0 -0
  60. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/etype/cred.py +0 -0
  61. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/etype/order.py +0 -0
  62. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/ex.py +0 -0
  63. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/web_earn.py +0 -0
  64. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/web_p2p.py +0 -0
  65. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Bybit/ws.py +0 -0
  66. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Gate/etype/ad.py +0 -0
  67. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Gate/ex.py +0 -0
  68. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Gate/premarket.py +0 -0
  69. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/earn.py +0 -0
  70. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/etype/__init__.py +0 -0
  71. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/etype/ad.py +0 -0
  72. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/etype/cred.py +0 -0
  73. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/etype/pm.py +0 -0
  74. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Htx/ex.py +0 -0
  75. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/KuCoin/etype/ad.py +0 -0
  76. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/KuCoin/etype/pm.py +0 -0
  77. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/KuCoin/ex.py +0 -0
  78. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/KuCoin/web.py +0 -0
  79. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Mexc/etype/ad.py +0 -0
  80. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Mexc/etype/pm.py +0 -0
  81. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Mexc/ex.py +0 -0
  82. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Okx/etype/ad.py +0 -0
  83. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Okx/etype/pm.py +0 -0
  84. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Okx/ex.py +0 -0
  85. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Pms/Volet/__init__.py +0 -0
  86. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  87. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  88. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/Pms/Volet/api.py +0 -0
  89. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/agent.py +0 -0
  90. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/asset.py +0 -0
  91. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/auth.py +0 -0
  92. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/ex.py +0 -0
  93. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/inAgent.py +0 -0
  94. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/order.py +0 -0
  95. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/pyd.py +0 -0
  96. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/pyro.py +0 -0
  97. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/TgWallet/web.py +0 -0
  98. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/__init__.py +0 -0
  99. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/loader.py +0 -0
  100. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/pm_unifier.py +0 -0
  101. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client/pyro.py +0 -0
  102. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client.egg-info/SOURCES.txt +0 -0
  103. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client.egg-info/dependency_links.txt +0 -0
  104. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client.egg-info/requires.txt +0 -0
  105. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev24}/xync_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.43.dev17
3
+ Version: 0.0.43.dev24
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client
@@ -7,7 +7,7 @@ from aiohttp import ClientSession
7
7
  from msgspec import Struct
8
8
  from tortoise.exceptions import MultipleObjectsReturned, IntegrityError
9
9
  from xync_schema import models
10
- from xync_schema.enums import FileType, df_curs
10
+ from xync_schema.enums import FileType
11
11
  from xync_schema.types import CurEx, CoinEx, BaseAd, BaseAdIn
12
12
 
13
13
  from xync_client.Abc.Base import BaseClient, MapOfIdsList
@@ -364,47 +364,67 @@ class AgentClient(BaseAgentClient): # Bybit client
364
364
  coin: models.Coin,
365
365
  cur: models.Cur,
366
366
  is_sell: bool,
367
- pms: dict[models.Pmex, models.CredEx],
368
- amount: float,
367
+ pms: list[str],
369
368
  ceil: float,
370
- place: int = 1,
369
+ volume: float = None,
370
+ place: int = 0,
371
371
  ):
372
372
  k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
373
+
374
+ creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.ex)
375
+ if not volume:
376
+ if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
377
+ # todo: we using the only one fiat exactly from THE FIRST cred
378
+ fiat = await models.Fiat.get(cred_id=list(creds.values())[0].cred_id)
379
+ volume = fiat.amount / ceil
380
+ else: # гонка в стакане покупки - мы продаем МОНЕТУ за фиат
381
+ asset = await models.Asset.get(addr__actor=self.actor, addr__coin=coin)
382
+ volume = asset.free - (asset.freeze or 0) - (asset.lock or 0)
383
+
384
+ volume = str(round(volume, coin.scale))
385
+
386
+ credex_ids = [str(p.exid) for p in creds.values()]
387
+
373
388
  while self.actor.person.user.status > 0:
374
- ads: list[Ad] = await self.ads(coin, cur, is_sell, list(pms.keys()))
389
+ ads: list[Ad] = await self.ads(coin, cur, is_sell, list(creds.keys()))
375
390
  idiot_maker_filter(ads, ceil, k)
376
391
  cur_plc = [i for i, ad in enumerate(ads) if int(ad.accountId) == self.actor.exid][0]
377
392
  mad: Ad = ads.pop(cur_plc)
393
+ if not ads:
394
+ await sleep(60)
395
+ continue
378
396
  # чью цену будем обгонять, предыдущей или слещующей объявы?
379
397
  cad: Ad = ads[place] if cur_plc > place else ads[cur_plc]
380
398
  # а цена обгоняемой объявы не выше нашего потолка?
381
399
  if (float(cad.price) - ceil) * k < 0:
382
400
  # тогда берем следующую
383
401
  cad = ads[cur_plc]
384
- cprice = float(cad.price)
385
- new_price = round(cprice - k * step(mad, cad), cur.scale)
386
- if mad.price == f"%.{cur.scale}f" % new_price:
402
+ new_price = round(float(cad.price) - k * step(mad, cad), cur.scale)
403
+ if mad.price == f"%.{cur.scale}f" % new_price: # Если нужная цена и так уже стоит
387
404
  print(end="v" if is_sell else "^", flush=True)
388
405
  await sleep(2)
389
406
  continue
390
407
  if cad.priceType: # Если цена конкурента плавающая, то повышаем себе не цену, а %
391
- mad.premium = str(round(float(cad.premium) - k * step(mad, cad), 2))
408
+ new_premium = str(round(float(cad.premium) - k * step(mad, cad), 2))
409
+ if mad.premium == new_premium: # Если нужный % и так уже стоит
410
+ print(end="v" if is_sell else "^", flush=True)
411
+ await sleep(2)
412
+ continue
413
+ mad.premium = new_premium
392
414
  mad.priceType = cad.priceType
393
415
  mad.price = str(new_price)
394
- mad.quantity = str(round(amount, coin.scale))
416
+ mad.quantity = volume
395
417
  mad.maxAmount = str(2_000_000)
396
- req = AdUpdateRequest.model_validate(
397
- {**mad.model_dump(), "paymentIds": [str(p.exid) for p in pms.values()]}
398
- )
418
+ req = AdUpdateRequest.model_validate({**mad.model_dump(), "paymentIds": credex_ids})
399
419
  try:
400
420
  _res = self.ad_upd(req)
401
421
  except FailedRequestError:
402
422
  # logging.error(e.message)
403
- await sleep(51)
423
+ await sleep(49)
404
424
  except (ReadTimeoutError, ConnectionDoesNotExistError):
405
425
  logging.warning("Connection failed. Restarting..")
406
426
  print("-" if is_sell else "+", end=req.price, flush=True)
407
- await sleep(40)
427
+ await sleep(42)
408
428
 
409
429
 
410
430
  def step(mad, cad) -> float:
@@ -418,7 +438,7 @@ def step(mad, cad) -> float:
418
438
 
419
439
  def idiot_maker_filter(ads: list[Ad], ceil: float, k: Literal[-1, 1]):
420
440
  # игнорим ads с ценами >+5% моего страховочного потолка
421
- if (ceil * (1 - k * 0.04) - float(ads[0].price)) * k > 0:
441
+ if ads and (ceil * (1 - k * 0.04) - float(ads[0].price)) * k > 0:
422
442
  ads.pop(0)
423
443
  idiot_maker_filter(ads, ceil, k)
424
444
 
@@ -427,10 +447,9 @@ def listen(data: dict):
427
447
  print(data)
428
448
 
429
449
 
430
- async def get_creds(norms: list[str], ex_id: int) -> dict[models.Pmex, models.CredEx]:
450
+ async def get_creds(norms: list[str], ex: models.Ex) -> dict[models.Pmex, models.CredEx]:
431
451
  return {
432
- await models.Pmex.get(ex_id=ex_id, pm__norm=n): await models.CredEx.get(ex_id=ex_id, cred__pmcur__pm__norm=n)
433
- for n in norms
452
+ await models.Pmex.get(ex=ex, pm__norm=n): await models.CredEx.get(ex=ex, cred__pmcur__pm__norm=n) for n in norms
434
453
  }
435
454
 
436
455
 
@@ -444,24 +463,21 @@ async def main():
444
463
  usdt = await models.Coin.get(ticker="USDT")
445
464
  btc = await models.Coin.get(ticker="BTC")
446
465
  eth = await models.Coin.get(ticker="ETH")
466
+ usdc = await models.Coin.get(ticker="USDC")
447
467
  rub = await models.Cur.get(ticker="RUB")
448
468
  # await models.Direction.get(
449
469
  # pairex__ex=cl.ex, pairex__pair__coin__ticker="USDT", pairex__pair__cur__ticker="RUB", sell=True
450
470
  # )
451
- usdt_asset = await models.Asset.get(addr__actor=actor, addr__coin=usdt)
452
- btc_asset = await models.Asset.get(addr__actor=actor, addr__coin=btc)
453
- eth_asset = await models.Asset.get(addr__actor=actor, addr__coin=eth)
454
- creds = await get_creds(["volet"], 9)
455
- volet = await models.Fiat.get(cred_id=list(creds.values())[0].cred_id)
456
- usdt_amount = usdt_asset.free - (usdt_asset.freeze or 0) - (usdt_asset.lock or 0)
457
- btc_asset.free - (btc_asset.freeze or 0) - (btc_asset.lock or 0)
458
- eth_asset.free - (eth_asset.freeze or 0) - (eth_asset.lock or 0)
459
471
  # await cl.set_creds()
460
472
  await gather(
461
- cl.battle(usdt, rub, False, creds, usdt_amount, 85.39, 0), # гонка в стакане покупки - мы продаем
462
- cl.battle(usdt, rub, True, creds, volet.amount / 82, 82, 0), # гонка в стакане продажи - мы покупаем
463
- cl.battle(eth, rub, True, creds, volet.amount / 144_000, 144_000, 0),
464
- cl.battle(btc, rub, True, creds, volet.amount / 7_600_000, 7_600_000, 0),
473
+ cl.battle(usdt, rub, False, ["volet"], 85.39), # гонка в стакане покупки - мы продаем
474
+ cl.battle(usdt, rub, True, ["volet"], 82), # гонка в стакане продажи - мы покупаем
475
+ cl.battle(eth, rub, False, ["volet"], 160_000),
476
+ cl.battle(eth, rub, True, ["volet"], 144_000),
477
+ cl.battle(btc, rub, False, ["volet"], 8_700_000),
478
+ cl.battle(btc, rub, True, ["volet"], 7_600_000),
479
+ cl.battle(usdc, rub, True, ["volet"], 82),
480
+ cl.battle(usdc, rub, False, ["volet"], 86),
465
481
  )
466
482
 
467
483
  bor = BaseOrderReq(
@@ -1,10 +1,13 @@
1
+ from json import dumps
2
+
1
3
  from x_client.aiohttp import Client
2
4
  from xync_schema.enums import AdStatus, PmType, OrderStatus
3
5
  from xync_schema.models import Pm, Coin, Cur, Ad, Order
4
-
6
+ from xync_schema import models
5
7
  from xync_client.Abc.Agent import BaseAgentClient
6
8
  from xync_client.Htx.etype import test
7
9
 
10
+ import logging
8
11
 
9
12
  url_ads_req = "https://otc-cf.huobi.com/v1/data/trade-market"
10
13
  url_ads_web = "https://www.huobi.com/en-us/fiat-crypto/trade/"
@@ -19,11 +22,52 @@ class Public(Client):
19
22
 
20
23
 
21
24
  class AgentClient(BaseAgentClient):
25
+ headers = {
26
+ "portal": "web",
27
+ }
28
+
22
29
  async def creds(self) -> list[test.CredEpyd]:
23
30
  resp = await self._get("/-/x/otc/v1/user/receipt-account")
24
31
  return [test.CredEpyd(**cred) for cred in resp["data"]]
25
32
 
26
- async def cred_del(self, cred_id: int) -> int: ...
33
+ async def cred_del(self, cred_id: int) -> int:
34
+ data = {"id": str(cred_id), "password": self.actor.agent.auth["password"]}
35
+
36
+ cred_del = await self._post("/-/x/otc/v1/user/receipt-account/remove", data=data)
37
+ if cred_del["message"] == "Success":
38
+ await (await models.CredEx.get(exid=cred_id)).delete()
39
+ return cred_id
40
+ else:
41
+ logging.error(cred_del)
42
+
43
+ async def dynamicModelInfo(self, pids: str):
44
+ resp = await self._get("/-/x/otc/v1/user/receipt-account/dynamicModelInfo", {"payMethodIds": pids})
45
+ return resp["data"]["modelFields"]
46
+
47
+ async def cred_new(self, cred: models.Cred) -> models.CredEx:
48
+ pmcur = await cred.pmcur
49
+ exid = str(await models.Pmex.get(pm_id=pmcur.pm_id, ex=self.ex_client.ex).values_list("exid", flat=True))
50
+ field_map = {
51
+ "payee": "name",
52
+ "bank": "extra",
53
+ "sub_bank": "extra",
54
+ "pay_account": "detail",
55
+ }
56
+ fields = {f["fieldType"]: f["fieldId"] for f in await self.dynamicModelInfo(exid)}
57
+ # Данные, где modelFields теперь список ModelField
58
+ data = {
59
+ "payMethod": exid,
60
+ "password": self.actor.agent.auth["password"],
61
+ "modelFields": dumps(
62
+ [{"fieldId": fid, "fieldType": ft, "value": getattr(cred, field_map[ft])} for ft, fid in fields.items()]
63
+ ),
64
+ }
65
+ resp = await self._post("/-/x/otc/v1/user/receipt-account/addByDynamicModel", data=data)
66
+ if not resp["success"]:
67
+ logging.exception(resp["message"])
68
+ res = test.Result(**resp)
69
+ credex, _ = await models.CredEx.update_or_create({"cred": cred, "ex": self.ex}, exid=res.data.id)
70
+ return credex
27
71
 
28
72
  # 0
29
73
  async def get_orders(
@@ -133,9 +177,10 @@ async def _test():
133
177
  await models.Actor.filter(ex_id=15, agent__isnull=False).prefetch_related("ex", "agent", "person__user").first()
134
178
  )
135
179
  cl: AgentClient = actor.client()
136
- await cl.creds()
137
- await models.Coin.get(ticker="USDT")
138
- await models.Cur.get(ticker="RUB")
180
+ cred = await models.Cred[89]
181
+ _ = await cl.cred_new(cred)
182
+ _creds = await cl.creds()
183
+ # _ = await cl.cred_del(16984748)
139
184
  await cl.close()
140
185
 
141
186
 
@@ -1,7 +1,7 @@
1
- from typing import List, Optional, Dict, Any
2
- from pydantic import BaseModel
1
+ from pydantic import BaseModel, Field
3
2
  from xync_client.Abc.types import CredExOut
4
3
 
4
+
5
5
  class ModelField(BaseModel):
6
6
  fieldId: str
7
7
  name: str
@@ -11,8 +11,9 @@ class ModelField(BaseModel):
11
11
  required: bool
12
12
  copyable: bool
13
13
  remindWord: str
14
- valueType: str
15
- value: str
14
+ valueType: str | None
15
+ value: str | None
16
+
16
17
 
17
18
  class CredEpyd(CredExOut):
18
19
  id: int
@@ -21,13 +22,25 @@ class CredEpyd(CredExOut):
21
22
  bankType: int
22
23
  bankNumber: str
23
24
  bankName: str
24
- bankAddress: Optional[str] = None
25
- qrCode: Optional[str] = None
25
+ bankAddress: str | None = None
26
+ qrCode: str | None = None
26
27
  isShow: int
27
28
  buyingEnable: bool
28
29
  sellingEnable: bool
29
- disabledCurrencyList: List[int]
30
+ disabledCurrencyList: list[int]
30
31
  modelFields: str
31
- modelFieldsList: List[ModelField]
32
+ modelFieldsList: list[ModelField]
32
33
  color: str
33
34
  payMethodName: str
35
+
36
+
37
+ class CredExId(CredExOut):
38
+ id: int = Field(validation_alias="bankId")
39
+
40
+
41
+ class Result(BaseModel):
42
+ code: int
43
+ data: CredExId
44
+ extend: str | None = None
45
+ message: str
46
+ success: bool
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.43.dev17
3
+ Version: 0.0.43.dev24
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client