from dataclasses import dataclass
from datetime import datetime
from decimal import Decimal
import pandas
[docs]@dataclass
class WithdrawParams:
"""
Contains parameters for creating a withdrawal request
Args:
amount (Decimal): Token amount to withdraw. For USDC, the minimum amount is 2 USDC.
We currently only allow withdraw up to min(settled_usdc_balance, free_collateral).
nonce (int): timestamp in nanosecond that is larger than (request received time - 10 minutes)
"""
amount: Decimal
nonce: int
[docs]@dataclass
class PortfolioSummary:
margin_use: Decimal
account_leverage: Decimal
in_liquidation: bool
free_collateral: Decimal
total_account_value: Decimal
total_notional: Decimal
usdc_balance: Decimal
unsettled_usdc: Decimal
realized_pnl: Decimal
total_initial_margin: Decimal
total_maintenance_margin: Decimal
has_pending_withdrawal: bool
[docs] @staticmethod
def from_dict(data: dict) -> 'PortfolioSummary':
return PortfolioSummary(
margin_use=Decimal(data.get("margin_use", "0")),
account_leverage=Decimal(data.get("account_leverage", "0")),
free_collateral=Decimal(data.get("free_collateral", "0")),
total_account_value=Decimal(data.get("total_account_value", "0")),
total_notional=Decimal(data.get("total_notional", "0")),
usdc_balance=Decimal(data.get("usdc_balance", "0")),
unsettled_usdc=Decimal(data.get("unsettled_usdc", "0")),
realized_pnl=Decimal(data.get("realized_pnl", "0")),
total_initial_margin=Decimal(data.get("total_initial_margin", "0")),
total_maintenance_margin=Decimal(data.get("total_maintenance_margin", "0")),
has_pending_withdrawal=bool(data["has_pending_withdrawal"]) if "has_pending_withdrawal" in data else None,
in_liquidation=bool(data["in_liquidation"]) if "in_liquidation" in data else None,
)
[docs]@dataclass
class Position:
product_index: int
product_id: str
net_size: Decimal
avg_entry_price: Decimal
initial_margin_requirement: Decimal
maintenance_margin_requirement: Decimal
liquidation_price: Decimal
unrealized_pnl: Decimal
mark_price: Decimal
leverage: Decimal
unsettled_funding: Decimal
funding_index: Decimal
quote_balance: Decimal
[docs] @staticmethod
def from_dict(data: dict) -> 'Position':
return Position(
product_index=int(data["product_index"]) if "product_index" in data else None,
product_id=str(data["product_id"]) if "product_id" in data else None,
net_size=Decimal(data["net_size"]) if "net_size" in data else None,
avg_entry_price=Decimal(data["avg_entry_price"]) if "avg_entry_price" in data else None,
initial_margin_requirement=Decimal(data["initial_margin_requirement"]) if "initial_margin_requirement" in data else None,
maintenance_margin_requirement=Decimal(data["maintenance_margin_requirement"]) if "maintenance_margin_requirement" in data else None,
liquidation_price=Decimal(data["liquidation_price"]) if "liquidation_price" in data else None,
unrealized_pnl=Decimal(data["unrealized_pnl"]) if "unrealized_pnl" in data else None,
mark_price=Decimal(data["mark_price"]) if "mark_price" in data else None,
leverage=Decimal(data["leverage"]) if "leverage" in data else None,
unsettled_funding=Decimal(data["unsettled_funding"]) if "unsettled_funding" in data else None,
funding_index=Decimal(data["funding_index"]) if "funding_index" in data else None,
quote_balance=Decimal(data["quote_balance"]) if "quote_balance" in data else None,
)
[docs]@dataclass
class OrderStats:
total_orders: Decimal
total_done_orders: Decimal
total_open_orders: Decimal
total_pending_orders: Decimal
[docs] @staticmethod
def from_dict(data: dict) -> 'OrderStats':
return OrderStats(
total_orders=Decimal(data["total_orders"]) if "total_orders" in data else None,
total_done_orders=Decimal(data["total_done_orders"]) if "total_done_orders" in data else None,
total_open_orders=Decimal(data["total_open_orders"]) if "total_open_orders" in data else None,
total_pending_orders=Decimal(data["total_pending_orders"]) if "total_pending_orders" in data else None,
)
[docs]@dataclass
class ProductStats:
total_orders: Decimal
total_done_orders: Decimal
total_open_orders: Decimal
total_pending_orders: Decimal
[docs] @staticmethod
def from_dict(data: dict) -> 'ProductStats':
return ProductStats(
total_orders=Decimal(data["total_orders"]) if "total_orders" in data else None,
total_done_orders=Decimal(data["total_done_orders"]) if "total_done_orders" in data else None,
total_open_orders=Decimal(data["total_open_orders"]) if "total_open_orders" in data else None,
total_pending_orders=Decimal(data["total_pending_orders"]) if "total_pending_orders" in data else None,
)
[docs]@dataclass
class PortfolioProduct:
product_id: str
stat: ProductStats
[docs] @staticmethod
def from_dict(data: dict) -> 'PortfolioProduct':
return PortfolioProduct(
product_id=data.get("product_id"),
stat=ProductStats.from_dict(data.get('stat', {}))
)
[docs]@dataclass
class TradingStats:
total_trading_volume: Decimal
[docs] @staticmethod
def from_dict(data: dict) -> 'TradingStats':
return TradingStats(
total_trading_volume=Decimal(data['total_trading_volume']) if "total_trading_volume" in data else None
)
[docs]@dataclass
class PortfolioStats:
order_stats: OrderStats
products: list[PortfolioProduct]
trading_stats: TradingStats
total_deposit: Decimal
total_withdraw: Decimal
[docs] @staticmethod
def from_dict(data: dict) -> 'PortfolioStats':
return PortfolioStats(
order_stats=OrderStats.from_dict(data.get('order_stats', {})),
products=[PortfolioProduct.from_dict(i) for i in data.get('products', [])],
trading_stats=TradingStats.from_dict(data.get('trading_stats', {})),
total_deposit=Decimal(data["total_deposit"]) if "total_deposit" in data else None,
total_withdraw=Decimal(data["total_withdraw"]) if "total_withdraw" in data else None
)
[docs]@dataclass
class Portfolio:
account: str
summary: PortfolioSummary
positions: list[Position]
stats: PortfolioStats
[docs] @staticmethod
def from_dict(data: dict):
return Portfolio(
account=data["account"],
summary=PortfolioSummary.from_dict(data["summary"]) if "summary" in data else None,
positions=[Position.from_dict(i) for i in data.get("positions", [])],
stats=PortfolioStats.from_dict(data["stats"]) if "stats" in data else None
)
[docs]@dataclass
class APIKey:
api_key: str
api_secret: str
created_at: datetime
updated_at: datetime
name: str
sender: str
signer: str
[docs] @staticmethod
def from_dict(data: dict) -> "APIKey":
return APIKey(
api_key=data['api_key'] if 'api_key' in data else None,
api_secret=data['api_secret'] if 'api_secret' in data else None,
name=data['name'] if 'name' in data else None,
sender=data['sender'] if 'sender' in data else None,
signer=data['signer'] if 'signer' in data else None,
created_at=pandas.Timestamp(int(data['created_at'])) if 'created_at' in data else None,
updated_at=pandas.Timestamp(int(data['updated_at'])) if 'updated_at' in data else None,
)
[docs]@dataclass
class GetAPIKeysResponse:
api_keys: list[APIKey]
[docs] @staticmethod
def from_dict(data: dict) -> "GetAPIKeysResponse":
return GetAPIKeysResponse(
api_keys=[APIKey.from_dict(i) for i in data['api_keys']] if 'api_keys' in data else None,
)