Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

18 changes: 14 additions & 4 deletions v4-client-py-v2/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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,
)

Expand All @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
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"


@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"

Expand All @@ -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
Expand All @@ -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"]
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
13 changes: 7 additions & 6 deletions v4-client-py-v2/tests/indexer/socket/test_websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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()
Expand All @@ -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()
Expand Down
1 change: 0 additions & 1 deletion v4-client-py-v2/tests/test_authenticator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
TEST_ADDRESS_2,
)

MARKET_ID = "ENA-USD"
REQUEST_PROCESSING_TIME = 5


Expand Down
12 changes: 6 additions & 6 deletions v4-client-py-v2/tests/test_batch_cancel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
60 changes: 33 additions & 27 deletions v4-client-py-v2/tests/test_mutating_node_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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"])
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand Down
9 changes: 4 additions & 5 deletions v4-client-py-v2/tests/test_revenue_share.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Loading