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
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Optional, Any

import grpc
from typing import Any
Expand Down
167 changes: 167 additions & 0 deletions v4-client-py-v2/dydx_v4_client/node/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
QueryAllMarketPricesResponse,
QueryMarketPriceRequest,
)
from v4_proto.dydxprotocol.revshare.revshare_pb2 import OrderRouterRevShare
from v4_proto.dydxprotocol.rewards import query_pb2 as rewards_query
from v4_proto.dydxprotocol.rewards import query_pb2_grpc as rewards_query_grpc
from v4_proto.dydxprotocol.stats import query_pb2 as stats_query
Expand All @@ -99,6 +100,10 @@
from v4_proto.dydxprotocol.affiliates import query_pb2_grpc as affiliate_query_grpc
from v4_proto.dydxprotocol.revshare import query_pb2_grpc as revshare_query_grpc
from v4_proto.dydxprotocol.revshare import query_pb2 as revshare_query
from v4_proto.dydxprotocol.revshare import tx_pb2_grpc as revshare_tx_grpc
from v4_proto.dydxprotocol.revshare import tx_pb2 as revshare_tx_query
from v4_proto.dydxprotocol.revshare import params_pb2 as revshare_param
from v4_proto.dydxprotocol.revshare import revshare_pb2

from dydx_v4_client.network import NodeConfig
from dydx_v4_client.node.authenticators import Authenticator, validate_authenticator
Expand Down Expand Up @@ -641,6 +646,66 @@ async def get_affiliate_whitelist(
affiliate_query.AffiliateWhitelistRequest()
)

async def get_market_mapper_revenue_share_param(
self,
) -> revshare_query.QueryMarketMapperRevenueShareParamsResponse:
"""
Query revenue share params

Returns:
revshare_query.QueryMarketMapperRevenueShareParamsResponse: Market mapper revenue share parameters
"""
return revshare_query_grpc.QueryStub(
self.channel
).MarketMapperRevenueShareParams(
revshare_query.QueryMarketMapperRevenueShareParams()
)

async def get_market_mapper_revenue_share_details(
self, market_id: int
) -> revshare_query.QueryMarketMapperRevShareDetailsResponse:
"""
Query revenue share details by market id

Args:
market_id(int): Market id to query

Returns:
revshare_query.QueryMarketMapperRevShareDetailsResponse: Details of market mapper revenue share
"""
return revshare_query_grpc.QueryStub(self.channel).MarketMapperRevShareDetails(
revshare_query.QueryMarketMapperRevShareDetails(market_id=market_id)
)

async def get_unconditional_revenue_sharing_config(
self,
) -> revshare_query.QueryUnconditionalRevShareConfigResponse:
"""
Query configuration of unconditional revenue sharing

Returns:
revshare_query.QueryUnconditionalRevShareConfigResponse: The configuration of unconditional revenue sharing
"""
return revshare_query_grpc.QueryStub(self.channel).UnconditionalRevShareConfig(
revshare_query.QueryUnconditionalRevShareConfig()
)

async def get_order_router_revenue_share(
self, address: str
) -> revshare_query.QueryOrderRouterRevShareResponse:
"""
Query order router revenue share of certain address

Args:
address(str): Address to fetch order router revenue share of

Returns:
revshare_query.QueryOrderRouterRevShareResponse: Order router revenue share response
"""
return revshare_query_grpc.QueryStub(self.channel).OrderRouterRevShare(
revshare_query.QueryOrderRouterRevShare(address=address)
)


class SequenceManager:
def __init__(self, query_node_client: QueryNodeClient):
Expand Down Expand Up @@ -1313,3 +1378,105 @@ async def close_position(
good_til_block=current_height + GOOD_TIL_BLOCK_OFFSET,
)
return await self.place_order(wallet, new_order)

async def set_order_router_revenue_share(
self, authority: str, address: str, share_ppm: int
) -> revshare_tx_query.MsgSetOrderRouterRevShareResponse:
"""
Set order router revenue share

Args:
authority (str): Setter's authority
address (str): Address to receive revenue share
share_ppm (int): Parts per million of revenue share

Returns:
revshare_tx_query.MsgSetOrderRouterRevShareResponse: Set order router revenue share response
"""
return revshare_tx_grpc.MsgStub(self.channel).SetOrderRouterRevShare(
revshare_tx_query.MsgSetOrderRouterRevShare(
authority=authority,
order_router_rev_share=OrderRouterRevShare(
address=address, share_ppm=share_ppm
),
)
)

async def set_market_mapper_revenue_share(
self, authority: str, address: str, revenue_share_ppm: int, valid_days: int
) -> revshare_tx_query.MsgSetMarketMapperRevenueShareResponse:
"""
Set market mapper revenue share

Args:
authority (str): Setter's authority
address (str): Address to receive revenue share
revenue_share_ppm (int): Parts per million of revenue share
valid_days (int): Validity in days

Returns:
revshare_tx_query.MsgSetMarketMapperRevenueShareResponse: Market mapper revenue share response
"""
return revshare_tx_grpc.MsgStub(self.channel).SetMarketMapperRevenueShare(
revshare_tx_query.MsgSetMarketMapperRevenueShare(
authority=authority,
params=revshare_param.MarketMapperRevenueShareParams(
address=address,
revenue_share_ppm=revenue_share_ppm,
valid_days=valid_days,
),
),
)

async def set_market_mapper_revenue_share_details_for_market(
self, authority: str, market_id: int, expiration_ts: int
) -> revshare_tx_query.MsgSetMarketMapperRevShareDetailsForMarketResponse:
"""
Set market mapper revenue share details

Args:
authority (str): Setter's authority
market_id (int): Market id of the revenue share
expiration_ts (int): Expiration

Returns:
revshare_query.MsgSetMarketMapperRevShareDetailsForMarketResponse: Market mapper revenue share details response
"""
return revshare_tx_grpc.MsgStub(
self.channel
).SetMarketMapperRevShareDetailsForMarket(
revshare_tx_query.MsgSetMarketMapperRevShareDetailsForMarket(
authority=authority,
market_id=market_id,
params=revshare_pb2.MarketMapperRevShareDetails(
expiration_ts=expiration_ts
),
)
)

async def update_unconditional_revenue_share_config(
self, authority: str, address: str, share_ppm: int
) -> revshare_tx_query.MsgUpdateUnconditionalRevShareConfigResponse:
"""
Update unconditional revenue share config

Args:
authority (str): Setter's authority
address (str): Address to receive revenue share
share_ppm (int): Parts per million of share

Returns:
revshare_tx_query.MsgUpdateUnconditionalRevShareConfigResponse: Update unconditional revenue share config response
"""
return revshare_tx_grpc.MsgStub(self.channel).UpdateUnconditionalRevShareConfig(
revshare_tx_query.MsgUpdateUnconditionalRevShareConfig(
authority=authority,
config=revshare_pb2.UnconditionalRevShareConfig(
configs=[
revshare_pb2.UnconditionalRevShareConfig.RecipientConfig(
address=address, share_ppm=share_ppm
)
]
),
)
)
4 changes: 4 additions & 0 deletions v4-client-py-v2/dydx_v4_client/node/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
MsgAddAuthenticator,
MsgRemoveAuthenticator,
)

from v4_proto.dydxprotocol.revshare import tx_pb2 as revshare_tx_types
from v4_proto.dydxprotocol.revshare.revshare_pb2 import OrderRouterRevShare

import json
import base64

Expand Down
79 changes: 79 additions & 0 deletions v4-client-py-v2/examples/revenue_share_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import asyncio
import random
import time

from dydx_v4_client import MAX_CLIENT_ID, OrderFlags
from dydx_v4_client.indexer.rest.constants import OrderType
from dydx_v4_client.indexer.rest.indexer_client import IndexerClient
from dydx_v4_client.key_pair import KeyPair
from dydx_v4_client.network import TESTNET
from dydx_v4_client.node.client import NodeClient
from dydx_v4_client.node.market import Market
from dydx_v4_client.node.message import order_id
from dydx_v4_client.wallet import Wallet
from tests.conftest import TEST_ADDRESS_2, TEST_ADDRESS, DYDX_TEST_MNEMONIC
from v4_proto.dydxprotocol.clob.order_pb2 import Order


async def run_revenue_share_example():
node = await NodeClient.connect(TESTNET.node)
try:
indexer = IndexerClient(TESTNET.rest_indexer)
MARKET_ID = "ETH-USD"
market = Market(
(await indexer.markets.get_perpetual_markets(MARKET_ID))["markets"][
MARKET_ID
]
)
wallet = await Wallet.from_mnemonic(node, DYDX_TEST_MNEMONIC, TEST_ADDRESS)

order_id = market.order_id(
TEST_ADDRESS, 0, random.randint(0, MAX_CLIENT_ID), OrderFlags.SHORT_TERM
)

current_block = await node.latest_block_height()

new_order = market.order(
order_id=order_id,
order_type=OrderType.MARKET,
side=Order.Side.SIDE_SELL,
size=0.0001,
price=0, # Recommend set to oracle price - 5% or lower for SELL, oracle price + 5% for BUY
time_in_force=Order.TimeInForce.TIME_IN_FORCE_UNSPECIFIED,
reduce_only=False,
good_til_block=current_block + 10,
order_router_address=TEST_ADDRESS_2,
)

transaction = await node.place_order(
wallet=wallet,
order=new_order,
)

print(transaction)

await asyncio.sleep(5)

fills = await indexer.account.get_subaccount_fills(
address=TEST_ADDRESS, subaccount_number=0, limit=1
)

print(f"Fills: {fills}")

except Exception as e:
print(f"Error during placing order with order_router_address: {e}")

try:
response = await node.get_market_mapper_revenue_share_param()
print(response)
except Exception as e:
print(f"Error during fetching get_market_mapper_revenue_share_param: {e}")

try:
response = await node.get_order_router_revenue_share(TEST_ADDRESS_2)
print(response)
except Exception as e:
print(f"Error during fetching get_order_router_revenue_share: {e}")


asyncio.run(run_revenue_share_example())
7 changes: 5 additions & 2 deletions v4-client-py-v2/tests/test_mutating_node_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
from dydx_v4_client import MAX_CLIENT_ID, OrderFlags
from dydx_v4_client.node.market import Market
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
from v4_proto.dydxprotocol.clob.order_pb2 import BuilderCodeParameters, Order
from dydx_v4_client.indexer.rest.constants import OrderStatus, OrderType
from v4_proto.dydxprotocol.clob.order_pb2 import BuilderCodeParameters
from dydx_v4_client.indexer.rest.constants import OrderStatus


REQUEST_PROCESSING_TIME = 5

Expand Down
3 changes: 2 additions & 1 deletion v4-client-py-v2/tests/test_query_node_client.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import asyncio
import random
import time

import pytest

Expand Down Expand Up @@ -40,7 +42,6 @@
from v4_proto.dydxprotocol.subaccounts import query_pb2 as subaccount_query
from v4_proto.dydxprotocol.ratelimit import query_pb2 as rate_query
from v4_proto.dydxprotocol.affiliates import query_pb2 as affiliate_query
from v4_proto.dydxprotocol.revshare import query_pb2 as revshare_query
from tests.conftest import TEST_ADDRESS


Expand Down
Loading