diff --git a/README.md b/README.md index a2680c02..494a0ec3 100644 --- a/README.md +++ b/README.md @@ -76,3 +76,4 @@ test ## Any contributions you make will be under the same License When you submit code changes, your submissions are understood to be under the same [License](https://github.com/dydxprotocol/v4-web/blob/master/LICENSE) that covers the project. + diff --git a/v4-client-py-v2/tests/conftest.py b/v4-client-py-v2/tests/conftest.py index 0eeac034..769000b4 100644 --- a/v4-client-py-v2/tests/conftest.py +++ b/v4-client-py-v2/tests/conftest.py @@ -61,6 +61,16 @@ TEST_ADDRESS_3 = "dydx1wldnytkerzs39rs28djn0p9vvqer2x2k5x8hjy" +# Symbol/instrument-specific test configuration +# Market symbol identifier (e.g., "ENA-USD", "BTC-USD") +TEST_MARKET_ID: str = "ENA-USD" + +# ClobPairId for the test market +TEST_CLOB_PAIR_ID: int = 127 + +# Default subticks value for test orders (price precision, symbol-specific) +TEST_DEFAULT_SUBTICKS: int = 1000000 + @pytest.fixture def indexer_rest_client() -> IndexerClient: @@ -126,7 +136,7 @@ def test_order_id(test_address) -> OrderId: test_address, subaccount_number=0, client_id=random.randint(0, 1000000000), - clob_pair_id=127, + clob_pair_id=TEST_CLOB_PAIR_ID, order_flags=64, ) @@ -138,8 +148,8 @@ def test_order(test_order_id) -> Order: time_in_force=Order.TimeInForce.TIME_IN_FORCE_UNSPECIFIED, reduce_only=False, side=Order.Side.SIDE_BUY, - quantums=1000000, - subticks=1000000, + quantums=TEST_DEFAULT_SUBTICKS, + subticks=TEST_DEFAULT_SUBTICKS, good_til_block_time=int(time.time() + 60), builder_code_parameters=None, twap_parameters=None, @@ -155,7 +165,7 @@ def test_order2(test_order_id) -> Order: reduce_only=False, side=Order.Side.SIDE_BUY, quantums=1000000, - subticks=1000000, + subticks=TEST_DEFAULT_SUBTICKS, good_til_block_time=int(time.time() + 60), builder_code_parameters=None, twap_parameters=None, diff --git a/v4-client-py-v2/tests/indexer/rest/modules/test_markets_endpoints.py b/v4-client-py-v2/tests/indexer/rest/modules/test_markets_endpoints.py index 32a9c360..8ba0e1d9 100644 --- a/v4-client-py-v2/tests/indexer/rest/modules/test_markets_endpoints.py +++ b/v4-client-py-v2/tests/indexer/rest/modules/test_markets_endpoints.py @@ -1,15 +1,13 @@ import pytest -from tests.conftest import retry_on_forbidden - -MARKET_BTC_USD: str = "ENA-USD" +from tests.conftest import retry_on_forbidden, TEST_MARKET_ID @pytest.mark.asyncio @retry_on_forbidden(max_retries=3, delay=1) async def test_markets(indexer_rest_client): response = await indexer_rest_client.markets.get_perpetual_markets() - btc = response["markets"][MARKET_BTC_USD] + btc = response["markets"][TEST_MARKET_ID] status = btc["status"] assert status == "ACTIVE" @@ -17,8 +15,8 @@ async def test_markets(indexer_rest_client): @pytest.mark.asyncio @retry_on_forbidden(max_retries=3, delay=1) async def test_btc_market(indexer_rest_client): - response = await indexer_rest_client.markets.get_perpetual_markets(MARKET_BTC_USD) - btc = response["markets"][MARKET_BTC_USD] + response = await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID) + btc = response["markets"][TEST_MARKET_ID] status = btc["status"] assert status == "ACTIVE" @@ -27,7 +25,7 @@ async def test_btc_market(indexer_rest_client): @retry_on_forbidden(max_retries=3, delay=1) async def test_btc_trades(indexer_rest_client): response = await indexer_rest_client.markets.get_perpetual_market_trades( - MARKET_BTC_USD + TEST_MARKET_ID ) trades = response["trades"] assert trades is not None @@ -37,7 +35,7 @@ async def test_btc_trades(indexer_rest_client): @retry_on_forbidden(max_retries=3, delay=1) async def test_btc_orderbook(indexer_rest_client): response = await indexer_rest_client.markets.get_perpetual_market_orderbook( - MARKET_BTC_USD + TEST_MARKET_ID ) asks = response["asks"] bids = response["bids"] @@ -49,7 +47,7 @@ async def test_btc_orderbook(indexer_rest_client): @retry_on_forbidden(max_retries=3, delay=1) async def test_btc_candles(indexer_rest_client): response = await indexer_rest_client.markets.get_perpetual_market_candles( - MARKET_BTC_USD, "1MIN" + TEST_MARKET_ID, "1MIN" ) candles = response["candles"] assert candles is not None @@ -60,7 +58,7 @@ async def test_btc_candles(indexer_rest_client): async def test_btc_historical_funding(indexer_rest_client): response = ( await indexer_rest_client.markets.get_perpetual_market_historical_funding( - MARKET_BTC_USD + TEST_MARKET_ID ) ) assert response is not None @@ -75,5 +73,5 @@ async def test_btc_historical_funding(indexer_rest_client): @retry_on_forbidden(max_retries=3, delay=1) async def test_sparklines(indexer_rest_client): response = await indexer_rest_client.markets.get_perpetual_market_sparklines() - btc_sparklines = response[MARKET_BTC_USD] + btc_sparklines = response[TEST_MARKET_ID] assert btc_sparklines is not None diff --git a/v4-client-py-v2/tests/indexer/socket/test_websocket.py b/v4-client-py-v2/tests/indexer/socket/test_websocket.py index c5dbc052..1d82a678 100644 --- a/v4-client-py-v2/tests/indexer/socket/test_websocket.py +++ b/v4-client-py-v2/tests/indexer/socket/test_websocket.py @@ -5,6 +5,7 @@ from dotenv import load_dotenv from dydx_v4_client.indexer.candles_resolution import CandlesResolution +from tests.conftest import TEST_MARKET_ID load_dotenv() @@ -17,16 +18,16 @@ async def test_order_book(indexer_socket_client): def on_message(ws, message): message_dict = json.loads(message) if message_dict["type"] == "connected": - ws.order_book.subscribe(id="ENA-USD") + ws.order_book.subscribe(id=TEST_MARKET_ID) elif message_dict["type"] == "subscribed": assert message_dict["channel"] == order_book_channel_name if os.getenv("CI") == "true": - ws.order_book.unsubscribe(id="ENA-USD") + ws.order_book.unsubscribe(id=TEST_MARKET_ID) ws.close() elif message_dict["type"] in ["channel_data", "channel_batch_data"]: assert message_dict["channel"] == order_book_channel_name assert "bids" or "asks" in message_dict["contents"][0] - ws.order_book.unsubscribe(id="ENA-USD") + ws.order_book.unsubscribe(id=TEST_MARKET_ID) ws.close() else: ws.close() @@ -43,16 +44,16 @@ async def test_trades(indexer_socket_client): def on_message(ws, message): message_dict = json.loads(message) if message_dict["type"] == "connected": - ws.trades.subscribe(id="ENA-USD") + ws.trades.subscribe(id=TEST_MARKET_ID) elif message_dict["type"] == "subscribed": assert message_dict["channel"] == trades_channel_name if os.getenv("CI") == "true": - ws.trades.unsubscribe(id="ENA-USD") + ws.trades.unsubscribe(id=TEST_MARKET_ID) ws.close() elif message_dict["type"] in ["channel_data", "channel_batch_data"]: assert message_dict["channel"] == trades_channel_name assert "trades" in message_dict["contents"][0] - ws.trades.unsubscribe(id="ENA-USD") + ws.trades.unsubscribe(id=TEST_MARKET_ID) ws.close() else: ws.close() diff --git a/v4-client-py-v2/tests/test_authenticator.py b/v4-client-py-v2/tests/test_authenticator.py index 3125c59b..3afcf968 100644 --- a/v4-client-py-v2/tests/test_authenticator.py +++ b/v4-client-py-v2/tests/test_authenticator.py @@ -12,7 +12,6 @@ TEST_ADDRESS_2, ) -MARKET_ID = "ENA-USD" REQUEST_PROCESSING_TIME = 5 diff --git a/v4-client-py-v2/tests/test_batch_cancel.py b/v4-client-py-v2/tests/test_batch_cancel.py index c8643673..11ee2b8a 100644 --- a/v4-client-py-v2/tests/test_batch_cancel.py +++ b/v4-client-py-v2/tests/test_batch_cancel.py @@ -17,10 +17,10 @@ DYDX_TEST_MNEMONIC_3, assert_successful_broadcast, DYDX_TEST_MNEMONIC_3, + TEST_MARKET_ID, + TEST_CLOB_PAIR_ID, ) -MARKET_ID = "ENA-USD" -PERPETUAL_PAIR_ENA_USD = 127 REQUEST_PROCESSING_TIME = 5 @@ -38,9 +38,9 @@ def sleep_after_test(request): @pytest.mark.asyncio async def test_batch_cancel(indexer_rest_client, node_client, test_address, wallet): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) height = await node_client.latest_block_height() assert height > 0 @@ -79,7 +79,7 @@ async def test_batch_cancel(indexer_rest_client, node_client, test_address, wall # Prepare batch cancel subaccount_id = SubaccountId(owner=test_address, number=0) - order_batch = OrderBatch(clob_pair_id=PERPETUAL_PAIR_ENA_USD, client_ids=client_ids) + order_batch = OrderBatch(clob_pair_id=TEST_CLOB_PAIR_ID, client_ids=client_ids) cancellation_current_block = await node_client.latest_block_height() # Execute batch cancel diff --git a/v4-client-py-v2/tests/test_mutating_node_client.py b/v4-client-py-v2/tests/test_mutating_node_client.py index 6e2c2c4b..59ac60fb 100644 --- a/v4-client-py-v2/tests/test_mutating_node_client.py +++ b/v4-client-py-v2/tests/test_mutating_node_client.py @@ -11,14 +11,18 @@ from dydx_v4_client.node.message import subaccount, send_token, order from v4_proto.dydxprotocol.clob.order_pb2 import Order from dydx_v4_client.indexer.rest.constants import OrderType -from tests.conftest import get_wallet, assert_successful_broadcast, TEST_ADDRESS_2 +from tests.conftest import ( + get_wallet, + assert_successful_broadcast, + TEST_ADDRESS_2, + TEST_MARKET_ID, +) from v4_proto.dydxprotocol.clob.order_pb2 import BuilderCodeParameters from dydx_v4_client.indexer.rest.constants import OrderStatus from dydx_v4_client.key_pair import KeyPair REQUEST_PROCESSING_TIME = 5 -MARKET_ID = "ENA-USD" SUBACCOUNT = 0 @@ -211,7 +215,7 @@ async def test_query_address(node_client, test_address): @pytest.mark.asyncio async def test_create_market_permissionless(node_client, wallet, test_address): - ticker = "ENA-USD" + ticker = TEST_MARKET_ID try: response = await node_client.create_market_permissionless( wallet, ticker, test_address, 0 @@ -334,9 +338,9 @@ async def test_place_order_with_twap_parameters( node_client, indexer_rest_client, test_address, wallet, liquidity_setup, key_pair ): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) wallet = await get_wallet(node_client, key_pair, test_address) @@ -378,9 +382,9 @@ async def test_close_position_sell_no_reduce_by( node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair ): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) wallet = await get_wallet(node_client, key_pair, test_address) @@ -452,7 +456,7 @@ async def setup_liquidity_orders(node_client, indexer_rest_client, wallet_2, mar # Fetch orderbook to get current bid/ask try: orderbook = await indexer_rest_client.markets.get_perpetual_market_orderbook( - MARKET_ID + TEST_MARKET_ID ) best_bid = ( float(orderbook["bids"][0]["price"]) @@ -587,9 +591,9 @@ async def liquidity_setup(node_client, indexer_rest_client, wallet_2, key_pair_2 Places buy and sell orders at ±0.1% from oracle price using TEST_ADDRESS_2. """ market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) # Setup: place liquidity orders @@ -618,9 +622,9 @@ async def test_close_position_sell_having_reduce_by( node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair ): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) wallet = await get_wallet(node_client, key_pair, test_address) @@ -691,9 +695,9 @@ async def test_close_position_buy_no_reduce_by( node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair ): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) wallet = await get_wallet(node_client, key_pair, test_address) @@ -759,9 +763,9 @@ async def test_close_position_buy_having_reduce_by( node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair ): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) wallet = await get_wallet(node_client, key_pair, test_address) @@ -828,9 +832,9 @@ async def test_close_position_slippage_pct_raise_exception( node_client, wallet, test_address, indexer_rest_client ): market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) with pytest.raises(ValueError): _ = await node_client.close_position( @@ -872,9 +876,11 @@ async def get_current_order_size( return None if "openPerpetualPositions" not in subaccount["subaccount"]: return None - if "ENA-USD" not in subaccount["subaccount"]["openPerpetualPositions"]: + if TEST_MARKET_ID not in subaccount["subaccount"]["openPerpetualPositions"]: return None - return float(subaccount["subaccount"]["openPerpetualPositions"]["ENA-USD"]["size"]) + return float( + subaccount["subaccount"]["openPerpetualPositions"][TEST_MARKET_ID]["size"] + ) async def close_open_positions( diff --git a/v4-client-py-v2/tests/test_revenue_share.py b/v4-client-py-v2/tests/test_revenue_share.py index 4f26b673..0b6b8ad4 100644 --- a/v4-client-py-v2/tests/test_revenue_share.py +++ b/v4-client-py-v2/tests/test_revenue_share.py @@ -4,7 +4,7 @@ from dydx_v4_client import MAX_CLIENT_ID, OrderFlags from dydx_v4_client.indexer.rest.constants import OrderType from dydx_v4_client.node.market import Market -from tests.conftest import TEST_ADDRESS_2, TEST_ADDRESS_3 +from tests.conftest import TEST_ADDRESS_2, TEST_ADDRESS_3, TEST_MARKET_ID from v4_proto.dydxprotocol.clob.order_pb2 import Order from v4_proto.dydxprotocol.revshare import query_pb2 as revshare_query import pytest @@ -13,11 +13,10 @@ async def test_place_order_with_order_router_address( node_client, indexer_rest_client, test_order_id, test_address, wallet ): - MARKET_ID = "ENA-USD" market = Market( - (await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][ - MARKET_ID - ] + (await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[ + "markets" + ][TEST_MARKET_ID] ) assert market is not None