xync-client 0.0.25.dev45__tar.gz → 0.0.25.dev46__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 (85) hide show
  1. {xync_client-0.0.25.dev45/xync_client.egg-info → xync_client-0.0.25.dev46}/PKG-INFO +1 -1
  2. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/Ex.py +6 -6
  3. xync_client-0.0.25.dev46/xync_client/Abc/types.py +36 -0
  4. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/ex.py +7 -5
  5. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/pm_unifier.py +2 -3
  6. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46/xync_client.egg-info}/PKG-INFO +1 -1
  7. xync_client-0.0.25.dev45/xync_client/Abc/types.py +0 -32
  8. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/.env.sample +0 -0
  9. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/.gitignore +0 -0
  10. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/.pre-commit-config.yaml +0 -0
  11. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/README.md +0 -0
  12. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/makefile +0 -0
  13. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/pyproject.toml +0 -0
  14. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/setup.cfg +0 -0
  15. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/TestAgent.py +0 -0
  16. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/TestAsset.py +0 -0
  17. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/TestEx.py +0 -0
  18. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/TestOrder.py +0 -0
  19. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Binance/test_binance.py +0 -0
  20. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  21. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  22. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Gate/test_gate.py +0 -0
  23. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  24. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  25. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  26. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/__init__.py +0 -0
  27. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/tests/_todo_refact/_test_ex.py +0 -0
  28. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/Agent.py +0 -0
  29. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/Asset.py +0 -0
  30. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/AuthTrait.py +0 -0
  31. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/Base.py +0 -0
  32. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/BaseTest.py +0 -0
  33. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/InAgent.py +0 -0
  34. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Abc/Order.py +0 -0
  35. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/__init__.py +0 -0
  36. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/binance_async.py +0 -0
  37. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/earn_api.py +0 -0
  38. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/ex.py +0 -0
  39. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/exceptions.py +0 -0
  40. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/sapi.py +0 -0
  41. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Binance/web_c2c.py +0 -0
  42. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/__init__.py +0 -0
  43. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/agent.py +0 -0
  44. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/base.py +0 -0
  45. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/ex.py +0 -0
  46. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/pyd.py +0 -0
  47. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/req.mjs +0 -0
  48. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/sign.js +0 -0
  49. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BingX/test/main.py +0 -0
  50. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BitGet/__init__.py +0 -0
  51. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BitGet/agent.py +0 -0
  52. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BitGet/ex.py +0 -0
  53. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/BitGet/req.mjs +0 -0
  54. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Bybit/agent.py +0 -0
  55. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Bybit/ex.py +0 -0
  56. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Bybit/web_earn.py +0 -0
  57. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Bybit/web_p2p.py +0 -0
  58. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Gate/ex.py +0 -0
  59. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Gate/premarket.py +0 -0
  60. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/agent.py +0 -0
  61. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/earn.py +0 -0
  62. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/etype/__init__.py +0 -0
  63. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/etype/ad.py +7 -7
  64. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/etype/cred.py +0 -0
  65. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/etype/pm.py +0 -0
  66. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Htx/ex.py +0 -0
  67. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/KuCoin/pub.py +0 -0
  68. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/KuCoin/web.py +0 -0
  69. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Okx/ex.py +0 -0
  70. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/Okx/pyd.py +0 -0
  71. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/agent.py +0 -0
  72. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/asset.py +0 -0
  73. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/auth.py +0 -0
  74. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/inAgent.py +0 -0
  75. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/order.py +0 -0
  76. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/pyd.py +6 -6
  77. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/pyro.py +0 -0
  78. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/TgWallet/web.py +0 -0
  79. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/__init__.py +0 -0
  80. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/loader.py +0 -0
  81. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client/pyro.py +0 -0
  82. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client.egg-info/SOURCES.txt +0 -0
  83. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client.egg-info/dependency_links.txt +0 -0
  84. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client.egg-info/requires.txt +0 -0
  85. {xync_client-0.0.25.dev45 → xync_client-0.0.25.dev46}/xync_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xync-client
3
- Version: 0.0.25.dev45
3
+ Version: 0.0.25.dev46
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
@@ -3,7 +3,6 @@ from abc import abstractmethod
3
3
 
4
4
  import msgspec
5
5
  from msgspec import Struct
6
- from msgspec.structs import asdict
7
6
  from tortoise.exceptions import MultipleObjectsReturned, IntegrityError
8
7
  from xync_schema import models
9
8
  from xync_schema.types import CurEx, CoinEx, BaseAd, BaseAdIn
@@ -68,7 +67,9 @@ class BaseExClient(BaseClient):
68
67
  cur_pyd.exid: (await models.Cur.update_or_create({"rate": cur_pyd.rate}, ticker=tkr))[0]
69
68
  for tkr, cur_pyd in cur_pyds.items()
70
69
  }
71
- curexs = [models.Curex(**asdict(c), cur=curs[c.exid], ex=self.ex) for c in cur_pyds.values()]
70
+ curexs = [
71
+ models.Curex(**c.model_dump(exclude_none=True), cur=curs[c.exid], ex=self.ex) for c in cur_pyds.values()
72
+ ]
72
73
  # Curex
73
74
  await models.Curex.bulk_create(
74
75
  curexs, update_fields=["minimum", "rounding_scale"], on_conflict=["cur_id", "ex_id"]
@@ -145,9 +146,9 @@ class BaseExClient(BaseClient):
145
146
  # и добавляем.обновляем Pmex для него
146
147
  await models.Pmex.update_or_create({"pm": pm_}, ex=self.ex, exid=k, name=pm.name)
147
148
  else:
148
- pmin = PmIn(**{**asdict(pmu), "country": country, "typ": pm.typ, "logo": pm.logo})
149
+ pmin = PmIn(**{**pmu.model_dump(exclude_none=True), "country": country, "typ": pm.typ, "logo": pm.logo})
149
150
  try:
150
- pms[k], _ = await models.Pm.update_or_create(**pmin.df_unq(("country",)))
151
+ pms[k], _ = await models.Pm.update_or_create(**pmin.df_unq())
151
152
  except (MultipleObjectsReturned, IntegrityError) as e:
152
153
  raise e
153
154
  prev = k, pmu.norm, pm.name, pmu.country
@@ -191,8 +192,7 @@ class BaseExClient(BaseClient):
191
192
 
192
193
  # Сохранение чужого объявления (с Pm-ами) в бд
193
194
  async def ad_pydin2db(self, ad_pydin: BaseAdIn) -> models.Ad:
194
- df, unq = ad_pydin.args()
195
- ad_db, _ = await models.Ad.update_or_create(df, **unq)
195
+ ad_db, _ = await models.Ad.update_or_create(**ad_pydin.df_unq())
196
196
  if getattr(ad_pydin, "pms_", None): # if it ListItem, not Full One # todo: remove?
197
197
  await ad_db.pms.add(*ad_pydin.pms_)
198
198
  return ad_db
@@ -0,0 +1,36 @@
1
+ from pydantic import BaseModel
2
+ from x_model.types import New
3
+ from xync_schema.enums import PmType
4
+ from xync_schema.models import Country, Pm, Ex
5
+ from xync_schema.types import PmexBank
6
+
7
+ from xync_client.pm_unifier import PmUni
8
+
9
+
10
+ class PmTrait:
11
+ typ: PmType | None = None
12
+ logo: str | None = None
13
+ banks: list[PmexBank] | None = None
14
+
15
+
16
+ class PmEx(BaseModel, PmTrait):
17
+ exid: int | str
18
+ name: str
19
+
20
+
21
+ class PmIn(New, PmUni, PmTrait):
22
+ _unq = "norm", "country"
23
+ country: Country | None = None
24
+
25
+ class Config:
26
+ arbitrary_types_allowed = True
27
+
28
+
29
+ class PmExIn(BaseModel):
30
+ pm: Pm
31
+ ex: Ex
32
+ exid: int | str
33
+ name: str
34
+
35
+ class Config:
36
+ arbitrary_types_allowed = True
@@ -117,7 +117,7 @@ class ExClient(BaseExClient, AuthClient):
117
117
  pairex, _ = await models.PairEx.get_or_create(pair=pair, ex=self.ex)
118
118
  dr, _ = await models.Direction.get_or_create(pairex=pairex, sell=ad.is_sell)
119
119
  return types.BaseAdIn(
120
- exid=ad.id,
120
+ id=ad.exid,
121
121
  price=ad.price.value,
122
122
  min_fiat=ad.orderAmountLimits.min,
123
123
  max_fiat=ad.orderAmountLimits.max,
@@ -133,7 +133,8 @@ class ExClient(BaseExClient, AuthClient):
133
133
  adx.maker = actor
134
134
  pms = ad.paymentMethods if isinstance(ad, _PmsTrait) else [pd.paymentMethod for pd in ad.paymentDetails]
135
135
  return types.AdBuyIn(
136
- **adx.model_dump(), pms_=await models.Pm.filter(pmexs__ex=self.ex, pmexs__exid__in=[p.code for p in pms])
136
+ **adx.model_dump(by_alias=True),
137
+ pms_=await models.Pm.filter(pmexs__ex=self.ex, pmexs__exid__in=[p.code for p in pms]),
137
138
  )
138
139
 
139
140
 
@@ -141,9 +142,10 @@ async def _test():
141
142
  await init_db(PG_DSN, models, True)
142
143
  tgex = await models.Ex.get(name="TgWallet")
143
144
  cl: ExClient = tgex.client()
144
- await cl.pairs()
145
- await cl.set_pmcurexs()
146
- await cl.set_coinexs()
145
+ # await cl.pms()
146
+ # await cl.pairs()
147
+ # await cl.set_pmcurexs()
148
+ # await cl.set_coinexs()
147
149
 
148
150
  # # # SALE # # #
149
151
  # get ads list
@@ -1,9 +1,8 @@
1
1
  import re
2
+ from pydantic import BaseModel
2
3
 
3
- from msgspec import Struct
4
4
 
5
-
6
- class PmUni(Struct):
5
+ class PmUni(BaseModel):
7
6
  norm: str
8
7
  acronym: str = None
9
8
  country: str = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: xync-client
3
- Version: 0.0.25.dev45
3
+ Version: 0.0.25.dev46
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
@@ -1,32 +0,0 @@
1
- from msgspec import Struct
2
- from x_model.types import New
3
- from xync_schema.enums import PmType
4
- from xync_schema.models import Country, Pm, Ex
5
- from xync_schema.types import PmexBank
6
-
7
- from xync_client.pm_unifier import PmUni
8
-
9
-
10
- class PmEx(Struct):
11
- exid: int | str
12
- name: str
13
- # todo: duplicates
14
- typ: PmType = None
15
- logo: str = None
16
- banks: list[PmexBank] = None
17
-
18
-
19
- class PmIn(New, PmUni):
20
- _unq = "norm", "country"
21
- country: Country = None
22
- # todo: duplicates
23
- typ: PmType = None
24
- logo: str = None
25
- banks: list[PmexBank] = None
26
-
27
-
28
- class PmExIn(Struct):
29
- pm = Pm
30
- ex = Ex
31
- exid = int | str
32
- name = str
@@ -23,14 +23,10 @@ class Req(BaseModel):
23
23
  maxTradeLimit: float
24
24
  tradeCount: float
25
25
  password: str
26
- securityToken: str | None = ""
27
26
  payTerm: int
28
27
  isFixed: Literal["off", "on"]
29
28
  premium: int
30
- fixedPrice: str | None = ""
31
- autoReplyContent: str | None = ""
32
29
  isAutoReply: Literal["off", "on"]
33
- tradeRule: str | None = ""
34
30
  takerAcceptOrder: int
35
31
  isPayCode: Literal["off", "on"]
36
32
  isVerifyCapital: bool
@@ -43,6 +39,10 @@ class Req(BaseModel):
43
39
  apiVersion: int
44
40
  channel: str
45
41
  tradeRulesV2: list[TradeRule]
42
+ securityToken: str | None = ""
43
+ fixedPrice: str | None = ""
44
+ autoReplyContent: str | None = ""
45
+ tradeRule: str | None = ""
46
46
 
47
47
 
48
48
  class PayMethod(BaseModel):
@@ -69,10 +69,8 @@ class Resp(BaseAd):
69
69
  isOnline: bool
70
70
  isTrade: bool
71
71
  isVerifyCapital: bool
72
- labelName: str | None = None
73
72
  maxTradeLimit: str
74
73
  merchantLevel: int
75
- merchantTags: list[str] | None
76
74
  minTradeLimit: str
77
75
  orderCompleteRate: str
78
76
  payMethod: str
@@ -80,7 +78,6 @@ class Resp(BaseAd):
80
78
  payName: str # list[PayName] # приходит массив объектов внутри строки
81
79
  payTerm: int
82
80
  price: str
83
- seaViewRoom: str | None = None
84
81
  takerAcceptAmount: str
85
82
  takerAcceptOrder: int
86
83
  takerLimit: int
@@ -91,3 +88,6 @@ class Resp(BaseAd):
91
88
  tradeType: int
92
89
  uid: int
93
90
  userName: str
91
+ merchantTags: list[str] | None
92
+ labelName: str | None = None
93
+ seaViewRoom: str | None = None
@@ -17,8 +17,8 @@ class User(BaseModel):
17
17
  avatarCode: str
18
18
  statistics: UserStatistics
19
19
  isVerified: bool
20
- lastOnlineMinutesAgo: int | None = None
21
20
  onlineStatus: str
21
+ lastOnlineMinutesAgo: int | None = None
22
22
 
23
23
 
24
24
  class AvailableVolume(BaseModel):
@@ -69,13 +69,13 @@ class Fee(BaseModel):
69
69
 
70
70
 
71
71
  class KeyVal(BaseModel):
72
- name: Literal["PAYMENT_DETAILS_NUMBER", "PHONE"] = "PAYMENT_DETAILS_NUMBER"
73
72
  value: str
73
+ name: Literal["PAYMENT_DETAILS_NUMBER", "PHONE"] = "PAYMENT_DETAILS_NUMBER"
74
74
 
75
75
 
76
76
  class BanksIn(BaseModel):
77
- name: Literal["BANKS"] = "BANKS"
78
77
  value: list[str]
78
+ name: Literal["BANKS"] = "BANKS"
79
79
 
80
80
 
81
81
  class Bank(BaseModel):
@@ -89,8 +89,8 @@ class Banks(BanksIn):
89
89
 
90
90
 
91
91
  class Attrs(BaseModel):
92
- version: Literal["V1"] = "V1"
93
92
  values: list[KeyVal]
93
+ version: Literal["V1"] = "V1"
94
94
 
95
95
 
96
96
  class AttrsV2In(BaseModel):
@@ -125,8 +125,8 @@ class CredEpyd(BaseModel):
125
125
  userId: int
126
126
  paymentMethod: PmEpydRoot
127
127
  currency: str
128
- name: str = ""
129
128
  attributes: Attrs | AttrsV2
129
+ name: str = ""
130
130
 
131
131
 
132
132
  class InitVolume(BaseModel):
@@ -263,7 +263,6 @@ class OrderEpyd(BaseModel):
263
263
  buyer: User
264
264
  offerId: int
265
265
  offerType: AdType
266
- offerComment: str = ""
267
266
  isExpress: bool
268
267
  price: Price
269
268
  paymentDetails: CredEpyd
@@ -278,6 +277,7 @@ class OrderEpyd(BaseModel):
278
277
  status: OrderStatus
279
278
  changeLog: ChangeLog
280
279
  isAutoAccept: bool
280
+ offerComment: str = ""
281
281
 
282
282
  @computed_field
283
283
  @property