Skip to content

Commit

Permalink
feat: Adding isolated margin to fuzzer (#588)
Browse files Browse the repository at this point in the history
* feat: Isolated Margin
  • Loading branch information
TomMcL authored Jan 9, 2024
1 parent 2c5573b commit ec25154
Show file tree
Hide file tree
Showing 11 changed files with 270 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VEGA_SIM_VEGA_TAG=307a4d1bbe35d2fafa54cc581deec5a2b4665193
VEGA_SIM_VEGA_TAG=194fc8ed397013eb73fa237a1a33148aa139aae7
VEGA_SIM_CONSOLE_TAG=develop
VEGA_DEFAULT_KEY_NAME='Key 1'
VEGA_SIM_NETWORKS_INTERNAL_TAG=main
Expand Down
2 changes: 1 addition & 1 deletion Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ pipeline {
disableConcurrentBuilds(abortPrevious: true)
}
parameters {
string( name: 'VEGA_VERSION', defaultValue: '307a4d1bbe35d2fafa54cc581deec5a2b4665193',
string( name: 'VEGA_VERSION', defaultValue: '194fc8ed397013eb73fa237a1a33148aa139aae7',
description: 'Git branch, tag or hash of the vegaprotocol/vega repository')
string( name: 'VEGACAPSULE_VERSION', defaultValue: 'main',
description: 'Git branch, tag or hash of the vegaprotocol/vegacapsule repository')
Expand Down
6 changes: 6 additions & 0 deletions examples/nullchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@
is_amendment=False,
)

vega.update_margin_mode(
key_name=MM_WALLET.name,
margin_mode="MODE_ISOLATED_MARGIN",
margin_factor=0.5,
market_id=market_id,
)
vega.submit_order(
trading_key=MM_WALLET.name,
market_id=market_id,
Expand Down
20 changes: 19 additions & 1 deletion vega_sim/api/trading.py
Original file line number Diff line number Diff line change
Expand Up @@ -803,4 +803,22 @@ def submit_stop_orders(
transaction_type="stop_orders_submission",
key_name=key_name,
)
logger.debug(f"Submitted stop orders.")
logger.debug("Submitted stop orders.")


def update_margin_mode(
wallet: Wallet,
key_name: str,
market_id: str,
margin_mode: Union[str, vega_protos.commands.v1.commands.UpdateMarginMode.Mode],
wallet_name: Optional[str] = None,
margin_factor: Optional[str] = None,
):
wallet.submit_transaction(
transaction=vega_protos.commands.v1.commands.UpdateMarginMode(
market_id=market_id, mode=margin_mode, margin_factor=margin_factor
),
wallet_name=wallet_name,
key_name=key_name,
transaction_type="update_margin_mode",
)
38 changes: 27 additions & 11 deletions vega_sim/proto/data_node/api/v2/trading_data_pb2.py

Large diffs are not rendered by default.

85 changes: 85 additions & 0 deletions vega_sim/proto/data_node/api/v2/trading_data_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -5383,3 +5383,88 @@ class IndividualGameEntity(_message.Message):
reward_earned: _Optional[str] = ...,
total_rewards_earned: _Optional[str] = ...,
) -> None: ...

class ListPartyMarginModesRequest(_message.Message):
__slots__ = ("market_id", "party_id", "pagination")
MARKET_ID_FIELD_NUMBER: _ClassVar[int]
PARTY_ID_FIELD_NUMBER: _ClassVar[int]
PAGINATION_FIELD_NUMBER: _ClassVar[int]
market_id: str
party_id: str
pagination: Pagination
def __init__(
self,
market_id: _Optional[str] = ...,
party_id: _Optional[str] = ...,
pagination: _Optional[_Union[Pagination, _Mapping]] = ...,
) -> None: ...

class ListPartyMarginModesResponse(_message.Message):
__slots__ = ("party_margin_modes",)
PARTY_MARGIN_MODES_FIELD_NUMBER: _ClassVar[int]
party_margin_modes: PartyMarginModesConnection
def __init__(
self,
party_margin_modes: _Optional[
_Union[PartyMarginModesConnection, _Mapping]
] = ...,
) -> None: ...

class PartyMarginModesConnection(_message.Message):
__slots__ = ("edges", "page_info")
EDGES_FIELD_NUMBER: _ClassVar[int]
PAGE_INFO_FIELD_NUMBER: _ClassVar[int]
edges: _containers.RepeatedCompositeFieldContainer[PartyMarginModeEdge]
page_info: PageInfo
def __init__(
self,
edges: _Optional[_Iterable[_Union[PartyMarginModeEdge, _Mapping]]] = ...,
page_info: _Optional[_Union[PageInfo, _Mapping]] = ...,
) -> None: ...

class PartyMarginModeEdge(_message.Message):
__slots__ = ("node", "cursor")
NODE_FIELD_NUMBER: _ClassVar[int]
CURSOR_FIELD_NUMBER: _ClassVar[int]
node: PartyMarginMode
cursor: str
def __init__(
self,
node: _Optional[_Union[PartyMarginMode, _Mapping]] = ...,
cursor: _Optional[str] = ...,
) -> None: ...

class PartyMarginMode(_message.Message):
__slots__ = (
"market_id",
"party_id",
"margin_mode",
"margin_factor",
"min_theoretical_margin_factor",
"max_theoretical_leverage",
"at_epoch",
)
MARKET_ID_FIELD_NUMBER: _ClassVar[int]
PARTY_ID_FIELD_NUMBER: _ClassVar[int]
MARGIN_MODE_FIELD_NUMBER: _ClassVar[int]
MARGIN_FACTOR_FIELD_NUMBER: _ClassVar[int]
MIN_THEORETICAL_MARGIN_FACTOR_FIELD_NUMBER: _ClassVar[int]
MAX_THEORETICAL_LEVERAGE_FIELD_NUMBER: _ClassVar[int]
AT_EPOCH_FIELD_NUMBER: _ClassVar[int]
market_id: str
party_id: str
margin_mode: _vega_pb2.MarginMode
margin_factor: str
min_theoretical_margin_factor: str
max_theoretical_leverage: str
at_epoch: int
def __init__(
self,
market_id: _Optional[str] = ...,
party_id: _Optional[str] = ...,
margin_mode: _Optional[_Union[_vega_pb2.MarginMode, str]] = ...,
margin_factor: _Optional[str] = ...,
min_theoretical_margin_factor: _Optional[str] = ...,
max_theoretical_leverage: _Optional[str] = ...,
at_epoch: _Optional[int] = ...,
) -> None: ...
48 changes: 48 additions & 0 deletions vega_sim/proto/data_node/api/v2/trading_data_pb2_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,11 @@ def __init__(self, channel):
request_serializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListGamesRequest.SerializeToString,
response_deserializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListGamesResponse.FromString,
)
self.ListPartyMarginModes = channel.unary_unary(
"/datanode.api.v2.TradingDataService/ListPartyMarginModes",
request_serializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListPartyMarginModesRequest.SerializeToString,
response_deserializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListPartyMarginModesResponse.FromString,
)
self.ExportNetworkHistory = channel.unary_stream(
"/datanode.api.v2.TradingDataService/ExportNetworkHistory",
request_serializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ExportNetworkHistoryRequest.SerializeToString,
Expand Down Expand Up @@ -1717,6 +1722,15 @@ def ListGames(self, request, context):
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")

def ListPartyMarginModes(self, request, context):
"""List margin modes per party per market
Get a list of all margin modes, or for a specific market ID, or party ID.
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")

def ExportNetworkHistory(self, request, context):
"""Export network history as CSV
Expand Down Expand Up @@ -2376,6 +2390,11 @@ def add_TradingDataServiceServicer_to_server(servicer, server):
request_deserializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListGamesRequest.FromString,
response_serializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListGamesResponse.SerializeToString,
),
"ListPartyMarginModes": grpc.unary_unary_rpc_method_handler(
servicer.ListPartyMarginModes,
request_deserializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListPartyMarginModesRequest.FromString,
response_serializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ListPartyMarginModesResponse.SerializeToString,
),
"ExportNetworkHistory": grpc.unary_stream_rpc_method_handler(
servicer.ExportNetworkHistory,
request_deserializer=data__node_dot_api_dot_v2_dot_trading__data__pb2.ExportNetworkHistoryRequest.FromString,
Expand Down Expand Up @@ -5761,6 +5780,35 @@ def ListGames(
metadata,
)

@staticmethod
def ListPartyMarginModes(
request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None,
):
return grpc.experimental.unary_unary(
request,
target,
"/datanode.api.v2.TradingDataService/ListPartyMarginModes",
data__node_dot_api_dot_v2_dot_trading__data__pb2.ListPartyMarginModesRequest.SerializeToString,
data__node_dot_api_dot_v2_dot_trading__data__pb2.ListPartyMarginModesResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
)

@staticmethod
def ExportNetworkHistory(
request,
Expand Down
16 changes: 9 additions & 7 deletions vega_sim/proto/vega/events/v1/events_pb2.py

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions vega_sim/proto/vega/events/v1/events_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class BusEventType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
BUS_EVENT_TYPE_VESTING_SUMMARY: _ClassVar[BusEventType]
BUS_EVENT_TYPE_TRANSFER_FEES_PAID: _ClassVar[BusEventType]
BUS_EVENT_TYPE_TRANSFER_FEES_DISCOUNT_UPDATED: _ClassVar[BusEventType]
BUS_EVENT_TYPE_PARTY_MARGIN_MODE_UPDATED: _ClassVar[BusEventType]
BUS_EVENT_TYPE_MARKET: _ClassVar[BusEventType]
BUS_EVENT_TYPE_TX_ERROR: _ClassVar[BusEventType]

Expand Down Expand Up @@ -208,6 +209,7 @@ BUS_EVENT_TYPE_PAID_LIQUIDITY_FEES_STATS_UPDATED: BusEventType
BUS_EVENT_TYPE_VESTING_SUMMARY: BusEventType
BUS_EVENT_TYPE_TRANSFER_FEES_PAID: BusEventType
BUS_EVENT_TYPE_TRANSFER_FEES_DISCOUNT_UPDATED: BusEventType
BUS_EVENT_TYPE_PARTY_MARGIN_MODE_UPDATED: BusEventType
BUS_EVENT_TYPE_MARKET: BusEventType
BUS_EVENT_TYPE_TX_ERROR: BusEventType

Expand Down Expand Up @@ -2250,6 +2252,41 @@ class PaidLiquidityFeesStats(_message.Message):
fees_paid_per_party: _Optional[_Iterable[_Union[PartyAmount, _Mapping]]] = ...,
) -> None: ...

class PartyMarginModeUpdated(_message.Message):
__slots__ = (
"market_id",
"party_id",
"margin_mode",
"margin_factor",
"min_theoretical_margin_factor",
"max_theoretical_leverage",
"at_epoch",
)
MARKET_ID_FIELD_NUMBER: _ClassVar[int]
PARTY_ID_FIELD_NUMBER: _ClassVar[int]
MARGIN_MODE_FIELD_NUMBER: _ClassVar[int]
MARGIN_FACTOR_FIELD_NUMBER: _ClassVar[int]
MIN_THEORETICAL_MARGIN_FACTOR_FIELD_NUMBER: _ClassVar[int]
MAX_THEORETICAL_LEVERAGE_FIELD_NUMBER: _ClassVar[int]
AT_EPOCH_FIELD_NUMBER: _ClassVar[int]
market_id: str
party_id: str
margin_mode: _vega_pb2.MarginMode
margin_factor: str
min_theoretical_margin_factor: str
max_theoretical_leverage: str
at_epoch: int
def __init__(
self,
market_id: _Optional[str] = ...,
party_id: _Optional[str] = ...,
margin_mode: _Optional[_Union[_vega_pb2.MarginMode, str]] = ...,
margin_factor: _Optional[str] = ...,
min_theoretical_margin_factor: _Optional[str] = ...,
max_theoretical_leverage: _Optional[str] = ...,
at_epoch: _Optional[int] = ...,
) -> None: ...

class BusEvent(_message.Message):
__slots__ = (
"id",
Expand Down Expand Up @@ -2336,6 +2373,7 @@ class BusEvent(_message.Message):
"vesting_balances_summary",
"transfer_fees",
"transfer_fees_discount",
"party_margin_mode_updated",
"market",
"tx_err_event",
"version",
Expand Down Expand Up @@ -2426,6 +2464,7 @@ class BusEvent(_message.Message):
VESTING_BALANCES_SUMMARY_FIELD_NUMBER: _ClassVar[int]
TRANSFER_FEES_FIELD_NUMBER: _ClassVar[int]
TRANSFER_FEES_DISCOUNT_FIELD_NUMBER: _ClassVar[int]
PARTY_MARGIN_MODE_UPDATED_FIELD_NUMBER: _ClassVar[int]
MARKET_FIELD_NUMBER: _ClassVar[int]
TX_ERR_EVENT_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
Expand Down Expand Up @@ -2515,6 +2554,7 @@ class BusEvent(_message.Message):
vesting_balances_summary: VestingBalancesSummary
transfer_fees: TransferFees
transfer_fees_discount: TransferFeesDiscount
party_margin_mode_updated: PartyMarginModeUpdated
market: MarketEvent
tx_err_event: TxErrorEvent
version: int
Expand Down Expand Up @@ -2646,6 +2686,9 @@ class BusEvent(_message.Message):
] = ...,
transfer_fees: _Optional[_Union[TransferFees, _Mapping]] = ...,
transfer_fees_discount: _Optional[_Union[TransferFeesDiscount, _Mapping]] = ...,
party_margin_mode_updated: _Optional[
_Union[PartyMarginModeUpdated, _Mapping]
] = ...,
market: _Optional[_Union[MarketEvent, _Mapping]] = ...,
tx_err_event: _Optional[_Union[TxErrorEvent, _Mapping]] = ...,
version: _Optional[int] = ...,
Expand Down
14 changes: 14 additions & 0 deletions vega_sim/scenario/fuzzed_markets/agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,19 @@ def step(self, vega_state):
cancellations=cancellations,
stop_orders_submission=stop_orders_submissions,
)
self.fuzz_isolated_margin_state()

def fuzz_isolated_margin_state(self):
if self.random_state.random() > 0.95:
self.vega.update_margin_mode(
key_name=self.key_name,
wallet_name=self.wallet_name,
market_id=self.market_id,
margin_mode=self.random_state.choice(
["MODE_CROSS_MARGIN", "MODE_ISOLATED_MARGIN"]
),
margin_factor=self.random_state.random(),
)

def create_fuzzed_cancellation(self, vega_state):
order_id = self._select_order_id()
Expand Down Expand Up @@ -328,6 +341,7 @@ def finalise(self):
import plotly.express as px

FuzzingAgent.OUTPUTTED = True

df = pd.DataFrame.from_dict(FuzzingAgent.MEMORY)
df = (
df.groupby(list(FuzzingAgent.MEMORY.keys()))
Expand Down
17 changes: 17 additions & 0 deletions vega_sim/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -3553,6 +3553,23 @@ def submit_proposal(

self.wait_for_thread_catchup()

def update_margin_mode(
self,
key_name: str,
market_id: str,
margin_mode: Union[str, vega_protos.commands.v1.commands.UpdateMarginMode.Mode],
wallet_name: Optional[str] = None,
margin_factor: Optional[float] = None,
):
trading.update_margin_mode(
wallet=self.wallet,
key_name=key_name,
market_id=market_id,
margin_mode=margin_mode,
wallet_name=wallet_name,
margin_factor=str(margin_factor),
)

def check_balances_equal_deposits(self):
for attempts in range(100):
asset_balance_map = defaultdict(lambda: 0)
Expand Down

0 comments on commit ec25154

Please sign in to comment.