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.
- {xync_client-0.0.43.dev17/xync_client.egg-info → xync_client-0.0.43.dev23}/PKG-INFO +1 -1
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Ex.py +1 -1
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/agent.py +46 -30
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/agent.py +50 -3
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/test.py +13 -2
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23/xync_client.egg-info}/PKG-INFO +1 -1
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/.env.sample +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/.gitignore +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/.pre-commit-config.yaml +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/README.md +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/makefile +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/pyproject.toml +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/setup.cfg +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestAgent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestAsset.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestEx.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/TestOrder.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Binance/test_binance.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Gate/test_gate.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Wallet/test_agent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Wallet/test_ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/_test_ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Agent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Asset.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/AuthTrait.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Base.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/BaseTest.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/InAgent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/Order.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Abc/types.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/binance_async.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/earn_api.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/etype/pm.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/exceptions.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/sapi.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Binance/web_c2c.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/agent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/base.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/etype/pm.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/req.mjs +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BingX/sign.js +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/agent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitGet/req.mjs +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/BitPapa/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/InAgent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/etype/cred.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/etype/order.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/web_earn.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/web_p2p.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Bybit/ws.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Gate/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Gate/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Gate/premarket.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/earn.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/cred.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/etype/pm.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Htx/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/etype/pm.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/KuCoin/web.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Mexc/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Mexc/etype/pm.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Mexc/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Okx/etype/ad.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Okx/etype/pm.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Okx/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/api.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/agent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/asset.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/auth.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/ex.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/inAgent.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/order.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/pyd.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/pyro.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/TgWallet/web.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/__init__.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/loader.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/pm_unifier.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/pyro.py +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/SOURCES.txt +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/dependency_links.txt +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/requires.txt +0 -0
- {xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/top_level.txt +0 -0
|
@@ -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
|
|
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:
|
|
368
|
-
amount: float,
|
|
367
|
+
pms: list[str],
|
|
369
368
|
ceil: float,
|
|
370
|
-
|
|
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(
|
|
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
|
-
|
|
385
|
-
new_price
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
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(
|
|
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],
|
|
450
|
+
async def get_creds(norms: list[str], ex: models.Ex) -> dict[models.Pmex, models.CredEx]:
|
|
431
451
|
return {
|
|
432
|
-
await models.Pmex.get(
|
|
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,
|
|
462
|
-
cl.battle(usdt, rub, True,
|
|
463
|
-
cl.battle(eth, rub,
|
|
464
|
-
cl.battle(
|
|
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
|
|
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[
|
|
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
|
+
|
|
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_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Binance/test_binance.py
RENAMED
|
File without changes
|
{xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Bybit/test_bybit.py
RENAMED
|
File without changes
|
{xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Bybit/test_bybit_p2p.py
RENAMED
|
File without changes
|
|
File without changes
|
{xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Htx/test_htx_p2p.py
RENAMED
|
File without changes
|
{xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/tests/_todo_refact/Wallet/test_agent.py
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/_todo_req/req.mjs
RENAMED
|
File without changes
|
{xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client/Pms/Volet/_todo_req/req.py
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.43.dev17 → xync_client-0.0.43.dev23}/xync_client.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|