xync-client 0.0.43.dev17__tar.gz → 0.0.43.dev23__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.dev23}/PKG-INFO +1 -1
  2. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Ex.py +1 -1
  3. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/agent.py +46 -30
  4. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/agent.py +50 -3
  5. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/test.py +13 -2
  6. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23/xync_client.egg-info}/PKG-INFO +1 -1
  7. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/.env.sample +0 -0
  8. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/.gitignore +0 -0
  9. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/.pre-commit-config.yaml +0 -0
  10. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/README.md +0 -0
  11. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/makefile +0 -0
  12. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/pyproject.toml +0 -0
  13. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/setup.cfg +0 -0
  14. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestAgent.py +0 -0
  15. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestAsset.py +0 -0
  16. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestEx.py +0 -0
  17. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestOrder.py +0 -0
  18. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Binance/test_binance.py +0 -0
  19. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  20. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  21. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Gate/test_gate.py +0 -0
  22. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  23. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  24. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  25. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/__init__.py +0 -0
  26. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/_test_ex.py +0 -0
  27. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Agent.py +0 -0
  28. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Asset.py +0 -0
  29. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/AuthTrait.py +0 -0
  30. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Base.py +0 -0
  31. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/BaseTest.py +0 -0
  32. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/InAgent.py +0 -0
  33. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Order.py +0 -0
  34. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/types.py +0 -0
  35. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/__init__.py +0 -0
  36. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/binance_async.py +0 -0
  37. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/earn_api.py +0 -0
  38. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/etype/ad.py +0 -0
  39. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/etype/pm.py +0 -0
  40. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/ex.py +0 -0
  41. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/exceptions.py +0 -0
  42. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/sapi.py +0 -0
  43. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/web_c2c.py +0 -0
  44. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/__init__.py +0 -0
  45. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/agent.py +0 -0
  46. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/base.py +0 -0
  47. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/etype/ad.py +0 -0
  48. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/etype/pm.py +0 -0
  49. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/ex.py +0 -0
  50. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/req.mjs +0 -0
  51. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/sign.js +0 -0
  52. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/__init__.py +0 -0
  53. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/agent.py +0 -0
  54. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/etype/ad.py +0 -0
  55. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/ex.py +0 -0
  56. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/req.mjs +0 -0
  57. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitPapa/ex.py +0 -0
  58. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/InAgent.py +0 -0
  59. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/etype/ad.py +0 -0
  60. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/etype/cred.py +0 -0
  61. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/etype/order.py +0 -0
  62. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/ex.py +0 -0
  63. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/web_earn.py +0 -0
  64. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/web_p2p.py +0 -0
  65. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/ws.py +0 -0
  66. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Gate/etype/ad.py +0 -0
  67. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Gate/ex.py +0 -0
  68. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Gate/premarket.py +0 -0
  69. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/earn.py +0 -0
  70. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/__init__.py +0 -0
  71. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/ad.py +0 -0
  72. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/cred.py +0 -0
  73. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/pm.py +0 -0
  74. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/ex.py +0 -0
  75. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/etype/ad.py +0 -0
  76. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/etype/pm.py +0 -0
  77. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/ex.py +0 -0
  78. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/web.py +0 -0
  79. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Mexc/etype/ad.py +0 -0
  80. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Mexc/etype/pm.py +0 -0
  81. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Mexc/ex.py +0 -0
  82. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Okx/etype/ad.py +0 -0
  83. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Okx/etype/pm.py +0 -0
  84. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Okx/ex.py +0 -0
  85. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/__init__.py +0 -0
  86. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  87. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  88. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/api.py +0 -0
  89. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/agent.py +0 -0
  90. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/asset.py +0 -0
  91. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/auth.py +0 -0
  92. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/ex.py +0 -0
  93. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/inAgent.py +0 -0
  94. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/order.py +0 -0
  95. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/pyd.py +0 -0
  96. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/pyro.py +0 -0
  97. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/web.py +0 -0
  98. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/__init__.py +0 -0
  99. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/loader.py +0 -0
  100. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/pm_unifier.py +0 -0
  101. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/pyro.py +0 -0
  102. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/SOURCES.txt +0 -0
  103. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/dependency_links.txt +0 -0
  104. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/requires.txt +0 -0
  105. {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/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.dev23
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,14 @@
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 requests
11
+ import logging
8
12
 
9
13
  url_ads_req = "https://otc-cf.huobi.com/v1/data/trade-market"
10
14
  url_ads_web = "https://www.huobi.com/en-us/fiat-crypto/trade/"
@@ -19,11 +23,52 @@ class Public(Client):
19
23
 
20
24
 
21
25
  class AgentClient(BaseAgentClient):
26
+ headers = {
27
+ "portal": "web",
28
+ }
29
+
22
30
  async def creds(self) -> list[test.CredEpyd]:
23
31
  resp = await self._get("/-/x/otc/v1/user/receipt-account")
24
32
  return [test.CredEpyd(**cred) for cred in resp["data"]]
25
33
 
26
- async def cred_del(self, cred_id: int) -> int: ...
34
+ async def cred_del(self, cred_id: int) -> int:
35
+ data = {
36
+ "id": f"{cred_id}",
37
+ "password": "1795f1297b5f0ee00b7c69883c41b9ad",
38
+ }
39
+
40
+ cred_del = requests.post("https://www.htx.com/-/x/otc/v1/user/receipt-account/remove", data).json()
41
+ if cred_del["message"] == "Success":
42
+ await (await models.CredEx.get(exid=cred_id)).delete()
43
+ return cred_del
44
+ else:
45
+ logging.error(cred_del)
46
+
47
+ async def dynamicModelInfo(self, ipayMethodIds: str):
48
+ resp = await self._get("/-/x/otc/v1/user/receipt-account/dynamicModelInfo", {"payMethodIds": ipayMethodIds})
49
+ return resp["data"]["modelFields"]
50
+
51
+ async def cred_new(self, cred: models.Cred):
52
+ pmcur = await cred.pmcur
53
+ exid = await models.Pmex.get(pm_id=pmcur.pm_id, ex=self.ex_client.ex).values_list("exid", flat=True)
54
+ field_map = {
55
+ "payee": "name",
56
+ "bank": "extra",
57
+ "sub_bank": "extra",
58
+ "pay_account": "detail",
59
+ }
60
+ fields = {f["fieldType"]: f["fieldId"] for f in await self.dynamicModelInfo(exid)}
61
+ # Данные, где modelFields теперь список ModelField
62
+ data = {
63
+ "payMethod": exid,
64
+ "password": "6a4375c505726dacd1ed4678a9a8cf6b",
65
+ "modelFields": dumps(
66
+ [{"fieldId": fid, "fieldType": ft, "value": getattr(cred, field_map[ft])} for ft, fid in fields.items()]
67
+ ),
68
+ }
69
+ resp = await self._post("/-/x/otc/v1/user/receipt-account/addByDynamicModel", data)
70
+ cred_new = test.ModelFields(id=resp["data"]["bankId"], **resp)
71
+ return cred_new
27
72
 
28
73
  # 0
29
74
  async def get_orders(
@@ -133,7 +178,9 @@ async def _test():
133
178
  await models.Actor.filter(ex_id=15, agent__isnull=False).prefetch_related("ex", "agent", "person__user").first()
134
179
  )
135
180
  cl: AgentClient = actor.client()
136
- await cl.creds()
181
+ _creds = await cl.creds()
182
+ cred = await models.Cred[89]
183
+ await cl.cred_new(cred)
137
184
  await models.Coin.get(ticker="USDT")
138
185
  await models.Cur.get(ticker="RUB")
139
186
  await cl.close()
@@ -2,7 +2,7 @@ from typing import List, Optional, Dict, Any
2
2
  from pydantic import BaseModel
3
3
  from xync_client.Abc.types import CredExOut
4
4
 
5
- class ModelField(BaseModel):
5
+ class ModelFieldsList(BaseModel):
6
6
  fieldId: str
7
7
  name: str
8
8
  fieldType: str
@@ -28,6 +28,17 @@ class CredEpyd(CredExOut):
28
28
  sellingEnable: bool
29
29
  disabledCurrencyList: List[int]
30
30
  modelFields: str
31
- modelFieldsList: List[ModelField]
31
+ modelFieldsList: List[ModelFieldsList]
32
32
  color: str
33
33
  payMethodName: str
34
+
35
+ class ApiResponseData(BaseModel):
36
+ bankId: int
37
+
38
+ class ModelFields(CredExOut):
39
+ code: int
40
+ data: ApiResponseData
41
+ extend: None = None
42
+ message: str
43
+ success: bool
44
+
@@ -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.dev23
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