mexc-exchange-api 0.0.25__py3-none-any.whl → 0.0.27__py3-none-any.whl
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.
Potentially problematic release.
This version of mexc-exchange-api might be problematic. Click here for more details.
- mexc/ccxt/__init__.py +1 -1
- mexc/ccxt/async_support/__init__.py +1 -1
- mexc/ccxt/async_support/base/exchange.py +2 -2
- mexc/ccxt/async_support/mexc.py +50 -52
- mexc/ccxt/base/exchange.py +76 -3
- mexc/ccxt/mexc.py +50 -52
- mexc/ccxt/pro/__init__.py +1 -1
- {mexc_exchange_api-0.0.25.dist-info → mexc_exchange_api-0.0.27.dist-info}/METADATA +2 -1
- {mexc_exchange_api-0.0.25.dist-info → mexc_exchange_api-0.0.27.dist-info}/RECORD +10 -10
- {mexc_exchange_api-0.0.25.dist-info → mexc_exchange_api-0.0.27.dist-info}/WHEEL +0 -0
mexc/ccxt/__init__.py
CHANGED
|
@@ -26,7 +26,7 @@ sys.modules['ccxt'] = ccxt_module
|
|
|
26
26
|
|
|
27
27
|
# ----------------------------------------------------------------------------
|
|
28
28
|
|
|
29
|
-
__version__ = '4.4.
|
|
29
|
+
__version__ = '4.4.79'
|
|
30
30
|
|
|
31
31
|
# ----------------------------------------------------------------------------
|
|
32
32
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# -----------------------------------------------------------------------------
|
|
4
4
|
|
|
5
|
-
__version__ = '4.4.
|
|
5
|
+
__version__ = '4.4.79'
|
|
6
6
|
|
|
7
7
|
# -----------------------------------------------------------------------------
|
|
8
8
|
|
|
@@ -154,7 +154,7 @@ class Exchange(BaseExchange):
|
|
|
154
154
|
proxyUrl = self.check_proxy_url_settings(url, method, headers, body)
|
|
155
155
|
if proxyUrl is not None:
|
|
156
156
|
request_headers.update({'Origin': self.origin})
|
|
157
|
-
url = proxyUrl + url
|
|
157
|
+
url = proxyUrl + self.url_encoder_for_proxy_url(url)
|
|
158
158
|
# proxy agents
|
|
159
159
|
final_proxy = None # set default
|
|
160
160
|
proxy_session = None
|
mexc/ccxt/async_support/mexc.py
CHANGED
|
@@ -1098,80 +1098,47 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
1098
1098
|
id = self.safe_string(currency, 'coin')
|
|
1099
1099
|
code = self.safe_currency_code(id)
|
|
1100
1100
|
name = self.safe_string(currency, 'name')
|
|
1101
|
-
currencyActive = False
|
|
1102
|
-
currencyFee = None
|
|
1103
|
-
currencyWithdrawMin = None
|
|
1104
|
-
currencyWithdrawMax = None
|
|
1105
|
-
depositEnabled = False
|
|
1106
|
-
withdrawEnabled = False
|
|
1107
1101
|
networks: dict = {}
|
|
1108
1102
|
chains = self.safe_value(currency, 'networkList', [])
|
|
1109
1103
|
for j in range(0, len(chains)):
|
|
1110
1104
|
chain = chains[j]
|
|
1111
1105
|
networkId = self.safe_string_2(chain, 'netWork', 'network')
|
|
1112
1106
|
network = self.network_id_to_code(networkId)
|
|
1113
|
-
isDepositEnabled = self.safe_bool(chain, 'depositEnable', False)
|
|
1114
|
-
isWithdrawEnabled = self.safe_bool(chain, 'withdrawEnable', False)
|
|
1115
|
-
active = (isDepositEnabled and isWithdrawEnabled)
|
|
1116
|
-
currencyActive = active or currencyActive
|
|
1117
|
-
withdrawMin = self.safe_string(chain, 'withdrawMin')
|
|
1118
|
-
withdrawMax = self.safe_string(chain, 'withdrawMax')
|
|
1119
|
-
currencyWithdrawMin = withdrawMin if (currencyWithdrawMin is None) else currencyWithdrawMin
|
|
1120
|
-
currencyWithdrawMax = withdrawMax if (currencyWithdrawMax is None) else currencyWithdrawMax
|
|
1121
|
-
fee = self.safe_number(chain, 'withdrawFee')
|
|
1122
|
-
currencyFee = fee if (currencyFee is None) else currencyFee
|
|
1123
|
-
if Precise.string_gt(currencyWithdrawMin, withdrawMin):
|
|
1124
|
-
currencyWithdrawMin = withdrawMin
|
|
1125
|
-
if Precise.string_lt(currencyWithdrawMax, withdrawMax):
|
|
1126
|
-
currencyWithdrawMax = withdrawMax
|
|
1127
|
-
if isDepositEnabled:
|
|
1128
|
-
depositEnabled = True
|
|
1129
|
-
if isWithdrawEnabled:
|
|
1130
|
-
withdrawEnabled = True
|
|
1131
1107
|
networks[network] = {
|
|
1132
1108
|
'info': chain,
|
|
1133
1109
|
'id': networkId,
|
|
1134
1110
|
'network': network,
|
|
1135
|
-
'active':
|
|
1136
|
-
'deposit':
|
|
1137
|
-
'withdraw':
|
|
1138
|
-
'fee':
|
|
1111
|
+
'active': None,
|
|
1112
|
+
'deposit': self.safe_bool(chain, 'depositEnable', False),
|
|
1113
|
+
'withdraw': self.safe_bool(chain, 'withdrawEnable', False),
|
|
1114
|
+
'fee': self.safe_number(chain, 'withdrawFee'),
|
|
1139
1115
|
'precision': None,
|
|
1140
1116
|
'limits': {
|
|
1141
1117
|
'withdraw': {
|
|
1142
|
-
'min': withdrawMin,
|
|
1143
|
-
'max': withdrawMax,
|
|
1118
|
+
'min': self.safe_string(chain, 'withdrawMin'),
|
|
1119
|
+
'max': self.safe_string(chain, 'withdrawMax'),
|
|
1144
1120
|
},
|
|
1145
1121
|
},
|
|
1146
1122
|
}
|
|
1147
|
-
|
|
1148
|
-
networkKeysLength = len(networkKeys)
|
|
1149
|
-
if (networkKeysLength == 1) or ('NONE' in networks):
|
|
1150
|
-
defaultNetwork = self.safe_value_2(networks, 'NONE', networkKeysLength - 1)
|
|
1151
|
-
if defaultNetwork is not None:
|
|
1152
|
-
currencyFee = defaultNetwork['fee']
|
|
1153
|
-
result[code] = {
|
|
1123
|
+
result[code] = self.safe_currency_structure({
|
|
1154
1124
|
'info': currency,
|
|
1155
1125
|
'id': id,
|
|
1156
1126
|
'code': code,
|
|
1157
1127
|
'name': name,
|
|
1158
|
-
'active':
|
|
1159
|
-
'deposit':
|
|
1160
|
-
'withdraw':
|
|
1161
|
-
'fee':
|
|
1128
|
+
'active': None,
|
|
1129
|
+
'deposit': None,
|
|
1130
|
+
'withdraw': None,
|
|
1131
|
+
'fee': None,
|
|
1162
1132
|
'precision': None,
|
|
1163
1133
|
'limits': {
|
|
1164
1134
|
'amount': {
|
|
1165
1135
|
'min': None,
|
|
1166
1136
|
'max': None,
|
|
1167
1137
|
},
|
|
1168
|
-
'withdraw': {
|
|
1169
|
-
'min': currencyWithdrawMin,
|
|
1170
|
-
'max': currencyWithdrawMax,
|
|
1171
|
-
},
|
|
1172
1138
|
},
|
|
1139
|
+
'type': 'crypto',
|
|
1173
1140
|
'networks': networks,
|
|
1174
|
-
}
|
|
1141
|
+
})
|
|
1175
1142
|
return result
|
|
1176
1143
|
|
|
1177
1144
|
async def fetch_markets(self, params={}) -> List[Market]:
|
|
@@ -3254,13 +3221,27 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3254
3221
|
|
|
3255
3222
|
def parse_order(self, order: dict, market: Market = None) -> Order:
|
|
3256
3223
|
#
|
|
3257
|
-
# spot
|
|
3224
|
+
# spot
|
|
3225
|
+
# createOrder
|
|
3258
3226
|
#
|
|
3259
|
-
#
|
|
3227
|
+
# {
|
|
3228
|
+
# "symbol": "FARTCOINUSDT",
|
|
3229
|
+
# "orderId": "C02__342252993005723644225",
|
|
3230
|
+
# "orderListId": "-1",
|
|
3231
|
+
# "price": "1.1",
|
|
3232
|
+
# "origQty": "6.3",
|
|
3233
|
+
# "type": "IMMEDIATE_OR_CANCEL",
|
|
3234
|
+
# "side": "SELL",
|
|
3235
|
+
# "transactTime": "1745852205223"
|
|
3236
|
+
# }
|
|
3237
|
+
#
|
|
3238
|
+
# unknown endpoint on spot
|
|
3239
|
+
#
|
|
3240
|
+
# {
|
|
3260
3241
|
# "symbol": "BTCUSDT",
|
|
3261
3242
|
# "orderId": "123738410679123456",
|
|
3262
3243
|
# "orderListId": -1
|
|
3263
|
-
#
|
|
3244
|
+
# }
|
|
3264
3245
|
#
|
|
3265
3246
|
# margin: createOrder
|
|
3266
3247
|
#
|
|
@@ -3422,6 +3403,10 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3422
3403
|
id = order
|
|
3423
3404
|
else:
|
|
3424
3405
|
id = self.safe_string_2(order, 'orderId', 'id')
|
|
3406
|
+
timeInForce = self.parse_order_time_in_force(self.safe_string(order, 'timeInForce'))
|
|
3407
|
+
typeRaw = self.safe_string(order, 'type')
|
|
3408
|
+
if timeInForce is None:
|
|
3409
|
+
timeInForce = self.get_tif_from_raw_order_type(typeRaw)
|
|
3425
3410
|
marketId = self.safe_string(order, 'symbol')
|
|
3426
3411
|
market = self.safe_market(marketId, market)
|
|
3427
3412
|
timestamp = self.safe_integer_n(order, ['time', 'createTime', 'transactTime'])
|
|
@@ -3443,8 +3428,8 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3443
3428
|
'lastTradeTimestamp': None, # TODO: self might be 'updateTime' if order-status is filled, otherwise cancellation time. needs to be checked
|
|
3444
3429
|
'status': self.parse_order_status(self.safe_string_2(order, 'status', 'state')),
|
|
3445
3430
|
'symbol': market['symbol'],
|
|
3446
|
-
'type': self.parse_order_type(
|
|
3447
|
-
'timeInForce':
|
|
3431
|
+
'type': self.parse_order_type(typeRaw),
|
|
3432
|
+
'timeInForce': timeInForce,
|
|
3448
3433
|
'side': self.parse_order_side(self.safe_string(order, 'side')),
|
|
3449
3434
|
'price': self.safe_number(order, 'price'),
|
|
3450
3435
|
'triggerPrice': self.safe_number_2(order, 'stopPrice', 'triggerPrice'),
|
|
@@ -3473,6 +3458,9 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3473
3458
|
'MARKET': 'market',
|
|
3474
3459
|
'LIMIT': 'limit',
|
|
3475
3460
|
'LIMIT_MAKER': 'limit',
|
|
3461
|
+
# on spot, during submission below types are used only accepted order
|
|
3462
|
+
'IMMEDIATE_OR_CANCEL': 'limit',
|
|
3463
|
+
'FILL_OR_KILL': 'limit',
|
|
3476
3464
|
}
|
|
3477
3465
|
return self.safe_string(statuses, status, status)
|
|
3478
3466
|
|
|
@@ -3500,6 +3488,16 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3500
3488
|
}
|
|
3501
3489
|
return self.safe_string(statuses, status, status)
|
|
3502
3490
|
|
|
3491
|
+
def get_tif_from_raw_order_type(self, orderType: Str = None):
|
|
3492
|
+
statuses: dict = {
|
|
3493
|
+
'LIMIT': 'GTC',
|
|
3494
|
+
'LIMIT_MAKER': 'POST_ONLY',
|
|
3495
|
+
'IMMEDIATE_OR_CANCEL': 'IOC',
|
|
3496
|
+
'FILL_OR_KILL': 'FOK',
|
|
3497
|
+
'MARKET': 'IOC',
|
|
3498
|
+
}
|
|
3499
|
+
return self.safe_string(statuses, orderType, orderType)
|
|
3500
|
+
|
|
3503
3501
|
async def fetch_account_helper(self, type, params):
|
|
3504
3502
|
if type == 'spot':
|
|
3505
3503
|
return await self.spotPrivateGetAccount(params)
|
|
@@ -4850,7 +4848,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
4850
4848
|
response = await self.fetch_positions(None, self.extend(request, params))
|
|
4851
4849
|
return self.safe_value(response, 0)
|
|
4852
4850
|
|
|
4853
|
-
async def fetch_positions(self, symbols: Strings = None, params={}):
|
|
4851
|
+
async def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
|
|
4854
4852
|
"""
|
|
4855
4853
|
fetch all open positions
|
|
4856
4854
|
|
mexc/ccxt/base/exchange.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# -----------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
__version__ = '4.4.
|
|
7
|
+
__version__ = '4.4.79'
|
|
8
8
|
|
|
9
9
|
# -----------------------------------------------------------------------------
|
|
10
10
|
|
|
@@ -67,6 +67,10 @@ from ccxt.static_dependencies.starknet.hash.address import compute_address
|
|
|
67
67
|
from ccxt.static_dependencies.starknet.hash.selector import get_selector_from_name
|
|
68
68
|
from ccxt.static_dependencies.starknet.hash.utils import message_signature, private_to_stark_key
|
|
69
69
|
from ccxt.static_dependencies.starknet.utils.typed_data import TypedData as TypedDataDataclass
|
|
70
|
+
try:
|
|
71
|
+
import apexpro.zklink_sdk as zklink_sdk
|
|
72
|
+
except ImportError:
|
|
73
|
+
zklink_sdk = None
|
|
70
74
|
|
|
71
75
|
# -----------------------------------------------------------------------------
|
|
72
76
|
|
|
@@ -509,7 +513,7 @@ class Exchange(object):
|
|
|
509
513
|
proxyUrl = self.check_proxy_url_settings(url, method, headers, body)
|
|
510
514
|
if proxyUrl is not None:
|
|
511
515
|
request_headers.update({'Origin': self.origin})
|
|
512
|
-
url = proxyUrl + url
|
|
516
|
+
url = proxyUrl + self.url_encoder_for_proxy_url(url)
|
|
513
517
|
# proxy agents
|
|
514
518
|
proxies = None # set default
|
|
515
519
|
httpProxy, httpsProxy, socksProxy = self.check_proxy_settings(url, method, headers, body)
|
|
@@ -1755,6 +1759,69 @@ class Exchange(object):
|
|
|
1755
1759
|
def binary_length(self, binary):
|
|
1756
1760
|
return len(binary)
|
|
1757
1761
|
|
|
1762
|
+
def get_zk_contract_signature_obj(self, seeds: str, params={}):
|
|
1763
|
+
if zklink_sdk is None:
|
|
1764
|
+
raise Exception('zklink_sdk is not installed, please do pip3 install apexomni-arm or apexomni-x86-mac or apexomni-x86-windows-linux')
|
|
1765
|
+
|
|
1766
|
+
slotId = self.safe_string(params, 'slotId')
|
|
1767
|
+
nonceInt = int(self.remove0x_prefix(self.hash(self.encode(slotId), 'sha256', 'hex')), 16)
|
|
1768
|
+
|
|
1769
|
+
maxUint64 = 18446744073709551615
|
|
1770
|
+
maxUint32 = 4294967295
|
|
1771
|
+
|
|
1772
|
+
slotId = (nonceInt % maxUint64) / maxUint32
|
|
1773
|
+
nonce = nonceInt % maxUint32
|
|
1774
|
+
accountId = int(self.safe_string(params, 'accountId'), 10) % maxUint32
|
|
1775
|
+
|
|
1776
|
+
priceStr = (Decimal(self.safe_string(params, 'price')) * Decimal(10) ** Decimal('18')).quantize(Decimal(0), rounding='ROUND_DOWN')
|
|
1777
|
+
sizeStr = (Decimal(self.safe_string(params, 'size')) * Decimal(10) ** Decimal('18')).quantize(Decimal(0), rounding='ROUND_DOWN')
|
|
1778
|
+
|
|
1779
|
+
takerFeeRateStr = (Decimal(self.safe_string(params, 'takerFeeRate')) * Decimal(10000)).quantize(Decimal(0), rounding='ROUND_UP')
|
|
1780
|
+
makerFeeRateStr = (Decimal(self.safe_string(params, 'makerFeeRate')) * Decimal(10000)).quantize(Decimal(0), rounding='ROUND_UP')
|
|
1781
|
+
|
|
1782
|
+
builder = zklink_sdk.ContractBuilder(
|
|
1783
|
+
int(accountId), int(0), int(slotId), int(nonce), int(self.safe_number(params, 'pairId')),
|
|
1784
|
+
sizeStr.__str__(), priceStr.__str__(), self.safe_string(params, 'direction') == "BUY",
|
|
1785
|
+
int(takerFeeRateStr), int(makerFeeRateStr), False)
|
|
1786
|
+
|
|
1787
|
+
|
|
1788
|
+
tx = zklink_sdk.Contract(builder)
|
|
1789
|
+
seedsByte = bytes.fromhex(seeds.removeprefix('0x'))
|
|
1790
|
+
signerSeed = zklink_sdk.ZkLinkSigner().new_from_seed(seedsByte)
|
|
1791
|
+
auth_data = signerSeed.sign_musig(tx.get_bytes())
|
|
1792
|
+
signature = auth_data.signature
|
|
1793
|
+
return signature
|
|
1794
|
+
|
|
1795
|
+
def get_zk_transfer_signature_obj(self, seeds: str, params={}):
|
|
1796
|
+
if zklink_sdk is None:
|
|
1797
|
+
raise Exception('zklink_sdk is not installed, please do pip3 install apexomni-arm or apexomni-x86-mac or apexomni-x86-windows-linux')
|
|
1798
|
+
|
|
1799
|
+
nonce = self.safe_string(params, 'nonce', '0')
|
|
1800
|
+
if self.safe_bool(params, 'isContract'):
|
|
1801
|
+
formattedUint32 = '4294967295'
|
|
1802
|
+
formattedNonce = int(self.remove0x_prefix(self.hash(self.encode(nonce), 'sha256', 'hex')), 16)
|
|
1803
|
+
nonce = Precise.string_mod(str(formattedNonce), formattedUint32)
|
|
1804
|
+
|
|
1805
|
+
tx_builder = zklink_sdk.TransferBuilder(
|
|
1806
|
+
int(self.safe_number(params, 'zkAccountId', 0)),
|
|
1807
|
+
self.safe_string(params, 'receiverAddress'),
|
|
1808
|
+
int(self.safe_number(params, 'subAccountId', 0)),
|
|
1809
|
+
int(self.safe_number(params, 'receiverSubAccountId', 0)),
|
|
1810
|
+
int(self.safe_number(params, 'tokenId', 0)),
|
|
1811
|
+
self.safe_string(params, 'amount', '0'),
|
|
1812
|
+
self.safe_string(params, 'fee', '0'),
|
|
1813
|
+
self.parse_to_int(nonce),
|
|
1814
|
+
int(self.safe_number(params, 'timestampSeconds', 0))
|
|
1815
|
+
)
|
|
1816
|
+
|
|
1817
|
+
tx = zklink_sdk.Transfer(tx_builder)
|
|
1818
|
+
seedsByte = bytes.fromhex(seeds.removeprefix('0x'))
|
|
1819
|
+
signerSeed = zklink_sdk.ZkLinkSigner().new_from_seed(seedsByte)
|
|
1820
|
+
auth_data = signerSeed.sign_musig(tx.get_bytes())
|
|
1821
|
+
signature = auth_data.signature
|
|
1822
|
+
return signature
|
|
1823
|
+
|
|
1824
|
+
|
|
1758
1825
|
# ########################################################################
|
|
1759
1826
|
# ########################################################################
|
|
1760
1827
|
# ########################################################################
|
|
@@ -2254,6 +2321,12 @@ class Exchange(object):
|
|
|
2254
2321
|
raise InvalidProxySettings(self.id + ' you have multiple conflicting proxy settings(' + joinedProxyNames + '), please use only one from : proxyUrl, proxy_url, proxyUrlCallback, proxy_url_callback')
|
|
2255
2322
|
return proxyUrl
|
|
2256
2323
|
|
|
2324
|
+
def url_encoder_for_proxy_url(self, targetUrl: str):
|
|
2325
|
+
# to be overriden
|
|
2326
|
+
includesQuery = targetUrl.find('?') >= 0
|
|
2327
|
+
finalUrl = self.encode_uri_component(targetUrl) if includesQuery else targetUrl
|
|
2328
|
+
return finalUrl
|
|
2329
|
+
|
|
2257
2330
|
def check_proxy_settings(self, url: Str = None, method: Str = None, headers=None, body=None):
|
|
2258
2331
|
usedProxies = []
|
|
2259
2332
|
httpProxy = None
|
|
@@ -2947,7 +3020,7 @@ class Exchange(object):
|
|
|
2947
3020
|
# find lowest precision(which is more desired)
|
|
2948
3021
|
precision = self.safe_string(network, 'precision')
|
|
2949
3022
|
precisionMain = self.safe_string(currency, 'precision')
|
|
2950
|
-
if precisionMain is None or Precise.
|
|
3023
|
+
if precisionMain is None or Precise.string_gt(precision, precisionMain):
|
|
2951
3024
|
currency['precision'] = self.parse_number(precision)
|
|
2952
3025
|
# limits
|
|
2953
3026
|
limits = self.safe_dict(network, 'limits')
|
mexc/ccxt/mexc.py
CHANGED
|
@@ -1097,80 +1097,47 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
1097
1097
|
id = self.safe_string(currency, 'coin')
|
|
1098
1098
|
code = self.safe_currency_code(id)
|
|
1099
1099
|
name = self.safe_string(currency, 'name')
|
|
1100
|
-
currencyActive = False
|
|
1101
|
-
currencyFee = None
|
|
1102
|
-
currencyWithdrawMin = None
|
|
1103
|
-
currencyWithdrawMax = None
|
|
1104
|
-
depositEnabled = False
|
|
1105
|
-
withdrawEnabled = False
|
|
1106
1100
|
networks: dict = {}
|
|
1107
1101
|
chains = self.safe_value(currency, 'networkList', [])
|
|
1108
1102
|
for j in range(0, len(chains)):
|
|
1109
1103
|
chain = chains[j]
|
|
1110
1104
|
networkId = self.safe_string_2(chain, 'netWork', 'network')
|
|
1111
1105
|
network = self.network_id_to_code(networkId)
|
|
1112
|
-
isDepositEnabled = self.safe_bool(chain, 'depositEnable', False)
|
|
1113
|
-
isWithdrawEnabled = self.safe_bool(chain, 'withdrawEnable', False)
|
|
1114
|
-
active = (isDepositEnabled and isWithdrawEnabled)
|
|
1115
|
-
currencyActive = active or currencyActive
|
|
1116
|
-
withdrawMin = self.safe_string(chain, 'withdrawMin')
|
|
1117
|
-
withdrawMax = self.safe_string(chain, 'withdrawMax')
|
|
1118
|
-
currencyWithdrawMin = withdrawMin if (currencyWithdrawMin is None) else currencyWithdrawMin
|
|
1119
|
-
currencyWithdrawMax = withdrawMax if (currencyWithdrawMax is None) else currencyWithdrawMax
|
|
1120
|
-
fee = self.safe_number(chain, 'withdrawFee')
|
|
1121
|
-
currencyFee = fee if (currencyFee is None) else currencyFee
|
|
1122
|
-
if Precise.string_gt(currencyWithdrawMin, withdrawMin):
|
|
1123
|
-
currencyWithdrawMin = withdrawMin
|
|
1124
|
-
if Precise.string_lt(currencyWithdrawMax, withdrawMax):
|
|
1125
|
-
currencyWithdrawMax = withdrawMax
|
|
1126
|
-
if isDepositEnabled:
|
|
1127
|
-
depositEnabled = True
|
|
1128
|
-
if isWithdrawEnabled:
|
|
1129
|
-
withdrawEnabled = True
|
|
1130
1106
|
networks[network] = {
|
|
1131
1107
|
'info': chain,
|
|
1132
1108
|
'id': networkId,
|
|
1133
1109
|
'network': network,
|
|
1134
|
-
'active':
|
|
1135
|
-
'deposit':
|
|
1136
|
-
'withdraw':
|
|
1137
|
-
'fee':
|
|
1110
|
+
'active': None,
|
|
1111
|
+
'deposit': self.safe_bool(chain, 'depositEnable', False),
|
|
1112
|
+
'withdraw': self.safe_bool(chain, 'withdrawEnable', False),
|
|
1113
|
+
'fee': self.safe_number(chain, 'withdrawFee'),
|
|
1138
1114
|
'precision': None,
|
|
1139
1115
|
'limits': {
|
|
1140
1116
|
'withdraw': {
|
|
1141
|
-
'min': withdrawMin,
|
|
1142
|
-
'max': withdrawMax,
|
|
1117
|
+
'min': self.safe_string(chain, 'withdrawMin'),
|
|
1118
|
+
'max': self.safe_string(chain, 'withdrawMax'),
|
|
1143
1119
|
},
|
|
1144
1120
|
},
|
|
1145
1121
|
}
|
|
1146
|
-
|
|
1147
|
-
networkKeysLength = len(networkKeys)
|
|
1148
|
-
if (networkKeysLength == 1) or ('NONE' in networks):
|
|
1149
|
-
defaultNetwork = self.safe_value_2(networks, 'NONE', networkKeysLength - 1)
|
|
1150
|
-
if defaultNetwork is not None:
|
|
1151
|
-
currencyFee = defaultNetwork['fee']
|
|
1152
|
-
result[code] = {
|
|
1122
|
+
result[code] = self.safe_currency_structure({
|
|
1153
1123
|
'info': currency,
|
|
1154
1124
|
'id': id,
|
|
1155
1125
|
'code': code,
|
|
1156
1126
|
'name': name,
|
|
1157
|
-
'active':
|
|
1158
|
-
'deposit':
|
|
1159
|
-
'withdraw':
|
|
1160
|
-
'fee':
|
|
1127
|
+
'active': None,
|
|
1128
|
+
'deposit': None,
|
|
1129
|
+
'withdraw': None,
|
|
1130
|
+
'fee': None,
|
|
1161
1131
|
'precision': None,
|
|
1162
1132
|
'limits': {
|
|
1163
1133
|
'amount': {
|
|
1164
1134
|
'min': None,
|
|
1165
1135
|
'max': None,
|
|
1166
1136
|
},
|
|
1167
|
-
'withdraw': {
|
|
1168
|
-
'min': currencyWithdrawMin,
|
|
1169
|
-
'max': currencyWithdrawMax,
|
|
1170
|
-
},
|
|
1171
1137
|
},
|
|
1138
|
+
'type': 'crypto',
|
|
1172
1139
|
'networks': networks,
|
|
1173
|
-
}
|
|
1140
|
+
})
|
|
1174
1141
|
return result
|
|
1175
1142
|
|
|
1176
1143
|
def fetch_markets(self, params={}) -> List[Market]:
|
|
@@ -3253,13 +3220,27 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3253
3220
|
|
|
3254
3221
|
def parse_order(self, order: dict, market: Market = None) -> Order:
|
|
3255
3222
|
#
|
|
3256
|
-
# spot
|
|
3223
|
+
# spot
|
|
3224
|
+
# createOrder
|
|
3257
3225
|
#
|
|
3258
|
-
#
|
|
3226
|
+
# {
|
|
3227
|
+
# "symbol": "FARTCOINUSDT",
|
|
3228
|
+
# "orderId": "C02__342252993005723644225",
|
|
3229
|
+
# "orderListId": "-1",
|
|
3230
|
+
# "price": "1.1",
|
|
3231
|
+
# "origQty": "6.3",
|
|
3232
|
+
# "type": "IMMEDIATE_OR_CANCEL",
|
|
3233
|
+
# "side": "SELL",
|
|
3234
|
+
# "transactTime": "1745852205223"
|
|
3235
|
+
# }
|
|
3236
|
+
#
|
|
3237
|
+
# unknown endpoint on spot
|
|
3238
|
+
#
|
|
3239
|
+
# {
|
|
3259
3240
|
# "symbol": "BTCUSDT",
|
|
3260
3241
|
# "orderId": "123738410679123456",
|
|
3261
3242
|
# "orderListId": -1
|
|
3262
|
-
#
|
|
3243
|
+
# }
|
|
3263
3244
|
#
|
|
3264
3245
|
# margin: createOrder
|
|
3265
3246
|
#
|
|
@@ -3421,6 +3402,10 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3421
3402
|
id = order
|
|
3422
3403
|
else:
|
|
3423
3404
|
id = self.safe_string_2(order, 'orderId', 'id')
|
|
3405
|
+
timeInForce = self.parse_order_time_in_force(self.safe_string(order, 'timeInForce'))
|
|
3406
|
+
typeRaw = self.safe_string(order, 'type')
|
|
3407
|
+
if timeInForce is None:
|
|
3408
|
+
timeInForce = self.get_tif_from_raw_order_type(typeRaw)
|
|
3424
3409
|
marketId = self.safe_string(order, 'symbol')
|
|
3425
3410
|
market = self.safe_market(marketId, market)
|
|
3426
3411
|
timestamp = self.safe_integer_n(order, ['time', 'createTime', 'transactTime'])
|
|
@@ -3442,8 +3427,8 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3442
3427
|
'lastTradeTimestamp': None, # TODO: self might be 'updateTime' if order-status is filled, otherwise cancellation time. needs to be checked
|
|
3443
3428
|
'status': self.parse_order_status(self.safe_string_2(order, 'status', 'state')),
|
|
3444
3429
|
'symbol': market['symbol'],
|
|
3445
|
-
'type': self.parse_order_type(
|
|
3446
|
-
'timeInForce':
|
|
3430
|
+
'type': self.parse_order_type(typeRaw),
|
|
3431
|
+
'timeInForce': timeInForce,
|
|
3447
3432
|
'side': self.parse_order_side(self.safe_string(order, 'side')),
|
|
3448
3433
|
'price': self.safe_number(order, 'price'),
|
|
3449
3434
|
'triggerPrice': self.safe_number_2(order, 'stopPrice', 'triggerPrice'),
|
|
@@ -3472,6 +3457,9 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3472
3457
|
'MARKET': 'market',
|
|
3473
3458
|
'LIMIT': 'limit',
|
|
3474
3459
|
'LIMIT_MAKER': 'limit',
|
|
3460
|
+
# on spot, during submission below types are used only accepted order
|
|
3461
|
+
'IMMEDIATE_OR_CANCEL': 'limit',
|
|
3462
|
+
'FILL_OR_KILL': 'limit',
|
|
3475
3463
|
}
|
|
3476
3464
|
return self.safe_string(statuses, status, status)
|
|
3477
3465
|
|
|
@@ -3499,6 +3487,16 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
3499
3487
|
}
|
|
3500
3488
|
return self.safe_string(statuses, status, status)
|
|
3501
3489
|
|
|
3490
|
+
def get_tif_from_raw_order_type(self, orderType: Str = None):
|
|
3491
|
+
statuses: dict = {
|
|
3492
|
+
'LIMIT': 'GTC',
|
|
3493
|
+
'LIMIT_MAKER': 'POST_ONLY',
|
|
3494
|
+
'IMMEDIATE_OR_CANCEL': 'IOC',
|
|
3495
|
+
'FILL_OR_KILL': 'FOK',
|
|
3496
|
+
'MARKET': 'IOC',
|
|
3497
|
+
}
|
|
3498
|
+
return self.safe_string(statuses, orderType, orderType)
|
|
3499
|
+
|
|
3502
3500
|
def fetch_account_helper(self, type, params):
|
|
3503
3501
|
if type == 'spot':
|
|
3504
3502
|
return self.spotPrivateGetAccount(params)
|
|
@@ -4849,7 +4847,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
|
4849
4847
|
response = self.fetch_positions(None, self.extend(request, params))
|
|
4850
4848
|
return self.safe_value(response, 0)
|
|
4851
4849
|
|
|
4852
|
-
def fetch_positions(self, symbols: Strings = None, params={}):
|
|
4850
|
+
def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
|
|
4853
4851
|
"""
|
|
4854
4852
|
fetch all open positions
|
|
4855
4853
|
|
mexc/ccxt/pro/__init__.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mexc-exchange-api
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.27
|
|
4
4
|
Summary: mexc crypto exchange api client
|
|
5
5
|
Project-URL: Homepage, https://github.com/ccxt/ccxt
|
|
6
6
|
Project-URL: Issues, https://github.com/ccxt/ccxt
|
|
@@ -183,6 +183,7 @@ You can also construct custom requests to available "implicit" endpoints
|
|
|
183
183
|
- `cancel_orders(self, ids, symbol: Str = None, params={})`
|
|
184
184
|
- `custom_parse_balance(self, response, marketType)`
|
|
185
185
|
- `describe(self)`
|
|
186
|
+
- `get_tif_from_raw_order_type(self, orderType: Str = None)`
|
|
186
187
|
- `modify_margin_helper(self, symbol: str, amount, addOrReduce, params={})`
|
|
187
188
|
- `nonce(self)`
|
|
188
189
|
- `reduce_margin(self, symbol: str, amount: float, params={})`
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
mexc/__init__.py,sha256=bFV_Nfz_k-lfB_ImsHGpFnJuVMUXLBRbttugnPV7c4A,222
|
|
2
|
-
mexc/ccxt/__init__.py,sha256=
|
|
3
|
-
mexc/ccxt/mexc.py,sha256=
|
|
2
|
+
mexc/ccxt/__init__.py,sha256=a3MfFlb5hWo4Psxr_rR63OYnhATtHMNXx9CxSKC6VNY,6044
|
|
3
|
+
mexc/ccxt/mexc.py,sha256=9vLlOcQiBRpa9i_l6p4nLd_vXuGpfXKCjZURps2PyA0,258865
|
|
4
4
|
mexc/ccxt/abstract/mexc.py,sha256=oyg0sZFYs1d77F-_9QAatqMSQJ8h-1u1wWb-d1DX2zQ,26434
|
|
5
|
-
mexc/ccxt/async_support/__init__.py,sha256=
|
|
6
|
-
mexc/ccxt/async_support/mexc.py,sha256=
|
|
5
|
+
mexc/ccxt/async_support/__init__.py,sha256=tEkUocTWg3M9HU93qsXckkaOpIYjfFkE_7ogNnae1XY,4777
|
|
6
|
+
mexc/ccxt/async_support/mexc.py,sha256=2AOkhXyED_2TRlXDGrFw6oxlzCN_aP3TJwkJYqYmmzw,260129
|
|
7
7
|
mexc/ccxt/async_support/base/__init__.py,sha256=aVYSsFi--b4InRs9zDN_wtCpj8odosAB726JdUHavrk,67
|
|
8
|
-
mexc/ccxt/async_support/base/exchange.py,sha256=
|
|
8
|
+
mexc/ccxt/async_support/base/exchange.py,sha256=X_oV71iDNfd2c96pnNJ-e2mniQx-1px-iIXkE-bNUTk,117255
|
|
9
9
|
mexc/ccxt/async_support/base/throttler.py,sha256=tvDVcdRUVYi8fZRlEcnqtgzcgB_KMUMRs5Pu8tuU-tU,1847
|
|
10
10
|
mexc/ccxt/async_support/base/ws/__init__.py,sha256=uockzpLuwntKGZbs5EOWFe-Zg-k6Cj7GhNJLc_RX0so,1791
|
|
11
11
|
mexc/ccxt/async_support/base/ws/aiohttp_client.py,sha256=Y5HxAVXyyYduj6b6SbbUZETlq3GrVMzrkW1r-TMgpb8,6329
|
|
@@ -19,10 +19,10 @@ mexc/ccxt/async_support/base/ws/order_book_side.py,sha256=GhnGUt78pJ-AYL_Dq9prod
|
|
|
19
19
|
mexc/ccxt/base/__init__.py,sha256=eTx1OE3HJjspFUQjGm6LBhaQiMKJnXjkdP-JUXknyQ0,1320
|
|
20
20
|
mexc/ccxt/base/decimal_to_precision.py,sha256=fgWRBzRTtsf3r2INyS4f7WHlzgjB5YM1ekiwqD21aac,6634
|
|
21
21
|
mexc/ccxt/base/errors.py,sha256=MvCrL_sAM3de616T6RE0PSxiF2xV6Qqz5b1y1ghidbk,4888
|
|
22
|
-
mexc/ccxt/base/exchange.py,sha256=
|
|
22
|
+
mexc/ccxt/base/exchange.py,sha256=Nc1YifSOr1D3QRVQiSJu59SP76gActUUZIsgusjoTss,326255
|
|
23
23
|
mexc/ccxt/base/precise.py,sha256=koce64Yrp6vFbGijJtUt-QQ6XhJgeGTCksZ871FPp_A,8886
|
|
24
24
|
mexc/ccxt/base/types.py,sha256=SfxIKDSsxP7MPHWiOVI965Nr5NSEPpAno5fuveTRi3w,11423
|
|
25
|
-
mexc/ccxt/pro/__init__.py,sha256=
|
|
25
|
+
mexc/ccxt/pro/__init__.py,sha256=u4A8Ak28_7C5UKXEVFJoWodbepu4DsCoaQyWWf-1Zyo,615
|
|
26
26
|
mexc/ccxt/pro/mexc.py,sha256=SRaTTx4D4OcZi5Im9wBm6Rh54vZCxeeAcC5rK6NB3wk,56535
|
|
27
27
|
mexc/ccxt/static_dependencies/README.md,sha256=3TCvhhn09_Cqf9BDDpao1V7EfKHDpQ6k9oWRsLFixpU,18
|
|
28
28
|
mexc/ccxt/static_dependencies/__init__.py,sha256=tzFje8cloqmiIE6kola3EaYC0SnD1izWnri69hzHsSw,168
|
|
@@ -283,6 +283,6 @@ mexc/ccxt/static_dependencies/toolz/curried/exceptions.py,sha256=gKFOHDIayAWnX2u
|
|
|
283
283
|
mexc/ccxt/static_dependencies/toolz/curried/operator.py,sha256=ML92mknkAwzBl2NCm-4werSUmJEtSHNY9NSzhseNM9s,525
|
|
284
284
|
mexc/ccxt/static_dependencies/typing_inspect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
285
285
|
mexc/ccxt/static_dependencies/typing_inspect/typing_inspect.py,sha256=5gIWomLPfuDpgd3gX1GlnX0MuXM3VorR4j2W2qXORiQ,28269
|
|
286
|
-
mexc_exchange_api-0.0.
|
|
287
|
-
mexc_exchange_api-0.0.
|
|
288
|
-
mexc_exchange_api-0.0.
|
|
286
|
+
mexc_exchange_api-0.0.27.dist-info/METADATA,sha256=6icXDyBzFNZqdND1dSIOmoUzlW2OOVzpHn0smt_7YCI,17847
|
|
287
|
+
mexc_exchange_api-0.0.27.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
288
|
+
mexc_exchange_api-0.0.27.dist-info/RECORD,,
|
|
File without changes
|