ccxt 4.3.53__py2.py3-none-any.whl → 4.3.55__py2.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.
- ccxt/__init__.py +1 -1
- ccxt/abstract/kucoin.py +3 -0
- ccxt/abstract/kucoinfutures.py +3 -0
- ccxt/ace.py +1 -1
- ccxt/alpaca.py +1 -1
- ccxt/ascendex.py +6 -4
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ace.py +1 -1
- ccxt/async_support/alpaca.py +1 -1
- ccxt/async_support/ascendex.py +6 -4
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/bigone.py +1 -1
- ccxt/async_support/binance.py +6 -6
- ccxt/async_support/bingx.py +4 -4
- ccxt/async_support/bit2c.py +1 -1
- ccxt/async_support/bitbank.py +1 -1
- ccxt/async_support/bitbns.py +1 -1
- ccxt/async_support/bitfinex.py +1 -1
- ccxt/async_support/bitfinex2.py +1 -1
- ccxt/async_support/bitflyer.py +1 -1
- ccxt/async_support/bitget.py +2 -2
- ccxt/async_support/bithumb.py +1 -1
- ccxt/async_support/bitmart.py +3 -3
- ccxt/async_support/bitmex.py +1 -1
- ccxt/async_support/bitopro.py +1 -1
- ccxt/async_support/bitrue.py +1 -1
- ccxt/async_support/bitso.py +1 -1
- ccxt/async_support/bitstamp.py +1 -1
- ccxt/async_support/bitteam.py +1 -1
- ccxt/async_support/bitvavo.py +2 -2
- ccxt/async_support/bl3p.py +1 -1
- ccxt/async_support/blockchaincom.py +28 -28
- ccxt/async_support/blofin.py +1 -1
- ccxt/async_support/btcalpha.py +4 -11
- ccxt/async_support/btcbox.py +1 -1
- ccxt/async_support/btcmarkets.py +1 -1
- ccxt/async_support/btcturk.py +1 -1
- ccxt/async_support/bybit.py +2 -2
- ccxt/async_support/cex.py +2 -2
- ccxt/async_support/coinbase.py +33 -33
- ccxt/async_support/coinbaseexchange.py +1 -1
- ccxt/async_support/coinbaseinternational.py +1 -1
- ccxt/async_support/coincheck.py +1 -1
- ccxt/async_support/coinex.py +2 -2
- ccxt/async_support/coinlist.py +2 -2
- ccxt/async_support/coinmate.py +1 -1
- ccxt/async_support/coinmetro.py +1 -1
- ccxt/async_support/coinone.py +1 -1
- ccxt/async_support/coinsph.py +1 -1
- ccxt/async_support/coinspot.py +1 -1
- ccxt/async_support/cryptocom.py +1 -1
- ccxt/async_support/currencycom.py +1 -1
- ccxt/async_support/delta.py +2 -2
- ccxt/async_support/deribit.py +4 -4
- ccxt/async_support/digifinex.py +2 -2
- ccxt/async_support/exmo.py +2 -2
- ccxt/async_support/gate.py +2 -2
- ccxt/async_support/gemini.py +1 -1
- ccxt/async_support/hitbtc.py +1 -1
- ccxt/async_support/hollaex.py +1 -1
- ccxt/async_support/htx.py +3 -3
- ccxt/async_support/huobijp.py +1 -1
- ccxt/async_support/hyperliquid.py +2 -2
- ccxt/async_support/idex.py +1 -1
- ccxt/async_support/independentreserve.py +1 -1
- ccxt/async_support/indodax.py +1 -1
- ccxt/async_support/kraken.py +2 -2
- ccxt/async_support/kucoin.py +127 -46
- ccxt/async_support/kucoinfutures.py +1 -1
- ccxt/async_support/kuna.py +1 -1
- ccxt/async_support/latoken.py +1 -1
- ccxt/async_support/lbank.py +1 -1
- ccxt/async_support/luno.py +1 -1
- ccxt/async_support/lykke.py +1 -1
- ccxt/async_support/mercado.py +1 -1
- ccxt/async_support/mexc.py +1 -1
- ccxt/async_support/ndax.py +1 -1
- ccxt/async_support/novadax.py +1 -1
- ccxt/async_support/oceanex.py +1 -1
- ccxt/async_support/okcoin.py +1 -1
- ccxt/async_support/okx.py +3 -3
- ccxt/async_support/onetrading.py +1 -1
- ccxt/async_support/oxfun.py +2 -2
- ccxt/async_support/p2b.py +1 -1
- ccxt/async_support/paymium.py +1 -1
- ccxt/async_support/phemex.py +30 -3
- ccxt/async_support/poloniex.py +6 -4
- ccxt/async_support/poloniexfutures.py +1 -1
- ccxt/async_support/probit.py +1 -1
- ccxt/async_support/timex.py +1 -1
- ccxt/async_support/tokocrypto.py +1 -1
- ccxt/async_support/tradeogre.py +1 -1
- ccxt/async_support/upbit.py +1 -1
- ccxt/async_support/vertex.py +2 -2
- ccxt/async_support/wavesexchange.py +1 -1
- ccxt/async_support/wazirx.py +1 -1
- ccxt/async_support/whitebit.py +2 -2
- ccxt/async_support/woo.py +31 -23
- ccxt/async_support/woofipro.py +3 -3
- ccxt/async_support/yobit.py +1 -1
- ccxt/async_support/zaif.py +1 -1
- ccxt/async_support/zonda.py +1 -1
- ccxt/base/exchange.py +1 -1
- ccxt/base/types.py +4 -1
- ccxt/bigone.py +1 -1
- ccxt/binance.py +6 -6
- ccxt/bingx.py +4 -4
- ccxt/bit2c.py +1 -1
- ccxt/bitbank.py +1 -1
- ccxt/bitbns.py +1 -1
- ccxt/bitfinex.py +1 -1
- ccxt/bitfinex2.py +1 -1
- ccxt/bitflyer.py +1 -1
- ccxt/bitget.py +2 -2
- ccxt/bithumb.py +1 -1
- ccxt/bitmart.py +3 -3
- ccxt/bitmex.py +1 -1
- ccxt/bitopro.py +1 -1
- ccxt/bitrue.py +1 -1
- ccxt/bitso.py +1 -1
- ccxt/bitstamp.py +1 -1
- ccxt/bitteam.py +1 -1
- ccxt/bitvavo.py +2 -2
- ccxt/bl3p.py +1 -1
- ccxt/blockchaincom.py +28 -28
- ccxt/blofin.py +1 -1
- ccxt/btcalpha.py +4 -11
- ccxt/btcbox.py +1 -1
- ccxt/btcmarkets.py +1 -1
- ccxt/btcturk.py +1 -1
- ccxt/bybit.py +2 -2
- ccxt/cex.py +2 -2
- ccxt/coinbase.py +33 -33
- ccxt/coinbaseexchange.py +1 -1
- ccxt/coinbaseinternational.py +1 -1
- ccxt/coincheck.py +1 -1
- ccxt/coinex.py +2 -2
- ccxt/coinlist.py +2 -2
- ccxt/coinmate.py +1 -1
- ccxt/coinmetro.py +1 -1
- ccxt/coinone.py +1 -1
- ccxt/coinsph.py +1 -1
- ccxt/coinspot.py +1 -1
- ccxt/cryptocom.py +1 -1
- ccxt/currencycom.py +1 -1
- ccxt/delta.py +2 -2
- ccxt/deribit.py +4 -4
- ccxt/digifinex.py +2 -2
- ccxt/exmo.py +2 -2
- ccxt/gate.py +2 -2
- ccxt/gemini.py +1 -1
- ccxt/hitbtc.py +1 -1
- ccxt/hollaex.py +1 -1
- ccxt/htx.py +3 -3
- ccxt/huobijp.py +1 -1
- ccxt/hyperliquid.py +2 -2
- ccxt/idex.py +1 -1
- ccxt/independentreserve.py +1 -1
- ccxt/indodax.py +1 -1
- ccxt/kraken.py +2 -2
- ccxt/kucoin.py +127 -46
- ccxt/kucoinfutures.py +1 -1
- ccxt/kuna.py +1 -1
- ccxt/latoken.py +1 -1
- ccxt/lbank.py +1 -1
- ccxt/luno.py +1 -1
- ccxt/lykke.py +1 -1
- ccxt/mercado.py +1 -1
- ccxt/mexc.py +1 -1
- ccxt/ndax.py +1 -1
- ccxt/novadax.py +1 -1
- ccxt/oceanex.py +1 -1
- ccxt/okcoin.py +1 -1
- ccxt/okx.py +3 -3
- ccxt/onetrading.py +1 -1
- ccxt/oxfun.py +2 -2
- ccxt/p2b.py +1 -1
- ccxt/paymium.py +1 -1
- ccxt/phemex.py +30 -3
- ccxt/poloniex.py +6 -4
- ccxt/poloniexfutures.py +1 -1
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/binance.py +3 -3
- ccxt/pro/bitvavo.py +2 -2
- ccxt/pro/bybit.py +20 -14
- ccxt/pro/cex.py +3 -3
- ccxt/pro/coinbase.py +22 -1
- ccxt/pro/cryptocom.py +1 -1
- ccxt/pro/gate.py +2 -2
- ccxt/pro/hitbtc.py +1 -1
- ccxt/pro/kraken.py +2 -2
- ccxt/pro/kucoin.py +65 -28
- ccxt/pro/okx.py +2 -2
- ccxt/pro/oxfun.py +2 -2
- ccxt/pro/poloniex.py +1 -1
- ccxt/pro/vertex.py +2 -2
- ccxt/probit.py +1 -1
- ccxt/test/{test_async.py → tests_async.py} +27 -280
- ccxt/test/tests_helpers.py +284 -0
- ccxt/test/tests_init.py +35 -0
- ccxt/test/{test_sync.py → tests_sync.py} +27 -282
- ccxt/timex.py +1 -1
- ccxt/tokocrypto.py +1 -1
- ccxt/tradeogre.py +1 -1
- ccxt/upbit.py +1 -1
- ccxt/vertex.py +2 -2
- ccxt/wavesexchange.py +1 -1
- ccxt/wazirx.py +1 -1
- ccxt/whitebit.py +2 -2
- ccxt/woo.py +31 -23
- ccxt/woofipro.py +3 -3
- ccxt/yobit.py +1 -1
- ccxt/zaif.py +1 -1
- ccxt/zonda.py +1 -1
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/METADATA +5 -5
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/RECORD +219 -252
- ccxt/test/base/__init__.py +0 -29
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -109
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -31
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_liquidation.py +0 -50
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -193
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -33
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -69
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -353
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -92
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/WHEEL +0 -0
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/top_level.txt +0 -0
ccxt/test/base/__init__.py
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
|
2
|
-
# ----------------------------------------------------------------------------
|
3
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
4
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
5
|
-
# -----------------------------------------------------------------------------
|
6
|
-
|
7
|
-
from ccxt.test.base.test_account import test_account # noqa E402
|
8
|
-
from ccxt.test.base.test_balance import test_balance # noqa E402
|
9
|
-
from ccxt.test.base.test_borrow_interest import test_borrow_interest # noqa E402
|
10
|
-
from ccxt.test.base.test_borrow_rate import test_borrow_rate # noqa E402
|
11
|
-
from ccxt.test.base.test_currency import test_currency # noqa E402
|
12
|
-
from ccxt.test.base.test_deposit_withdrawal import test_deposit_withdrawal # noqa E402
|
13
|
-
from ccxt.test.base.test_funding_rate_history import test_funding_rate_history # noqa E402
|
14
|
-
from ccxt.test.base.test_last_price import test_last_price # noqa E402
|
15
|
-
from ccxt.test.base.test_ledger_entry import test_ledger_entry # noqa E402
|
16
|
-
from ccxt.test.base.test_leverage_tier import test_leverage_tier # noqa E402
|
17
|
-
from ccxt.test.base.test_liquidation import test_liquidation # noqa E402
|
18
|
-
from ccxt.test.base.test_margin_mode import test_margin_mode # noqa E402
|
19
|
-
from ccxt.test.base.test_margin_modification import test_margin_modification # noqa E402
|
20
|
-
from ccxt.test.base.test_market import test_market # noqa E402
|
21
|
-
from ccxt.test.base.test_ohlcv import test_ohlcv # noqa E402
|
22
|
-
from ccxt.test.base.test_open_interest import test_open_interest # noqa E402
|
23
|
-
from ccxt.test.base.test_order import test_order # noqa E402
|
24
|
-
from ccxt.test.base.test_order_book import test_order_book # noqa E402
|
25
|
-
from ccxt.test.base.test_position import test_position # noqa E402
|
26
|
-
from ccxt.test.base.test_status import test_status # noqa E402
|
27
|
-
from ccxt.test.base.test_ticker import test_ticker # noqa E402
|
28
|
-
from ccxt.test.base.test_trade import test_trade # noqa E402
|
29
|
-
from ccxt.test.base.test_trading_fee import test_trading_fee # noqa E402
|
ccxt/test/base/test_account.py
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_account(exchange, skipped_properties, method, entry):
|
18
|
-
format = {
|
19
|
-
'info': {},
|
20
|
-
'code': 'BTC',
|
21
|
-
'type': 'spot',
|
22
|
-
'id': '12345',
|
23
|
-
}
|
24
|
-
empty_allowed_for = ['code', 'id']
|
25
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
26
|
-
test_shared_methods.assert_currency_code(exchange, skipped_properties, method, entry, entry['code'])
|
ccxt/test/base/test_balance.py
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.base.precise import Precise # noqa E402
|
16
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
17
|
-
|
18
|
-
def test_balance(exchange, skipped_properties, method, entry):
|
19
|
-
format = {
|
20
|
-
'free': {},
|
21
|
-
'used': {},
|
22
|
-
'total': {},
|
23
|
-
'info': {},
|
24
|
-
}
|
25
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format)
|
26
|
-
log_text = test_shared_methods.log_template(exchange, method, entry)
|
27
|
-
#
|
28
|
-
codes_total = list(entry['total'].keys())
|
29
|
-
codes_free = list(entry['free'].keys())
|
30
|
-
codes_used = list(entry['used'].keys())
|
31
|
-
test_shared_methods.assert_non_emtpy_array(exchange, skipped_properties, method, codes_total, 'total')
|
32
|
-
test_shared_methods.assert_non_emtpy_array(exchange, skipped_properties, method, codes_free, 'free')
|
33
|
-
test_shared_methods.assert_non_emtpy_array(exchange, skipped_properties, method, codes_used, 'used')
|
34
|
-
all_codes = exchange.array_concat(codes_total, codes_free)
|
35
|
-
all_codes = exchange.array_concat(all_codes, codes_used)
|
36
|
-
codes_length = len(codes_total)
|
37
|
-
free_length = len(codes_free)
|
38
|
-
used_length = len(codes_used)
|
39
|
-
assert (codes_length == free_length) or (codes_length == used_length), 'free and total and used codes have different lengths' + log_text
|
40
|
-
for i in range(0, len(all_codes)):
|
41
|
-
code = all_codes[i]
|
42
|
-
# testSharedMethods.assertCurrencyCode (exchange, skippedProperties, method, entry, code);
|
43
|
-
assert code in entry['total'], 'code ' + code + ' not in total' + log_text
|
44
|
-
assert code in entry['free'], 'code ' + code + ' not in free' + log_text
|
45
|
-
assert code in entry['used'], 'code ' + code + ' not in used' + log_text
|
46
|
-
total = exchange.safe_string(entry['total'], code)
|
47
|
-
free = exchange.safe_string(entry['free'], code)
|
48
|
-
used = exchange.safe_string(entry['used'], code)
|
49
|
-
assert total is not None, 'total is undefined' + log_text
|
50
|
-
assert free is not None, 'free is undefined' + log_text
|
51
|
-
assert used is not None, 'used is undefined' + log_text
|
52
|
-
assert Precise.string_ge(total, '0'), 'total is not positive' + log_text
|
53
|
-
assert Precise.string_ge(free, '0'), 'free is not positive' + log_text
|
54
|
-
assert Precise.string_ge(used, '0'), 'used is not positive' + log_text
|
55
|
-
sum_free_used = Precise.string_add(free, used)
|
56
|
-
assert Precise.string_eq(total, sum_free_used), 'free and used do not sum to total' + log_text
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_borrow_interest(exchange, skipped_properties, method, entry, requested_code, requested_symbol):
|
18
|
-
format = {
|
19
|
-
'info': {},
|
20
|
-
'account': 'BTC/USDT',
|
21
|
-
'currency': 'USDT',
|
22
|
-
'interest': exchange.parse_number('0.1444'),
|
23
|
-
'interestRate': exchange.parse_number('0.0006'),
|
24
|
-
'amountBorrowed': exchange.parse_number('30.0'),
|
25
|
-
'timestamp': 1638230400000,
|
26
|
-
'datetime': '2021-11-30T00:00:00.000Z',
|
27
|
-
}
|
28
|
-
empty_allowed_for = ['account']
|
29
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
30
|
-
test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry)
|
31
|
-
test_shared_methods.assert_currency_code(exchange, skipped_properties, method, entry, entry['currency'], requested_code)
|
32
|
-
test_shared_methods.assert_symbol(exchange, skipped_properties, method, entry, entry['account'], requested_symbol)
|
33
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'interest', '0')
|
34
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'interestRate', '0')
|
35
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'amountBorrowed', '0')
|
@@ -1,32 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_borrow_rate(exchange, skipped_properties, method, entry, requested_code):
|
18
|
-
format = {
|
19
|
-
'info': {},
|
20
|
-
'currency': 'USDT',
|
21
|
-
'timestamp': 1638230400000,
|
22
|
-
'datetime': '2021-11-30T00:00:00.000Z',
|
23
|
-
'rate': exchange.parse_number('0.0006'),
|
24
|
-
'period': 86400000,
|
25
|
-
}
|
26
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format)
|
27
|
-
test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry)
|
28
|
-
test_shared_methods.assert_currency_code(exchange, skipped_properties, method, entry, entry['currency'], requested_code)
|
29
|
-
#
|
30
|
-
# assert (borrowRate['period'] === 86400000 || borrowRate['period'] === 3600000) # Milliseconds in an hour or a day
|
31
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'period', '0')
|
32
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'rate', '0')
|
@@ -1,51 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
# THIS IS A MOCKUP FILE IN PROGRESS
|
4
|
-
|
5
|
-
# import argparse
|
6
|
-
import os
|
7
|
-
import sys
|
8
|
-
# import json
|
9
|
-
# import time
|
10
|
-
|
11
|
-
# ------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
14
|
-
sys.path.append(root)
|
15
|
-
|
16
|
-
# ------------------------------------------------------------------------------
|
17
|
-
|
18
|
-
import ccxt # noqa: E402
|
19
|
-
|
20
|
-
# ------------------------------------------------------------------------------
|
21
|
-
|
22
|
-
taker = 0.0025
|
23
|
-
maker = 0.0010
|
24
|
-
price = 100.00
|
25
|
-
amount = 10.00
|
26
|
-
|
27
|
-
market = {
|
28
|
-
'id': 'foobar',
|
29
|
-
'symbol': 'FOO/BAR',
|
30
|
-
'base': 'FOO',
|
31
|
-
'quote': 'BAR',
|
32
|
-
'taker': taker,
|
33
|
-
'maker': maker,
|
34
|
-
'precision': {
|
35
|
-
'price': 8,
|
36
|
-
'amount': 8,
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
exchange = ccxt.Exchange({
|
41
|
-
'id': 'mock',
|
42
|
-
'markets': {'FOO/BAR': market},
|
43
|
-
})
|
44
|
-
|
45
|
-
exchange.calculate_fee(market['symbol'], 'limit', 'sell', amount, price, 'taker', {})
|
46
|
-
|
47
|
-
# {'rate': {'quote': 0.0025, 'base': 0.0}, 'cost': {'quote': 2.5, 'base': 0.0}}
|
48
|
-
|
49
|
-
exchange.calculate_fee(market['symbol'], 'limit', 'sell', amount, price, 'maker', {})
|
50
|
-
|
51
|
-
# {'rate': {'quote': 0.001, 'base': 0.0}, 'cost': {'quote': 1.0, 'base': 0.0}}
|
ccxt/test/base/test_crypto.py
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
|
14
|
-
import ccxt # noqa: F402
|
15
|
-
import hashlib # noqa: F402
|
16
|
-
|
17
|
-
Exchange = ccxt.Exchange
|
18
|
-
hash = Exchange.hash
|
19
|
-
hmac = Exchange.hmac
|
20
|
-
ecdsa = Exchange.ecdsa
|
21
|
-
eddsa = Exchange.eddsa
|
22
|
-
jwt = Exchange.jwt
|
23
|
-
crc32 = Exchange.crc32
|
24
|
-
rsa = Exchange.rsa
|
25
|
-
encode = Exchange.encode
|
26
|
-
|
27
|
-
|
28
|
-
def equals(a, b):
|
29
|
-
return a == b
|
30
|
-
|
31
|
-
|
32
|
-
exchange = Exchange()
|
33
|
-
|
34
|
-
# ---------------------------------------------------------------------------------------------------------------------
|
35
|
-
|
36
|
-
assert hash(encode(''), 'sha256', 'hex') == 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
|
37
|
-
assert hash(encode('cheese'), 'sha256', 'hex') == '873ac9ffea4dd04fa719e8920cd6938f0c23cd678af330939cff53c3d2855f34'
|
38
|
-
|
39
|
-
assert hash(encode(''), 'md5', 'hex') == 'd41d8cd98f00b204e9800998ecf8427e'
|
40
|
-
assert hash(encode('sexyfish'), 'md5', 'hex') == 'c8a35464aa9d5683585786f44d5889f8'
|
41
|
-
|
42
|
-
assert hash(encode(''), 'sha1', 'hex') == 'da39a3ee5e6b4b0d3255bfef95601890afd80709'
|
43
|
-
assert hash(encode('nutella'), 'sha1', 'hex') == 'b3d60a34b744159793c483b067c56d8affc5111a'
|
44
|
-
assert hmac(encode('hello'), encode('there'), hashlib.sha256, 'hex') == '551e1c1ecbce0fe9b643745a376584a6289f5f43a46861b315fac9edc8d52a26'
|
45
|
-
assert hmac(encode('a message'), encode('a secret'), hashlib.md5, 'hex') == '0bfa503bdbc7358185fcd49b4869e23d'
|
46
|
-
|
47
|
-
# ---------------------------------------------------------------------------------------------------------------------
|
48
|
-
|
49
|
-
|
50
|
-
privateKey = '1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a'
|
51
|
-
|
52
|
-
|
53
|
-
assert(equals(ecdsa('1a', privateKey, 'secp256k1', 'sha256'), {
|
54
|
-
'r': '23dcb2a2a3728a35eb1a35cc01743c4609550d9cceaf2083550f13a9eb135f9f',
|
55
|
-
's': '317963fcac18e4ec9f7921b97d7ea0c82a873dd6299cbfb6af016e08ef5ed667',
|
56
|
-
'v': 0,
|
57
|
-
}))
|
58
|
-
|
59
|
-
|
60
|
-
assert(equals(ecdsa(privateKey, privateKey, 'secp256k1', None), {
|
61
|
-
'r': 'b84a36a6fbabd5277ede578448b93d48e70b38efb5b15b1d4e2a298accf938b1',
|
62
|
-
's': '66ebfb8221cda925526e699a59cd221bb4cc84bdc563024b1802c4d9e1d8bbe9',
|
63
|
-
'v': 1,
|
64
|
-
}))
|
65
|
-
|
66
|
-
# ---------------------------------------------------------------------------------------------------------------------
|
67
|
-
|
68
|
-
#
|
69
|
-
# assert exchange.hashMessage(privateKey) == '0x59ea5d98c3500c3729f95cf98aa91663f498518cc401360df2912742c232207f'
|
70
|
-
#
|
71
|
-
# assert(equals(exchange.signHash('0x59ea5d98c3500c3729f95cf98aa91663f498518cc401360df2912742c232207f', privateKey), {
|
72
|
-
# 'r': '0x6f684aa41c02da83dac3039d8805ddbe79a03b1297e247c7742cab8dfc19d341',
|
73
|
-
# 's': '0x62473881674550563cb028ff40a7846fd53620ddf40a20cc1003b8484a109a4a',
|
74
|
-
# 'v': 27
|
75
|
-
# }))
|
76
|
-
#
|
77
|
-
# assert(equals(exchange.signMessage(privateKey, privateKey), {
|
78
|
-
# 'r': '0x6f684aa41c02da83dac3039d8805ddbe79a03b1297e247c7742cab8dfc19d341',
|
79
|
-
# 's': '0x62473881674550563cb028ff40a7846fd53620ddf40a20cc1003b8484a109a4a',
|
80
|
-
# 'v': 27
|
81
|
-
# }))
|
82
|
-
#
|
83
|
-
# ---------------------------------------------------------------------------------------------------------------------
|
84
|
-
|
85
|
-
pemKeyArray = [
|
86
|
-
'-----BEGIN RSA PRIVATE KEY-----',
|
87
|
-
'MIIEpAIBAAKCAQEAqUtXQXv2uSm9zPvdJTRpu5/65rBjAoHmIiowAs+u7fY0QP9O',
|
88
|
-
'+T8CZRQjvZrfPomBiccjCxDo8mm7GkmL67rs9s7VOMQFvpTTtMBeglNSEbXJ3wTt',
|
89
|
-
'7WM5gD3ZAbhfGtwWdGpcOMX0hV5/d/fiw1zQk0+AooayTryZ7HV+DQcD1sGTYYir',
|
90
|
-
'LePUGkKV2NCvKtGOQfRAtuo0ccigMxMvEhWuExCc9Fhd077OpXMc0n7OiFqA2JWN',
|
91
|
-
'jlocM9S71Srvw/lDos8a7lGaFUV8gP1CsQY/4qTju6hhsRd4lFujVr5J9FqmDbnv',
|
92
|
-
'wQ79SSu6+lT0+ToFdDHiYOorBK2ESFR7EzlyLwIDAQABAoIBAEobQMbZjNbg/sSM',
|
93
|
-
'O/HdT6tiDGKPM8gVNLgf34RbhSeFbrpFCDzy6Al3F24YLUEi0CGPmjdt34q93blU',
|
94
|
-
'GHvIB5LCV3PR2vHiFAo7ayOBdZtrCEMn1T7lAHaynBu0qW0IiovLQzNW9AKtqv7I',
|
95
|
-
'8+qw5lyVoKmEbOkqhfaMN/Fb8MJAo3yEVyhyp4EjtFhqDQ9DuHEjp1jGthnMgm+4',
|
96
|
-
'qFyELf0DXZSAN+R9IGDqWPyo78lOcPW4pgeLuoLQ6Nn/2JAEGHFt1a7zMEw5yYbR',
|
97
|
-
'XB89Bh0dheSmopBN6Heay4YuhnNKua37OlL1/nhKpLGUNE3z/UOXeiUiMeE1C2i+',
|
98
|
-
'GjK+xgECgYEA4XH63rJ3VYDHHWUGlWffFWkEpgR4BDEkZ8MyVYQoUjQA2TpCvQ2+',
|
99
|
-
'bR7aAIGXhBnRTrIBNu9m4+am0aUfi1hVmVHqt1b2vFgEb9uKuO4U62tCFpeji+Rz',
|
100
|
-
'8C8QJyu5v5OUWdQZ4EA0d7ljeoTl50g8tpcGsDhnImLt+/jvJuFt8dECgYEAwD0n',
|
101
|
-
'rhlkEjKVHxu1xwKeczxYCqqcUV9Quq8HnPh4VJQ77ljfZ57V7sAKrFDi5XfVD9jS',
|
102
|
-
'oJPwxjw6za134VobhdvCM6WNs6AJmbR8E/b5kDMbGaZn27vt+/8JfnGaWBqpDi6W',
|
103
|
-
'a5xoJOqmcMBQBK1YleZDoY4PLbk+onVKLMfGI/8CgYEAkyUIv8euGdGWpHnm5SdJ',
|
104
|
-
'tLi5vv4Vs267uzntJWG/y3+DukTLgIdy7dgAI+pxkVgkg/+syUVSW5eU9CqZPyLl',
|
105
|
-
'o8+Sqh2Jp36vTq71iSRj5RA5r3ND3K+8eFzPZzGj6AWUA1lrljFxzV7kLfiF8gH1',
|
106
|
-
'FpvWUrhNoGT/vcFJno/uabECgYAecRC5hxfLserfVDoC261PvjyK492BHUDhbxob',
|
107
|
-
'h1U2v4qGAdjOxd5Gwm5uPxjPEZzRt5oTB5pXKe5953xWWTiGh/hGyW6ZBTy/9E65',
|
108
|
-
'sqBub0lZVHqZ1zamcwqD1WWFkiM3NbVoMQpk3iuhKzMAqpqekiofiSlqKi16+GvY',
|
109
|
-
'j4IW7QKBgQCrIUckPZ6IY3ERIN1IL4TIcK2gOJcznp7fLWpC+sv35ya3OhtDXKFt',
|
110
|
-
'GjIHmwLuiUNc0iPzA9Rw89W0zIkKWmWcxM88/ithdxh3MEeNDUGSnd4hQ9SECwxB',
|
111
|
-
'Wem3eBT7I4VtFYoaTE3/bX1SKfgBdTzIRqWKSDpgBNZg/P2Tc+s11g==',
|
112
|
-
'-----END RSA PRIVATE KEY-----',
|
113
|
-
]
|
114
|
-
|
115
|
-
|
116
|
-
pemKey = "\n".join(pemKeyArray)
|
117
|
-
assert rsa('hello', pemKey, 'sha256') == 'PqHotvSEBvM/AejnMOWBXUcOf3uHtcGu2zAYdlYdnlNSSQ80Uq4lcyAEstnZ2AnQJ9l5TCC53uoRZ26GQ47zlACgqtYglmPhQKLvQ5fldRzeBauYhGgM2C0mUuUGxh074fNGbK+bgmwEmDMIrnSPtXwiCqTAHh+8VEnC7us3t09D61y298dPBJYEBNN3dFZT0w0pCIQg3j3DSiFJOCfywmOKyXqS1pvmk6A38DVclQZORQ5WZXp2yvSKRLjxpzjxDl76h1GfbBl7sMLEFMyzk0wyIhIz8ZELMibYn036G4X1IcSlDcimthEkIbn2QjM0ntyYDZIS4QnsMBjvkV2UHw=='
|
118
|
-
assert rsa('poopy', pemKey, 'sha256') == 'or069qHwRDyl162T1s5G5+LfLnvDxlgk9kEsJvwI3vM02KB1LHW4+8gWqsV4TENZpeqed2Tb4na6ex+L/UR8JxJnnZtpVp33nUBgcp3miqp/YhcGN4++qolP4YN/21/AyfLFZW+VYggc+Mhh6PJSm+0dSEWMVsP35uH+35abXVxgB8GVOn7YTOSPaL8aw7hn4wlZWf2ieikKAi7AwAjkxnd7/Bu5+cW8D+ZdPHQfSKj+XHuPXlJNuQX0MDIqhdD2yuYJOQL56eKYs6nHPlClATkndSaAemQSGKet3X3Iz1awG4MGgz2Ei6bOanlNugc0f6Rng6rdwmqiMU3G4it6cw=='
|
119
|
-
|
120
|
-
assert jwt({'chicken': 'salad'}, encode(pemKey), 'sha256', True) == 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjaGlja2VuIjoic2FsYWQifQ.FSKD5Y6RNzkHTuHdvG3753U7QNZ-u-GUSPfP1FMjEaK0Rr_iyQTSSmHhkdYSFFnmBvrrN_l-UwKwir52WlsgmQm9HYm0kidxbj7fWwrK2E1oe0P7OjupFjv1BZxc5W69WeaHtOPWe28tiHiON1LCnax6HgfI5lcIBsESGIIBZMVeaioQn9gDVwea7JxJvAlrhDIWZowIHTIdCQocXip7g5jREWHeEIuJNug67mwnfAFxCjvTRiTd0Bw6oBwjM3FLya-RyEyWrejQOWSuC8CNWVUHISaSmEyZ7uM6wTi2m_58TaE9mQwlef32OPErPvvBpgL5pZIyQ4ymwrCIFQLBQQ'
|
121
|
-
assert jwt({'lil': 'xan'}, encode('betrayed'), 'sha256', False) == 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsaWwiOiJ4YW4ifQ.md-oFvZagA-NXmZoRNyJOQ7zwK-PWUMmMQ_LI9ZOKaM'
|
122
|
-
|
123
|
-
assert crc32('hello', True) == 907060870
|
124
|
-
assert crc32('tasty chicken breast :)', True) == 825820175
|
125
|
-
assert crc32('21101:0.00123125:21102:-0.001:21100:0.710705:21103:-0.001:21096:0.71076:21104:-0.001:21094:1.0746:21105:-0.001:21093:0.710854:21106:-0.419:21092:0.01368102:21107:-0.001:21090:0.710975:21109:-0.001:21089:0.63586344:21110:-1.186213:21087:0.299:21111:-0.48751202:21086:0.9493:21112:-0.03702409:21082:0.03537667:21113:-0.712385:21081:0.00101366:21114:-0.2903:21079:0.710713:21115:-0.001:21078:0.997048:21116:-0.60089827:21077:0.23770225:21117:-0.83201:21076:0.03619135:21118:-0.09996142:21075:0.1272433:21119:-1.09681107:21074:0.7447885:21120:-0.04771792:21073:0.0011:21121:-0.91495684:21072:0.73311632:21122:-0.07940416:21071:0.09817:21123:-0.39376843:21070:0.19101052:21124:-1.51692599:21069:0.2757:21125:-0.11107322:21068:0.12480303:21126:-0.12704666:21067:0.4201:21128:-0.12804666', True) == -51055998
|
126
|
-
|
127
|
-
# assert eddsa('1b1b', privateKey, 'ed25519') == '3DBaaz8z4Pq9n6ncNCjB4pFLWaWTXbjaCUqKQmBgS3w7AP6opeDqANBhPssbV3jyfJB4LfK8kGR6pu6GU8fbjMuy'
|
ccxt/test/base/test_currency.py
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_currency(exchange, skipped_properties, method, entry):
|
18
|
-
format = {
|
19
|
-
'id': 'btc',
|
20
|
-
'code': 'BTC',
|
21
|
-
}
|
22
|
-
# todo: remove fee from empty
|
23
|
-
empty_allowed_for = ['name', 'fee']
|
24
|
-
# todo: info key needs to be added in base, when exchange does not have fetchCurrencies
|
25
|
-
is_native = exchange.has['fetchCurrencies'] and exchange.has['fetchCurrencies'] != 'emulated'
|
26
|
-
currency_type = exchange.safe_string(entry, 'type')
|
27
|
-
if is_native:
|
28
|
-
format['info'] = {}
|
29
|
-
# todo: 'name': 'Bitcoin', # uppercase string, base currency, 2 or more letters
|
30
|
-
# these two fields are being dynamically added a bit below
|
31
|
-
# format['withdraw'] = true; # withdraw enabled
|
32
|
-
# format['deposit'] = true; # deposit enabled
|
33
|
-
format['precision'] = exchange.parse_number('0.0001') # in case of SIGNIFICANT_DIGITS it will be 4 - number of digits "after the dot"
|
34
|
-
format['fee'] = exchange.parse_number('0.001')
|
35
|
-
format['networks'] = {}
|
36
|
-
format['limits'] = {
|
37
|
-
'withdraw': {
|
38
|
-
'min': exchange.parse_number('0.01'),
|
39
|
-
'max': exchange.parse_number('1000'),
|
40
|
-
},
|
41
|
-
'deposit': {
|
42
|
-
'min': exchange.parse_number('0.01'),
|
43
|
-
'max': exchange.parse_number('1000'),
|
44
|
-
},
|
45
|
-
}
|
46
|
-
# todo: format['type'] = 'fiat|crypto'; # after all exchanges have `type` defined, romove "if" check
|
47
|
-
if currency_type is not None:
|
48
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'type', ['fiat', 'crypto', 'other'])
|
49
|
-
# only require "deposit" & "withdraw" values, when currency is not fiat, or when it's fiat, but not skipped
|
50
|
-
if currency_type == 'crypto' or not ('depositForNonCrypto' in skipped_properties):
|
51
|
-
format['deposit'] = True
|
52
|
-
if currency_type == 'crypto' or not ('withdrawForNonCrypto' in skipped_properties):
|
53
|
-
format['withdraw'] = True
|
54
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
55
|
-
test_shared_methods.assert_currency_code(exchange, skipped_properties, method, entry, entry['code'])
|
56
|
-
#
|
57
|
-
test_shared_methods.check_precision_accuracy(exchange, skipped_properties, method, entry, 'precision')
|
58
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'fee', '0')
|
59
|
-
if not ('limits' in skipped_properties):
|
60
|
-
limits = exchange.safe_value(entry, 'limits', {})
|
61
|
-
withdraw_limits = exchange.safe_value(limits, 'withdraw', {})
|
62
|
-
deposit_limits = exchange.safe_value(limits, 'deposit', {})
|
63
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, withdraw_limits, 'min', '0')
|
64
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, withdraw_limits, 'max', '0')
|
65
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, deposit_limits, 'min', '0')
|
66
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, deposit_limits, 'max', '0')
|
67
|
-
# max should be more than min (withdrawal limits)
|
68
|
-
min_string_withdrawal = exchange.safe_string(withdraw_limits, 'min')
|
69
|
-
if min_string_withdrawal is not None:
|
70
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, withdraw_limits, 'max', min_string_withdrawal)
|
71
|
-
# max should be more than min (deposit limits)
|
72
|
-
min_string_deposit = exchange.safe_string(deposit_limits, 'min')
|
73
|
-
if min_string_deposit is not None:
|
74
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, deposit_limits, 'max', min_string_deposit)
|
75
|
-
# check valid ID & CODE
|
76
|
-
test_shared_methods.assert_valid_currency_id_and_code(exchange, skipped_properties, method, entry, entry['id'], entry['code'])
|
ccxt/test/base/test_datetime.py
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
|
14
|
-
import ccxt # noqa: F402
|
15
|
-
from ccxt.base.decimal_to_precision import ROUND_UP, ROUND_DOWN # noqa F401
|
16
|
-
|
17
|
-
# ----------------------------------------------------------------------------
|
18
|
-
|
19
|
-
# @ts-nocheck
|
20
|
-
|
21
|
-
exchange = ccxt.Exchange({
|
22
|
-
'id': 'regirock',
|
23
|
-
})
|
24
|
-
|
25
|
-
# ----------------------------------------------------------------------------
|
26
|
-
|
27
|
-
assert exchange.iso8601(514862627000) == '1986-04-26T01:23:47.000Z'
|
28
|
-
assert exchange.iso8601(514862627559) == '1986-04-26T01:23:47.559Z'
|
29
|
-
assert exchange.iso8601(514862627062) == '1986-04-26T01:23:47.062Z'
|
30
|
-
|
31
|
-
assert exchange.iso8601(0) == '1970-01-01T00:00:00.000Z'
|
32
|
-
|
33
|
-
assert exchange.iso8601(-1) is None
|
34
|
-
assert exchange.iso8601() is None
|
35
|
-
assert exchange.iso8601(None) is None
|
36
|
-
assert exchange.iso8601('') is None
|
37
|
-
assert exchange.iso8601('a') is None
|
38
|
-
assert exchange.iso8601({}) is None
|
39
|
-
|
40
|
-
# ----------------------------------------------------------------------------
|
41
|
-
|
42
|
-
assert exchange.parse8601('1986-04-26T01:23:47.000Z') == 514862627000
|
43
|
-
assert exchange.parse8601('1986-04-26T01:23:47.559Z') == 514862627559
|
44
|
-
assert exchange.parse8601('1986-04-26T01:23:47.062Z') == 514862627062
|
45
|
-
|
46
|
-
assert exchange.parse8601('1986-04-26T01:23:47.06Z') == 514862627060
|
47
|
-
assert exchange.parse8601('1986-04-26T01:23:47.6Z') == 514862627600
|
48
|
-
|
49
|
-
assert exchange.parse8601('1977-13-13T00:00:00.000Z') is None
|
50
|
-
assert exchange.parse8601('1986-04-26T25:71:47.000Z') is None
|
51
|
-
|
52
|
-
assert exchange.parse8601('3333') is None
|
53
|
-
assert exchange.parse8601('Sr90') is None
|
54
|
-
assert exchange.parse8601('') is None
|
55
|
-
assert exchange.parse8601() is None
|
56
|
-
assert exchange.parse8601(None) is None
|
57
|
-
assert exchange.parse8601({}) is None
|
58
|
-
assert exchange.parse8601(33) is None
|
59
|
-
|
60
|
-
# ----------------------------------------------------------------------------
|
61
|
-
|
62
|
-
assert exchange.parse_date('1986-04-26 00:00:00') == 514857600000
|
63
|
-
assert exchange.parse_date('1986-04-26T01:23:47.000Z') == 514862627000
|
64
|
-
assert exchange.parse_date('1986-13-13 00:00:00') is None
|
65
|
-
# GMT formats
|
66
|
-
assert exchange.parse_date('Mon, 29 Apr 2024 14:00:17 GMT') == 1714399217000
|
67
|
-
assert exchange.parse_date('Mon, 29 Apr 2024 14:09:17 GMT') == 1714399757000
|
68
|
-
assert exchange.parse_date('Sun, 29 Dec 2024 01:01:10 GMT') == 1735434070000
|
69
|
-
assert exchange.parse_date('Sun, 29 Dec 2024 02:11:10 GMT') == 1735438270000
|
70
|
-
assert exchange.parse_date('Sun, 08 Dec 2024 02:03:04 GMT') == 1733623384000
|
71
|
-
|
72
|
-
|
73
|
-
assert exchange.roundTimeframe('5m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) == exchange.parse8601('2019-08-12 13:20:00')
|
74
|
-
assert exchange.roundTimeframe('10m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) == exchange.parse8601('2019-08-12 13:20:00')
|
75
|
-
assert exchange.roundTimeframe('30m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) == exchange.parse8601('2019-08-12 13:00:00')
|
76
|
-
assert exchange.roundTimeframe('1d', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) == exchange.parse8601('2019-08-12 00:00:00')
|
77
|
-
|
78
|
-
assert exchange.roundTimeframe('5m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) == exchange.parse8601('2019-08-12 13:25:00')
|
79
|
-
assert exchange.roundTimeframe('10m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) == exchange.parse8601('2019-08-12 13:30:00')
|
80
|
-
assert exchange.roundTimeframe('30m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) == exchange.parse8601('2019-08-12 13:30:00')
|
81
|
-
assert exchange.roundTimeframe('1h', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) == exchange.parse8601('2019-08-12 14:00:00')
|
82
|
-
assert exchange.roundTimeframe('1d', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) == exchange.parse8601('2019-08-13 00:00:00')
|
83
|
-
|
84
|
-
# todo:
|
85
|
-
# $self->assertSame(null, Exchange::iso8601(null))
|
86
|
-
# $self->assertSame(null, Exchange::iso8601(False))
|
87
|
-
# $self->assertSame(null, Exchange::iso8601([]))
|
88
|
-
# $self->assertSame(null, Exchange::iso8601('abracadabra'))
|
89
|
-
# $self->assertSame(null, Exchange::iso8601('1.2'))
|
90
|
-
# $self->assertSame(null, Exchange::iso8601(-1))
|
91
|
-
# $self->assertSame(null, Exchange::iso8601('-1'))
|
92
|
-
# $self->assertSame('1970-01-01T00:00:00.000+00:00', Exchange::iso8601(0))
|
93
|
-
# $self->assertSame('1970-01-01T00:00:00.000+00:00', Exchange::iso8601('0'))
|
94
|
-
# $self->assertSame('1986-04-25T21:23:47.000+00:00', Exchange::iso8601(514848227000))
|
95
|
-
# $self->assertSame('1986-04-25T21:23:47.000+00:00', Exchange::iso8601('514848227000'))
|
96
|
-
|
97
|
-
# $self->assertSame(null, Exchange::parse_date(null))
|
98
|
-
# $self->assertSame(null, Exchange::parse_date(0))
|
99
|
-
# $self->assertSame(null, Exchange::parse_date('0'))
|
100
|
-
# $self->assertSame(null, Exchange::parse_date('+1 day'))
|
101
|
-
# $self->assertSame(null, Exchange::parse_date('1986-04-25T21:23:47+00:00 + 1 week'))
|
102
|
-
# $self->assertSame(null, Exchange::parse_date('1 february'))
|
103
|
-
# $self->assertSame(null, Exchange::parse_date('1986-04-26'))
|
104
|
-
# $self->assertSame(0, Exchange::parse_date('1970-01-01T00:00:00.000+00:00'))
|
105
|
-
# $self->assertSame(514848227000, Exchange::parse_date('1986-04-25T21:23:47+00:00'))
|
106
|
-
# $self->assertSame(514848227000, Exchange::parse_date('1986-04-26T01:23:47+04:00'))
|
107
|
-
# $self->assertSame(514848227000, Exchange::parse_date('25 Apr 1986 21:23:47 GMT'))
|
108
|
-
# $self->assertSame(514862627000, Exchange::parse_date('1986-04-26T01:23:47.000Z'))
|
109
|
-
# $self->assertSame(514862627123, Exchange::parse_date('1986-04-26T01:23:47.123Z'))
|