diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 92cd9f20..acd2f7e4 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: python-versions: - - 3.10 + - 3.11 os: - ubuntu-24.04 runs-on: ubuntu-24.04 diff --git a/Makefile b/Makefile index ec11273a..fc3ea39c 100644 --- a/Makefile +++ b/Makefile @@ -47,11 +47,11 @@ tests: poetry run pytest tests -vv --reruns 3 --reruns-delay 3 fmt: - poetry run ruff format tests derive_client examples - poetry run ruff check tests derive_client examples --fix + poetry run ruff format tests derive_client examples scripts + poetry run ruff check tests derive_client examples scripts --fix lint: - poetry run ruff check tests derive_client examples + poetry run ruff check tests derive_client examples scripts all: fmt lint tests diff --git a/derive_client/_bridge/client.py b/derive_client/_bridge/client.py index b8f47cf9..02df12d9 100644 --- a/derive_client/_bridge/client.py +++ b/derive_client/_bridge/client.py @@ -683,7 +683,7 @@ async def _check_bridge_funds(self, token_data, connector: Address, amount: int) if token_data.isNewBridge: deposit_hook = await controller.functions.hook__().call() expected_hook = token_data.LyraTSAShareHandlerDepositHook - if not deposit_hook == token_data.LyraTSAShareHandlerDepositHook: + if deposit_hook != token_data.LyraTSAShareHandlerDepositHook: msg = f"Controller deposit hook {deposit_hook} does not match expected address {expected_hook}" raise ValueError(msg) deposit_contract = _load_deposit_contract(w3=self.derive_w3, token_data=token_data) diff --git a/derive_client/_bridge/w3.py b/derive_client/_bridge/w3.py index ab5e01d0..571e4e12 100644 --- a/derive_client/_bridge/w3.py +++ b/derive_client/_bridge/w3.py @@ -247,10 +247,7 @@ async def estimate_fees(w3, blocks: int = 20) -> FeeEstimates: for percentile in percentiles: rewards = percentile_rewards[percentile] non_zero_rewards = list(filter(lambda x: x, rewards)) - if non_zero_rewards: - estimated_priority_fee = int(statistics.median(non_zero_rewards)) - else: - estimated_priority_fee = MIN_PRIORITY_FEE + estimated_priority_fee = int(statistics.median(non_zero_rewards)) if non_zero_rewards else MIN_PRIORITY_FEE buffered_base_fee = int(latest_base_fee * GAS_FEE_BUFFER) estimated_max_fee = buffered_base_fee + estimated_priority_fee diff --git a/derive_client/analyser.py b/derive_client/analyser.py index f3e6495a..dee55e9e 100644 --- a/derive_client/analyser.py +++ b/derive_client/analyser.py @@ -54,3 +54,19 @@ def print_positions(self, underlying_currency: str, columns: Optional[List[str]] if columns: df = df[[c for c in columns if c not in DELTA_COLUMNS] + DELTA_COLUMNS] print(df) + + def calculate_greeks_of_option( + self, + underlying_price: float, + strike_price: float, + interest_rate: float, + days_to_expiration: int, + volatility: float, + ) -> dict: + """ + Calculate the greeks of each option position using the Black-Scholes model. + # BS([underlyingPrice, strikePrice, interestRate, daysToExpiration], volatility=x, callPrice=y, putPrice=z) + + # eg: + # c = mibian.BS([1.4565, 1.45, 1, 30], volatility=20) + """ diff --git a/derive_client/clients/base_client.py b/derive_client/clients/base_client.py index 57c296c8..2fa41d08 100644 --- a/derive_client/clients/base_client.py +++ b/derive_client/clients/base_client.py @@ -8,14 +8,15 @@ from decimal import Decimal from logging import Logger, LoggerAdapter from time import sleep +from typing import Any -import eth_abi import requests from derive_action_signing.module_data import ( DepositModuleData, MakerTransferPositionModuleData, MakerTransferPositionsModuleData, RecipientTransferERC20ModuleData, + RFQExecuteModuleData, RFQQuoteDetails, RFQQuoteModuleData, SenderTransferERC20ModuleData, @@ -61,7 +62,7 @@ ) from derive_client.endpoints import RestAPI from derive_client.exceptions import DeriveJSONRPCException -from derive_client.utils import get_logger, wait_until +from derive_client.utils import get_logger, rfq_max_fee, wait_until def _is_final_tx(res: DeriveTxResult) -> bool: @@ -197,9 +198,9 @@ def _internal_map_instrument(self, instrument_type, currency): def create_order( self, - price, amount: int, instrument_name: str, + price: float = None, reduce_only=False, instrument_type: InstrumentType = InstrumentType.PERP, side: OrderSide = OrderSide.BUY, @@ -228,13 +229,14 @@ def create_order( amount_step = instrument["amount_step"] rounded_amount = Decimal(str(amount)).quantize(Decimal(str(amount_step))) - price_step = instrument["tick_size"] - rounded_price = Decimal(str(price)).quantize(Decimal(str(price_step))) + if price is not None: + price_step = instrument["tick_size"] + rounded_price = Decimal(str(price)).quantize(Decimal(str(price_step))) module_data = { "asset_address": instrument["base_asset_address"], "sub_id": int(instrument["base_asset_sub_id"]), - "limit_price": Decimal(str(rounded_price)), + "limit_price": Decimal(str(rounded_price)) if price is not None else Decimal(0), "amount": Decimal(str(rounded_amount)), "max_fee": Decimal(1000), "recipient_id": int(self.subaccount_id), @@ -242,7 +244,8 @@ def create_order( } signed_action = self._generate_signed_action( - module_address=self.config.contracts.TRADE_MODULE, module_data=module_data + module_address=self.config.contracts.TRADE_MODULE, + module_data=module_data, ) order = { @@ -286,49 +289,6 @@ def submit_order(self, order): url = self.endpoints.private.order return self._send_request(url, json=order)["order"] - def _sign_quote(self, quote): - """ - Sign the quote - """ - rfq_module_data = self._encode_quote_data(quote) - return self._sign_quote_data(quote, rfq_module_data) - - def _encode_quote_data(self, quote, underlying_currency: UnderlyingCurrency = UnderlyingCurrency.ETH): - """ - Convert the quote to encoded data. - """ - instruments = self.fetch_instruments(instrument_type=InstrumentType.OPTION, currency=underlying_currency) - ledgs_to_subids = {i["instrument_name"]: i["base_asset_sub_id"] for i in instruments} - dir_sign = 1 if quote["direction"] == "buy" else -1 - quote["price"] = "10" - - def encode_leg(leg): - sub_id = ledgs_to_subids[leg["instrument_name"]] - leg_sign = 1 if leg["direction"] == "buy" else -1 - signed_amount = self.web3_client.to_wei(leg["amount"], "ether") * leg_sign * dir_sign - return [ - self.config.contracts[f"{underlying_currency.name}_OPTION"], - sub_id, - self.web3_client.to_wei(quote["price"], "ether"), - signed_amount, - ] - - self.logger.info(f"Quote: {quote}") - encoded_legs = [encode_leg(leg) for leg in quote["legs"]] - rfq_data = [self.web3_client.to_wei(quote["max_fee"], "ether"), encoded_legs] - - encoded_data = eth_abi.encode( - # ['uint256(address,uint256,uint256,int256)[]'], - [ - "uint256", - "address", - "uint256", - "int256", - ], - [rfq_data], - ) - return self.web3_client.keccak(encoded_data) - def fetch_ticker(self, instrument_name): """ Fetch the ticker for a given instrument name. @@ -407,11 +367,10 @@ def cancel_all(self): return self._send_request(url, json=payload) def _check_output_for_rate_limit(self, message): - if error := message.get("error"): - if "Rate limit exceeded" in error["message"]: - sleep((int(error["data"].split(" ")[-2]) / 1000)) - self.logger.info("Rate limit exceeded, sleeping and retrying request") - return True + if (error := message.get("error")) and "Rate limit exceeded" in error["message"]: + sleep((int(error["data"].split(" ")[-2]) / 1000)) + self.logger.info("Rate limit exceeded, sleeping and retrying request") + return True return False def get_positions(self): @@ -587,9 +546,13 @@ def set_mmp_config( def send_rfq(self, rfq): """Send an RFQ.""" url = self.endpoints.private.send_rfq - return self._send_request(url, rfq) + payload = { + **rfq, + "subaccount_id": self.subaccount_id, + } + return self._send_request(url, payload) - def poll_rfqs(self): + def poll_rfqs(self, rfq_status: RfqStatus | None = None): """ Poll RFQs. type RfqResponse = { @@ -606,8 +569,9 @@ def poll_rfqs(self): url = self.endpoints.private.poll_rfqs params = { "subaccount_id": self.subaccount_id, - "status": RfqStatus.OPEN.value, } + if rfq_status: + params["status"] = rfq_status.value return self._send_request( url, json=params, @@ -623,10 +587,14 @@ def create_quote( rfq_id, legs, direction, + max_fee=None, ): """Create a quote object.""" _, nonce, expiration = self.get_nonce_and_signature_expiry() + if max_fee is None: + max_fee = rfq_max_fee(client=self, legs=legs, is_taker=True) + rfq_legs: list[RFQQuoteDetails] = [] for leg in legs: ticker = self.fetch_ticker(instrument_name=leg["instrument_name"]) @@ -635,7 +603,7 @@ def create_quote( direction=leg["direction"], asset_address=ticker["base_asset_address"], sub_id=int(ticker["base_asset_sub_id"]), - price=leg["price"], + price=Decimal(leg["price"]), amount=Decimal(leg["amount"]), ) rfq_legs.append(rfq_quote_details) @@ -649,7 +617,7 @@ def create_quote( module_address=self.config.contracts.RFQ_MODULE, module_data=RFQQuoteModuleData( global_direction=direction, - max_fee=Decimal("123"), + max_fee=Decimal(max_fee), legs=rfq_legs, ), DOMAIN_SEPARATOR=self.config.DOMAIN_SEPARATOR, @@ -667,6 +635,59 @@ def create_quote( return self.send_quote(quote=payload) + def poll_quotes(self, **kwargs): + url = self.endpoints.private.poll_quotes + payload = { + "subaccount_id": self.subaccount_id, + **kwargs, + } + return self._send_request(url, json=payload) + + def execute_quote(self, quote): + + _, nonce, expiration = self.get_nonce_and_signature_expiry() + + quote_legs: list[RFQQuoteDetails] = [] + for leg in quote["legs"]: + ticker = self.fetch_ticker(instrument_name=leg["instrument_name"]) + rfq_quote_details = RFQQuoteDetails( + instrument_name=ticker["instrument_name"], + direction=leg["direction"], + asset_address=ticker["base_asset_address"], + sub_id=int(ticker["base_asset_sub_id"]), + price=Decimal(leg["price"]), + amount=Decimal(leg["amount"]), + ) + quote_legs.append(rfq_quote_details) + + direction = "buy" if quote["direction"] == "sell" else "sell" + module_data = RFQExecuteModuleData( + global_direction=direction, + max_fee=Decimal("0"), + legs=quote_legs, + ) + + action = SignedAction( + subaccount_id=self.subaccount_id, + owner=self.wallet, + signer=self.signer.address, + signature_expiry_sec=MAX_INT_32, + nonce=nonce, + module_address=self.config.contracts.RFQ_MODULE, + module_data=request, + DOMAIN_SEPARATOR=self.config.DOMAIN_SEPARATOR, + ACTION_TYPEHASH=self.config.ACTION_TYPEHASH, + ) + action.sign(self.signer.key) + payload = { + **action.to_json(), + "label": "", + "rfq_id": rfq_id, + "quote_id": quote_id, + } + url = self.endpoints.private.execute_quote + return self._send_request(url, json=payload) + def cancel_rfq(self, rfq_id: str): """Cancel an RFQ.""" url = self.endpoints.private.cancel_rfq @@ -701,10 +722,11 @@ def poll_quotes(self, rfq_id: str = None, quote_id: str = None, status: RfqStatu payload["quote_id"] = quote_id if status: payload["status"] = status.value + return self._send_request(url, json=payload) def _send_request(self, url, json=None, params=None, headers=None): - headers = self._create_signature_headers() if not headers else headers + headers = headers if headers else self._create_signature_headers() response = requests.post(url, json=json, headers=headers, params=params) response.raise_for_status() json_data = response.json() diff --git a/derive_client/clients/ws_client.py b/derive_client/clients/ws_client.py index d0bdd560..b03efd56 100644 --- a/derive_client/clients/ws_client.py +++ b/derive_client/clients/ws_client.py @@ -4,32 +4,194 @@ import json import time +import uuid +from dataclasses import dataclass +from decimal import Decimal +from enum import StrEnum +import msgspec from derive_action_signing.utils import sign_ws_login, utc_now_ms -from websocket import WebSocketConnectionClosedException, create_connection +from websockets import State +from websockets.sync.client import ClientConnection, connect +from derive_client.constants import DEFAULT_REFERER +from derive_client.data.generated.models import ( + Direction, + OrderResponseSchema, + PrivateGetOrdersResultSchema, + PrivateOrderParamsSchema, + PublicGetTickerResultSchema, + TradeResponseSchema, +) from derive_client.data_types import InstrumentType, UnderlyingCurrency +from derive_client.data_types.enums import OrderSide, OrderType, TimeInForce from derive_client.exceptions import DeriveJSONRPCException from .base_client import BaseClient +@dataclass +class Orderbook: + channel: str + timestamp: int + instrument_name: str + publish_id: int + bids: list[list[float]] + asks: list[list[float]] + + @classmethod + def from_json(cls, data): + return cls( + channel=data["params"]["channel"], + timestamp=data["params"]["data"]["timestamp"], + instrument_name=data["params"]["data"]["instrument_name"], + publish_id=data["params"]["data"]["publish_id"], + bids=[[float(price), float(size)] for price, size in data["params"]["data"]["bids"]], + asks=[[float(price), float(size)] for price, size in data["params"]["data"]["asks"]], + ) + + +@dataclass +class Position: + """ + {'instrument_type': 'perp', 'instrument_name': 'ETH-PERP', 'amount': '0', 'average_price': '0', 'realized_pnl': '0', + 'unrealized_pnl': '0', 'total_fees': '0', 'average_price_excl_fees': '0', 'realized_pnl_excl_fees': '0', 'unrealized_pnl_excl_fees': '0', + 'net_settlements': '0', 'cumulative_funding': '0', 'pending_funding': '0', 'mark_price': '4153.1395224770267304847948253154754638671875', + 'index_price': '4156.522924638571', 'delta': '1', 'gamma': '0', 'vega': '0', 'theta': '0', 'mark_value': '0', 'maintenance_margin': '0', + 'initial_margin': '0', 'open_orders_margin': '-81.7268423838896751476568169891834259033203125', 'leverage': None, 'liquidation_price': None, + 'creation_timestamp': 0, 'amount_step': '0'} + """ + + instrument_type: str | None = None + instrument_name: str | None = None + amount: float | None = None + average_price: float | None = None + realized_pnl: float | None = None + unrealized_pnl: float | None = None + total_fees: float | None = None + average_price_excl_fees: float | None = None + realized_pnl_excl_fees: float | None = None + unrealized_pnl_excl_fees: float | None = None + net_settlements: float | None = None + cumulative_funding: float | None = None + pending_funding: float | None = None + mark_price: float | None = None + index_price: float | None = None + delta: float | None = None + gamma: float | None = None + vega: float | None = None + theta: float | None = None + mark_value: float | None = None + maintenance_margin: float | None = None + initial_margin: float | None = None + open_orders_margin: float | None = None + leverage: float | None = None + liquidation_price: float | None = None + creation_timestamp: int | None = None + amount_step: float | None = None + + @classmethod + def from_json(cls, data): + return cls( + instrument_type=data.get("instrument_type"), + instrument_name=data.get("instrument_name"), + amount=float(data.get("amount", 0)) if data.get("amount") is not None else None, + average_price=float(data.get("average_price", 0)) if data.get("average_price") is not None else None, + realized_pnl=float(data.get("realized_pnl", 0)) if data.get("realized_pnl") is not None else None, + unrealized_pnl=float(data.get("unrealized_pnl", 0)) if data.get("unrealized_pnl") is not None else None, + total_fees=float(data.get("total_fees", 0)) if data.get("total_fees") is not None else None, + average_price_excl_fees=float(data.get("average_price_excl_fees", 0)) + if data.get("average_price_excl_fees") is not None + else None, + realized_pnl_excl_fees=float(data.get("realized_pnl_excl_fees", 0)) + if data.get("realized_pnl_excl_fees") is not None + else None, + unrealized_pnl_excl_fees=float(data.get("unrealized_pnl_excl_fees", 0)) + if data.get("unrealized_pnl_excl_fees") is not None + else None, + net_settlements=float(data.get("net_settlements", 0)) if data.get("net_settlements") is not None else None, + cumulative_funding=float(data.get("cumulative_funding", 0)) + if data.get("cumulative_funding") is not None + else None, + pending_funding=float(data.get("pending_funding", 0)) if data.get("pending_funding") is not None else None, + mark_price=float(data.get("mark_price", 0)) if data.get("mark_price") is not None else None, + index_price=float(data.get("index_price", 0)) if data.get("index_price") is not None else None, + delta=float(data.get("delta", 0)) if data.get("delta") is not None else None, + gamma=float(data.get("gamma", 0)) if data.get("gamma") is not None else None, + vega=float(data.get("vega", 0)) if data.get("vega") is not None else None, + theta=float(data.get("theta", 0)) if data.get("theta") is not None else None, + mark_value=float(data.get("mark_value", 0)) if data.get("mark_value") is not None else None, + maintenance_margin=float(data.get("maintenance_margin", 0)) + if data.get("maintenance_margin") is not None + else None, + initial_margin=float(data.get("initial_margin", 0)) if data.get("initial_margin") is not None else None, + open_orders_margin=float(data.get("open_orders_margin", 0)) + if data.get("open_orders_margin") is not None + else None, + leverage=float(data.get("leverage")) if data.get("leverage") is not None else None, + liquidation_price=float(data.get("liquidation_price")) + if data.get("liquidation_price") is not None + else None, + creation_timestamp=int(data.get("creation_timestamp", 0)) + if data.get("creation_timestamp") is not None + else None, + amount_step=float(data.get("amount_step", 0)) if data.get("amount_step") is not None else None, + ) + + +@dataclass +class Positions: + positions: list[Position] + subaccount_id: str + + @classmethod + def from_json(cls, data): + return cls( + positions=[Position.from_json(pos) for pos in data], + subaccount_id=data["subaccount_id"], + ) + + +class Depth(StrEnum): + DEPTH_1 = "1" + DEPTH_10 = "10" + DEPTH_20 = "20" + DEPTH_100 = "100" + + +class Group(StrEnum): + GROUP_1 = "1" + GROUP_10 = "10" + GROUP_100 = "100" + + +class Interval(StrEnum): + ONE_HUNDRED_MS = "100" + ONE_SECOND = "1000" + + class WsClient(BaseClient): """Websocket client class.""" + _ws: ClientConnection | None = None + subsriptions: dict = {} + requests_in_flight: dict = {} + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.login_client() def connect_ws(self): - return create_connection(self.config.ws_address, enable_multithread=True, timeout=60) + return connect( + self.config.ws_address, + ) @property - async def ws(self): + def ws(self): if self._ws is None: - self._ws = await self.connect_ws() - if not self._ws.connected: - self._ws = await self.connect_ws() + self._ws = self.connect_ws() + if self._ws.state is not State.OPEN: + self._ws = self.connect_ws() return self._ws def login_client( @@ -56,87 +218,223 @@ def login_client( return self.login_client() raise DeriveJSONRPCException(**message["error"]) break - except (WebSocketConnectionClosedException, Exception) as error: + except Exception as error: if retries: time.sleep(1) self.login_client(retries=retries - 1) raise error - def submit_order(self, order): - id = str(utc_now_ms()) - self.ws.send(json.dumps({"method": "private/order", "params": order, "id": id})) - while True: - message = json.loads(self.ws.recv()) - if message["id"] == id: - try: - if "result" not in message: - if self._check_output_for_rate_limit(message): - return self.submit_order(order) - raise DeriveJSONRPCException(**message["error"]) - return message["result"]["order"] - except KeyError as error: - raise Exception(f"Unable to submit order {message}") from error + def create_order( + self, + amount: int, + instrument_name: str, + price: float = None, + reduce_only=False, + instrument_type: InstrumentType = InstrumentType.PERP, + side: OrderSide = OrderSide.BUY, + order_type: OrderType = OrderType.LIMIT, + time_in_force: TimeInForce = TimeInForce.GTC, + instruments=None, # temporary hack to allow async fetching of instruments + ) -> OrderResponseSchema: + """ + Create the order. + """ + if side.name.upper() not in OrderSide.__members__: + raise Exception(f"Invalid side {side}") + + if not instruments: + _currency = UnderlyingCurrency[instrument_name.split("-")[0]] + if instrument_type in [ + InstrumentType.PERP, + InstrumentType.ERC20, + InstrumentType.OPTION, + ]: + instruments = self._internal_map_instrument(instrument_type, _currency) + else: + raise Exception(f"Invalid instrument type {instrument_type}") + + instrument = instruments[instrument_name] + amount_step = instrument["amount_step"] + rounded_amount = Decimal(str(amount)).quantize(Decimal(str(amount_step))) + + if price is not None: + price_step = instrument["tick_size"] + rounded_price = Decimal(str(price)).quantize(Decimal(str(price_step))) + + module_data = { + "asset_address": instrument["base_asset_address"], + "sub_id": int(instrument["base_asset_sub_id"]), + "limit_price": Decimal(str(rounded_price)) if price is not None else Decimal(0), + "amount": Decimal(str(rounded_amount)), + "max_fee": Decimal(1000), + "recipient_id": int(self.subaccount_id), + "is_bid": side == Direction.buy, + } + + signed_action = self._generate_signed_action( + module_address=self.config.contracts.TRADE_MODULE, module_data=module_data + ) + + order = { + "instrument_name": instrument_name, + "direction": side.name.lower(), + "order_type": order_type.name.lower(), + "mmp": False, + "time_in_force": time_in_force.value, + "referral_code": DEFAULT_REFERER, + **signed_action.to_json(), + } + _id = str(uuid.uuid4()) + self.ws.send(json.dumps({"method": "private/order", "params": order, "id": _id})) + self.requests_in_flight[_id] = self._parse_order_message + return PrivateOrderParamsSchema(**order) + + def subscribe_orderbook(self, instrument_name, group: Group = Group.GROUP_1, depth: Depth = Depth.DEPTH_1): + """ + Subscribe to an orderbook feed. + """ + msg = f"orderbook.{instrument_name}.{group}.{depth}" + self.ws.send(json.dumps({"method": "subscribe", "params": {"channels": [msg]}, "id": str(utc_now_ms())})) + self.subsriptions[msg] = self._parse_orderbook_message + + def subscribe_trades(self): + """ + Subscribe to trades feed. + """ + msg = f"{self.subaccount_id}.trades" + self.ws.send(json.dumps({"method": "subscribe", "params": {"channels": [msg]}, "id": str(utc_now_ms())})) + self.subsriptions[msg] = self._parse_trades_message + + def subscribe_orders(self): + """ + Subscribe to orders feed. + """ + msg = f"{self.subaccount_id}.orders" + self.ws.send(json.dumps({"method": "subscribe", "params": {"channels": [msg]}, "id": str(utc_now_ms())})) + self.subsriptions[msg] = self._parse_orders_stream + + def subscribe_ticker(self, instrument_name, interval: Interval = Interval.ONE_HUNDRED_MS): + """ + Subscribe to a ticker feed. + """ + msg = f"ticker.{instrument_name}.{interval}" + self.ws.send(json.dumps({"method": "subscribe", "params": {"channels": [msg]}, "id": str(utc_now_ms())})) + self.subsriptions[msg] = self._parse_ticker_stream + + def _parse_ticker_stream(self, json_message): + """ + Parse a ticker message. + """ + return PublicGetTickerResultSchema(**json_message["params"]["data"]) + + def _parse_orderbook_message(self, json_message): + """ + Parse an orderbook message. + """ + return Orderbook.from_json(json_message) + + def _parse_trades_message(self, json_message): + """ + Parse a trades message. + """ + return TradeResponseSchema.from_json(json_message["params"]["data"]) + + def _parse_order_message(self, json_message): + """ + Parse an orders message. + """ + result = json_message.get("result", None) + if result is None: + raise Exception(f"Invalid order message {json_message}") + if "order" not in result: + return msgspec.convert(json_message["result"], OrderResponseSchema) + return msgspec.convert(json_message["result"]["order"], OrderResponseSchema) + + def _parse_orders_stream(self, json_message): + """ + Parse an orders message. + """ + return msgspec.convert( + {"subaccount_id": self.subaccount_id, "orders": json_message['params']['data']}, + PrivateGetOrdersResultSchema, + ) + + def _parse_orders_message(self, json_message): + """ + Parse an orders message. + """ + return msgspec.convert(json_message['result'], PrivateGetOrdersResultSchema) + + def get_positions(self): + """ + Get positions + """ + id = str(uuid.uuid4()) + payload = {"subaccount_id": self.subaccount_id} + self.ws.send(json.dumps({"method": "private/get_positions", "params": payload, "id": id})) + self.requests_in_flight[id] = self._parse_positions_response + + def get_orders(self): + """ + Get orders + """ + id = str(uuid.uuid4()) + payload = {"subaccount_id": self.subaccount_id} + self.ws.send(json.dumps({"method": "private/get_open_orders", "params": payload, "id": id})) + self.requests_in_flight[id] = self._parse_orders_message + + def _parse_positions_response(self, json_message): + """ + Parse a positions response message. + """ + return Positions( + [Position.from_json(pos) for pos in json_message["result"]["positions"]], + subaccount_id=json_message["result"]["subaccount_id"], + ) + + def parse_message(self, raw_message): + """ + find the parser based on the message type. + """ + json_message = json.loads(raw_message) + if "method" in json_message and json_message["method"] == "subscription": + channel = json_message["params"]["channel"] + if channel in self.subsriptions: + return self.subsriptions[channel](json_message) + raise Exception(f"Unknown channel {channel}") + if "id" in json_message and json_message["id"] in self.requests_in_flight: + parser = self.requests_in_flight.pop(json_message["id"]) + return parser(json_message) + return json_message def cancel(self, order_id, instrument_name): """ Cancel an order """ - id = str(utc_now_ms()) + id = str(uuid.uuid4()) payload = { "order_id": order_id, "subaccount_id": self.subaccount_id, "instrument_name": instrument_name, } self.ws.send(json.dumps({"method": "private/cancel", "params": payload, "id": id})) - while True: - message = json.loads(self.ws.recv()) - if message["id"] == id: - return message["result"] + self.requests_in_flight[id] = self._parse_order_cancel_message + + def _parse_order_cancel_message(self, json_message): + """ + Parse an order cancel message. + """ + error = json_message.get("error", None) + if error and error.get("code") in [11006, -32603]: + return + result = json_message.get("result", None) + return OrderResponseSchema(**result) def cancel_all(self): """ Cancel all orders """ - id = str(utc_now_ms()) + id = str(uuid.uuid4()) payload = {"subaccount_id": self.subaccount_id} - self.login_client() self.ws.send(json.dumps({"method": "private/cancel_all", "params": payload, "id": id})) - while True: - message = json.loads(self.ws.recv()) - if message["id"] == id: - if "result" not in message: - if self._check_output_for_rate_limit(message): - return self.cancel_all() - raise DeriveJSONRPCException(**message["error"]) - return message["result"] - - def fetch_tickers( - self, - instrument_type: InstrumentType = InstrumentType.OPTION, - currency: UnderlyingCurrency = UnderlyingCurrency.BTC, - ): - """ - Fetch tickers using the ws connection - """ - instruments = self.fetch_instruments(instrument_type=instrument_type, currency=currency) - instrument_names = [i["instrument_name"] for i in instruments] - id_base = str(utc_now_ms()) - ids_to_instrument_names = { - f"{id_base}_{enumerate}": instrument_name for enumerate, instrument_name in enumerate(instrument_names) - } - for id, instrument_name in ids_to_instrument_names.items(): - payload = {"instrument_name": instrument_name} - self.ws.send(json.dumps({"method": "public/get_ticker", "params": payload, "id": id})) - time.sleep(0.05) # otherwise we get rate limited... - results = {} - while ids_to_instrument_names: - message = json.loads(self.ws.recv()) - if message["id"] in ids_to_instrument_names: - if "result" not in message: - if self._check_output_for_rate_limit(message): - return self.fetch_tickers(instrument_type=instrument_type, currency=currency) - raise DeriveJSONRPCException(**message["error"]) - results[message["result"]["instrument_name"]] = message["result"] - del ids_to_instrument_names[message["id"]] - return results diff --git a/derive_client/data/generated/models.py b/derive_client/data/generated/models.py index adbe5672..97ad449a 100644 --- a/derive_client/data/generated/models.py +++ b/derive_client/data/generated/models.py @@ -1,38 +1,35 @@ # ruff: noqa: E741 - from __future__ import annotations -from dataclasses import dataclass from decimal import Decimal from enum import Enum from typing import Any, Dict, List, Optional, Union +from msgspec import Struct + -@dataclass -class PublicGetVaultStatisticsParamsSchema: +class PublicGetVaultStatisticsParamsSchema(Struct): pass -@dataclass -class VaultStatisticsResponseSchema: +class VaultStatisticsResponseSchema(Struct): base_value: Decimal block_number: int block_timestamp: int - subaccount_value_at_last_trade: Optional[Decimal] total_supply: Decimal - underlying_value: Optional[Decimal] usd_tvl: Decimal usd_value: Decimal vault_name: str + subaccount_value_at_last_trade: Optional[Decimal] = None + underlying_value: Optional[Decimal] = None class Direction(str, Enum): - buy = "buy" - sell = "sell" + buy = 'buy' + sell = 'sell' -@dataclass -class LegPricedSchema: +class LegPricedSchema(Struct): amount: Decimal direction: Direction instrument_name: str @@ -40,41 +37,40 @@ class LegPricedSchema: class CancelReason(str, Enum): - field_ = "" - user_request = "user_request" - insufficient_margin = "insufficient_margin" - signed_max_fee_too_low = "signed_max_fee_too_low" - mmp_trigger = "mmp_trigger" - cancel_on_disconnect = "cancel_on_disconnect" - session_key_deregistered = "session_key_deregistered" - subaccount_withdrawn = "subaccount_withdrawn" - rfq_no_longer_open = "rfq_no_longer_open" - compliance = "compliance" + field_ = '' + user_request = 'user_request' + insufficient_margin = 'insufficient_margin' + signed_max_fee_too_low = 'signed_max_fee_too_low' + mmp_trigger = 'mmp_trigger' + cancel_on_disconnect = 'cancel_on_disconnect' + session_key_deregistered = 'session_key_deregistered' + subaccount_withdrawn = 'subaccount_withdrawn' + rfq_no_longer_open = 'rfq_no_longer_open' + compliance = 'compliance' class LiquidityRole(str, Enum): - maker = "maker" - taker = "taker" + maker = 'maker' + taker = 'taker' class Status(str, Enum): - open = "open" - filled = "filled" - cancelled = "cancelled" - expired = "expired" + open = 'open' + filled = 'filled' + cancelled = 'cancelled' + expired = 'expired' class TxStatus(str, Enum): - requested = "requested" - pending = "pending" - settled = "settled" - reverted = "reverted" - ignored = "ignored" - timed_out = "timed_out" + requested = 'requested' + pending = 'pending' + settled = 'settled' + reverted = 'reverted' + ignored = 'ignored' + timed_out = 'timed_out' -@dataclass -class QuoteResultSchema: +class QuoteResultSchema(Struct): cancel_reason: CancelReason creation_timestamp: int direction: Direction @@ -96,40 +92,35 @@ class QuoteResultSchema: signer: str status: Status subaccount_id: int - tx_hash: Optional[str] - tx_status: Optional[TxStatus] + tx_hash: Optional[str] = None + tx_status: Optional[TxStatus] = None -@dataclass -class PrivateResetMmpParamsSchema: +class PrivateResetMmpParamsSchema(Struct): subaccount_id: int currency: Optional[str] = None class Result(str, Enum): - ok = "ok" + ok = 'ok' -@dataclass -class PrivateResetMmpResponseSchema: +class PrivateResetMmpResponseSchema(Struct): id: Union[str, int] result: Result -@dataclass -class PublicGetOptionSettlementPricesParamsSchema: +class PublicGetOptionSettlementPricesParamsSchema(Struct): currency: str -@dataclass -class ExpiryResponseSchema: +class ExpiryResponseSchema(Struct): expiry_date: str - price: Optional[Decimal] utc_expiry_sec: int + price: Optional[Decimal] = None -@dataclass -class TradeModuleParamsSchema: +class TradeModuleParamsSchema(Struct): amount: Decimal direction: Direction instrument_name: str @@ -143,52 +134,51 @@ class TradeModuleParamsSchema: class CancelReason1(str, Enum): - field_ = "" - user_request = "user_request" - mmp_trigger = "mmp_trigger" - insufficient_margin = "insufficient_margin" - signed_max_fee_too_low = "signed_max_fee_too_low" - cancel_on_disconnect = "cancel_on_disconnect" - ioc_or_market_partial_fill = "ioc_or_market_partial_fill" - session_key_deregistered = "session_key_deregistered" - subaccount_withdrawn = "subaccount_withdrawn" - compliance = "compliance" - trigger_failed = "trigger_failed" - validation_failed = "validation_failed" + field_ = '' + user_request = 'user_request' + mmp_trigger = 'mmp_trigger' + insufficient_margin = 'insufficient_margin' + signed_max_fee_too_low = 'signed_max_fee_too_low' + cancel_on_disconnect = 'cancel_on_disconnect' + ioc_or_market_partial_fill = 'ioc_or_market_partial_fill' + session_key_deregistered = 'session_key_deregistered' + subaccount_withdrawn = 'subaccount_withdrawn' + compliance = 'compliance' + trigger_failed = 'trigger_failed' + validation_failed = 'validation_failed' class OrderStatus(str, Enum): - open = "open" - filled = "filled" - cancelled = "cancelled" - expired = "expired" - untriggered = "untriggered" + open = 'open' + filled = 'filled' + cancelled = 'cancelled' + expired = 'expired' + untriggered = 'untriggered' class OrderType(str, Enum): - limit = "limit" - market = "market" + limit = 'limit' + market = 'market' class TimeInForce(str, Enum): - gtc = "gtc" - post_only = "post_only" - fok = "fok" - ioc = "ioc" + gtc = 'gtc' + post_only = 'post_only' + fok = 'fok' + ioc = 'ioc' class TriggerPriceType(str, Enum): - mark = "mark" - index = "index" + mark = 'mark' + index = 'index' class TriggerType(str, Enum): - stoploss = "stoploss" - takeprofit = "takeprofit" + stoploss = 'stoploss' + takeprofit = 'takeprofit' -@dataclass -class OrderResponseSchema: +class OrderResponseSchema(Struct): amount: Decimal average_price: Decimal cancel_reason: CancelReason1 @@ -207,12 +197,12 @@ class OrderResponseSchema: order_id: str order_status: OrderStatus order_type: OrderType - quote_id: Optional[str] signature: str signature_expiry_sec: int signer: str subaccount_id: int time_in_force: TimeInForce + quote_id: Optional[str] = None replaced_order_id: Optional[str] = None trigger_price: Optional[Decimal] = None trigger_price_type: Optional[TriggerPriceType] = None @@ -220,8 +210,7 @@ class OrderResponseSchema: trigger_type: Optional[TriggerType] = None -@dataclass -class TradeResponseSchema: +class TradeResponseSchema(Struct): direction: Direction expected_rebate: Decimal index_price: Decimal @@ -231,7 +220,6 @@ class TradeResponseSchema: liquidity_role: LiquidityRole mark_price: Decimal order_id: str - quote_id: Optional[str] realized_pnl: Decimal realized_pnl_excl_fees: Decimal subaccount_id: int @@ -241,12 +229,12 @@ class TradeResponseSchema: trade_id: str trade_price: Decimal transaction_id: str - tx_hash: Optional[str] tx_status: TxStatus + quote_id: Optional[str] = None + tx_hash: Optional[str] = None -@dataclass -class PublicDepositDebugParamsSchema: +class PublicDepositDebugParamsSchema(Struct): amount: Decimal asset_name: str nonce: int @@ -256,129 +244,115 @@ class PublicDepositDebugParamsSchema: is_atomic_signing: bool = False -@dataclass -class PublicDepositDebugResultSchema: +class PublicDepositDebugResultSchema(Struct): action_hash: str encoded_data: str encoded_data_hashed: str typed_data_hash: str -@dataclass -class PrivateGetOpenOrdersParamsSchema: +class PrivateGetOpenOrdersParamsSchema(Struct): subaccount_id: int -@dataclass -class PrivateGetOpenOrdersResultSchema: +class PrivateGetOpenOrdersResultSchema(Struct): orders: List[OrderResponseSchema] subaccount_id: int -@dataclass -class SignatureDetailsSchema: +class SignatureDetailsSchema(Struct): nonce: int signature: str signature_expiry_sec: int signer: str -@dataclass -class TransferDetailsSchema: +class TransferDetailsSchema(Struct): address: str amount: Decimal sub_id: int -@dataclass -class PrivateTransferErc20ResultSchema: +class PrivateTransferErc20ResultSchema(Struct): status: str transaction_id: str class Scope(str, Enum): - admin = "admin" - account = "account" - read_only = "read_only" + admin = 'admin' + account = 'account' + read_only = 'read_only' -@dataclass -class PrivateRegisterScopedSessionKeyParamsSchema: +class PrivateRegisterScopedSessionKeyParamsSchema(Struct): expiry_sec: int public_session_key: str wallet: str ip_whitelist: Optional[List[str]] = None label: Optional[str] = None - scope: Scope = Scope.read_only + scope: Scope = 'read_only' signed_raw_tx: Optional[str] = None -@dataclass -class PrivateRegisterScopedSessionKeyResultSchema: +class PrivateRegisterScopedSessionKeyResultSchema(Struct): expiry_sec: int - ip_whitelist: Optional[List[str]] - label: Optional[str] public_session_key: str scope: Scope - transaction_id: Optional[str] + ip_whitelist: Optional[List[str]] = None + label: Optional[str] = None + transaction_id: Optional[str] = None -@dataclass class PublicGetCurrencyParamsSchema(PublicGetOptionSettlementPricesParamsSchema): pass class InstrumentType(str, Enum): - erc20 = "erc20" - option = "option" - perp = "perp" + erc20 = 'erc20' + option = 'option' + perp = 'perp' class MarketType(str, Enum): - ALL = "ALL" - SRM_BASE_ONLY = "SRM_BASE_ONLY" - SRM_OPTION_ONLY = "SRM_OPTION_ONLY" - SRM_PERP_ONLY = "SRM_PERP_ONLY" - CASH = "CASH" + ALL = 'ALL' + SRM_BASE_ONLY = 'SRM_BASE_ONLY' + SRM_OPTION_ONLY = 'SRM_OPTION_ONLY' + SRM_PERP_ONLY = 'SRM_PERP_ONLY' + CASH = 'CASH' -@dataclass -class OpenInterestStatsSchema: +class OpenInterestStatsSchema(Struct): current_open_interest: Decimal interest_cap: Decimal manager_currency: Optional[str] = None class MarginType(str, Enum): - PM = "PM" - SM = "SM" - PM2 = "PM2" + PM = 'PM' + SM = 'SM' + PM2 = 'PM2' -@dataclass -class ManagerContractResponseSchema: +class ManagerContractResponseSchema(Struct): address: str margin_type: MarginType currency: Optional[str] = None -@dataclass -class PM2CollateralDiscountsSchema: +class PM2CollateralDiscountsSchema(Struct): im_discount: Decimal manager_currency: str mm_discount: Decimal -@dataclass -class ProtocolAssetAddressesSchema: +class ProtocolAssetAddressesSchema(Struct): option: Optional[str] = None perp: Optional[str] = None spot: Optional[str] = None underlying_erc20: Optional[str] = None -@dataclass -class PrivateLiquidateParamsSchema: +class PrivateLiquidateParamsSchema(Struct): cash_transfer: Decimal last_seen_trade_id: int liquidated_subaccount_id: int @@ -391,35 +365,30 @@ class PrivateLiquidateParamsSchema: subaccount_id: int -@dataclass -class PrivateLiquidateResultSchema: +class PrivateLiquidateResultSchema(Struct): estimated_bid_price: Decimal estimated_discount_pnl: Decimal estimated_percent_bid: Decimal transaction_id: str -@dataclass -class PrivateGetSubaccountValueHistoryParamsSchema: +class PrivateGetSubaccountValueHistoryParamsSchema(Struct): end_timestamp: int period: int start_timestamp: int subaccount_id: int -@dataclass -class SubAccountValueHistoryResponseSchema: +class SubAccountValueHistoryResponseSchema(Struct): subaccount_value: Decimal timestamp: int -@dataclass class PublicGetMakerProgramsParamsSchema(PublicGetVaultStatisticsParamsSchema): pass -@dataclass -class ProgramResponseSchema: +class ProgramResponseSchema(Struct): asset_types: List[str] currencies: List[str] end_timestamp: int @@ -429,8 +398,7 @@ class ProgramResponseSchema: start_timestamp: int -@dataclass -class PrivateOrderDebugParamsSchema: +class PrivateOrderDebugParamsSchema(Struct): amount: Decimal direction: Direction instrument_name: str @@ -442,20 +410,19 @@ class PrivateOrderDebugParamsSchema: signer: str subaccount_id: int is_atomic_signing: Optional[bool] = False - label: str = "" + label: str = '' mmp: bool = False - order_type: OrderType = OrderType.limit + order_type: OrderType = 'limit' reduce_only: bool = False - referral_code: str = "" + referral_code: str = '' reject_timestamp: int = 9223372036854776000 - time_in_force: TimeInForce = TimeInForce.gtc + time_in_force: TimeInForce = 'gtc' trigger_price: Optional[Decimal] = None trigger_price_type: Optional[TriggerPriceType] = None trigger_type: Optional[TriggerType] = None -@dataclass -class TradeModuleDataSchema: +class TradeModuleDataSchema(Struct): asset: str desired_amount: Decimal is_bid: bool @@ -466,59 +433,51 @@ class TradeModuleDataSchema: worst_fee: Decimal -@dataclass -class PrivateGetInterestHistoryParamsSchema: +class PrivateGetInterestHistoryParamsSchema(Struct): subaccount_id: int end_timestamp: int = 9223372036854776000 start_timestamp: int = 0 -@dataclass -class InterestPaymentSchema: +class InterestPaymentSchema(Struct): interest: Decimal timestamp: int -@dataclass class PrivateGetDepositHistoryParamsSchema(PrivateGetInterestHistoryParamsSchema): pass -@dataclass -class DepositSchema: +class DepositSchema(Struct): amount: Decimal asset: str - error_log: Optional[Dict[str, Any]] timestamp: int transaction_id: str tx_hash: str tx_status: TxStatus + error_log: Optional[Dict[str, Any]] = None -@dataclass class PrivateGetMmpConfigParamsSchema(PrivateResetMmpParamsSchema): pass -@dataclass -class MMPConfigResultSchema: +class MMPConfigResultSchema(Struct): currency: str is_frozen: bool mmp_frozen_time: int mmp_interval: int mmp_unfreeze_time: int subaccount_id: int - mmp_amount_limit: Decimal = "0" - mmp_delta_limit: Decimal = "0" + mmp_amount_limit: Decimal = '0' + mmp_delta_limit: Decimal = '0' -@dataclass -class PrivateSessionKeysParamsSchema: +class PrivateSessionKeysParamsSchema(Struct): wallet: str -@dataclass -class SessionKeyResponseSchema: +class SessionKeyResponseSchema(Struct): expiry_sec: int ip_whitelist: List[str] label: str @@ -526,28 +485,25 @@ class SessionKeyResponseSchema: scope: str -@dataclass -class PublicGetInstrumentsParamsSchema: +class PublicGetInstrumentsParamsSchema(Struct): currency: str expired: bool instrument_type: InstrumentType -@dataclass -class ERC20PublicDetailsSchema: +class ERC20PublicDetailsSchema(Struct): decimals: int - borrow_index: Decimal = "1" - supply_index: Decimal = "1" - underlying_erc20_address: str = "" + borrow_index: Decimal = '1' + supply_index: Decimal = '1' + underlying_erc20_address: str = '' class OptionType(str, Enum): - C = "C" - P = "P" + C = 'C' + P = 'P' -@dataclass -class OptionPublicDetailsSchema: +class OptionPublicDetailsSchema(Struct): expiry: int index: str option_type: OptionType @@ -555,8 +511,7 @@ class OptionPublicDetailsSchema: settlement_price: Optional[Decimal] = None -@dataclass -class PerpPublicDetailsSchema: +class PerpPublicDetailsSchema(Struct): aggregate_funding: Decimal funding_rate: Decimal index: str @@ -565,13 +520,11 @@ class PerpPublicDetailsSchema: static_interest_rate: Decimal -@dataclass class PrivateGetAllPortfoliosParamsSchema(PrivateSessionKeysParamsSchema): pass -@dataclass -class CollateralResponseSchema: +class CollateralResponseSchema(Struct): amount: Decimal amount_step: Decimal asset_name: str @@ -596,8 +549,7 @@ class CollateralResponseSchema: unrealized_pnl_excl_fees: Decimal -@dataclass -class PositionResponseSchema: +class PositionResponseSchema(Struct): amount: Decimal amount_step: Decimal average_price: Decimal @@ -610,8 +562,6 @@ class PositionResponseSchema: initial_margin: Decimal instrument_name: str instrument_type: InstrumentType - leverage: Optional[Decimal] - liquidation_price: Optional[Decimal] maintenance_margin: Decimal mark_price: Decimal mark_value: Decimal @@ -625,21 +575,20 @@ class PositionResponseSchema: unrealized_pnl: Decimal unrealized_pnl_excl_fees: Decimal vega: Decimal + leverage: Optional[Decimal] = None + liquidation_price: Optional[Decimal] = None -@dataclass -class PublicGetInstrumentParamsSchema: +class PublicGetInstrumentParamsSchema(Struct): instrument_name: str -@dataclass -class PublicGetInstrumentResultSchema: +class PublicGetInstrumentResultSchema(Struct): amount_step: Decimal base_asset_address: str base_asset_sub_id: str base_currency: str base_fee: Decimal - erc20_details: Optional[ERC20PublicDetailsSchema] fifo_min_allocation: Decimal instrument_name: str instrument_type: InstrumentType @@ -647,8 +596,6 @@ class PublicGetInstrumentResultSchema: maker_fee_rate: Decimal maximum_amount: Decimal minimum_amount: Decimal - option_details: Optional[OptionPublicDetailsSchema] - perp_details: Optional[PerpPublicDetailsSchema] pro_rata_amount_step: Decimal pro_rata_fraction: Decimal quote_currency: str @@ -656,11 +603,13 @@ class PublicGetInstrumentResultSchema: scheduled_deactivation: int taker_fee_rate: Decimal tick_size: Decimal + erc20_details: Optional[ERC20PublicDetailsSchema] = None + option_details: Optional[OptionPublicDetailsSchema] = None + perp_details: Optional[PerpPublicDetailsSchema] = None mark_price_fee_rate_cap: Optional[Decimal] = None -@dataclass -class PublicExecuteQuoteDebugParamsSchema: +class PublicExecuteQuoteDebugParamsSchema(Struct): direction: Direction legs: List[LegPricedSchema] max_fee: Decimal @@ -671,11 +620,10 @@ class PublicExecuteQuoteDebugParamsSchema: signature_expiry_sec: int signer: str subaccount_id: int - label: str = "" + label: str = '' -@dataclass -class PublicExecuteQuoteDebugResultSchema: +class PublicExecuteQuoteDebugResultSchema(Struct): action_hash: str encoded_data: str encoded_data_hashed: str @@ -684,19 +632,16 @@ class PublicExecuteQuoteDebugResultSchema: typed_data_hash: str -@dataclass class PrivateGetCollateralsParamsSchema(PrivateGetOpenOrdersParamsSchema): pass -@dataclass -class PrivateGetCollateralsResultSchema: +class PrivateGetCollateralsResultSchema(Struct): collaterals: List[CollateralResponseSchema] subaccount_id: int -@dataclass -class PrivatePollQuotesParamsSchema: +class PrivatePollQuotesParamsSchema(Struct): subaccount_id: int from_timestamp: int = 0 page: int = 1 @@ -707,14 +652,12 @@ class PrivatePollQuotesParamsSchema: to_timestamp: int = 18446744073709552000 -@dataclass -class PaginationInfoSchema: +class PaginationInfoSchema(Struct): count: int num_pages: int -@dataclass -class QuoteResultPublicSchema: +class QuoteResultPublicSchema(Struct): cancel_reason: CancelReason creation_timestamp: int direction: Direction @@ -727,26 +670,23 @@ class QuoteResultPublicSchema: rfq_id: str status: Status subaccount_id: int - tx_hash: Optional[str] - tx_status: Optional[TxStatus] wallet: str + tx_hash: Optional[str] = None + tx_status: Optional[TxStatus] = None -@dataclass -class SimulatedCollateralSchema: +class SimulatedCollateralSchema(Struct): amount: Decimal asset_name: str -@dataclass -class SimulatedPositionSchema: +class SimulatedPositionSchema(Struct): amount: Decimal instrument_name: str entry_price: Optional[Decimal] = None -@dataclass -class PrivateGetMarginResultSchema: +class PrivateGetMarginResultSchema(Struct): is_valid_trade: bool post_initial_margin: Decimal post_maintenance_margin: Decimal @@ -755,74 +695,64 @@ class PrivateGetMarginResultSchema: subaccount_id: int -@dataclass -class PublicBuildRegisterSessionKeyTxParamsSchema: +class PublicBuildRegisterSessionKeyTxParamsSchema(Struct): expiry_sec: int - gas: Optional[int] - nonce: Optional[int] public_session_key: str wallet: str + gas: Optional[int] = None + nonce: Optional[int] = None -@dataclass -class PublicBuildRegisterSessionKeyTxResultSchema: +class PublicBuildRegisterSessionKeyTxResultSchema(Struct): tx_params: Dict[str, Any] -@dataclass -class PrivateCancelTriggerOrderParamsSchema: +class PrivateCancelTriggerOrderParamsSchema(Struct): order_id: str subaccount_id: int -@dataclass class PrivateCancelTriggerOrderResultSchema(OrderResponseSchema): pass -@dataclass class PrivateGetOrderParamsSchema(PrivateCancelTriggerOrderParamsSchema): pass -@dataclass class PrivateGetOrderResultSchema(OrderResponseSchema): pass -@dataclass class PrivateGetWithdrawalHistoryParamsSchema(PrivateGetInterestHistoryParamsSchema): pass -@dataclass -class WithdrawalSchema: +class WithdrawalSchema(Struct): amount: Decimal asset: str - error_log: Optional[Dict[str, Any]] timestamp: int tx_hash: str tx_status: TxStatus + error_log: Optional[Dict[str, Any]] = None -@dataclass class PublicGetLiveIncidentsParamsSchema(PublicGetVaultStatisticsParamsSchema): pass class MonitorType(str, Enum): - manual = "manual" - auto = "auto" + manual = 'manual' + auto = 'auto' class Severity(str, Enum): - low = "low" - medium = "medium" - high = "high" + low = 'low' + medium = 'medium' + high = 'high' -@dataclass -class IncidentResponseSchema: +class IncidentResponseSchema(Struct): creation_timestamp_sec: int label: str message: str @@ -830,35 +760,29 @@ class IncidentResponseSchema: severity: Severity -@dataclass class PrivateGetQuotesParamsSchema(PrivatePollQuotesParamsSchema): pass -@dataclass -class PrivateGetQuotesResultSchema: - pagination: PaginationInfoSchema +class PrivateGetQuotesResultSchema(Struct): quotes: List[QuoteResultSchema] + pagination: PaginationInfoSchema | None = None -@dataclass class PrivateGetPositionsParamsSchema(PrivateGetOpenOrdersParamsSchema): pass -@dataclass -class PrivateGetPositionsResultSchema: +class PrivateGetPositionsResultSchema(Struct): positions: List[PositionResponseSchema] subaccount_id: int -@dataclass class PrivateGetOptionSettlementHistoryParamsSchema(PrivateGetOpenOrdersParamsSchema): pass -@dataclass -class OptionSettlementResponseSchema: +class OptionSettlementResponseSchema(Struct): amount: Decimal expiry: int instrument_name: str @@ -868,21 +792,18 @@ class OptionSettlementResponseSchema: subaccount_id: int -@dataclass -class PublicDeregisterSessionKeyParamsSchema: +class PublicDeregisterSessionKeyParamsSchema(Struct): public_session_key: str signed_raw_tx: str wallet: str -@dataclass -class PublicDeregisterSessionKeyResultSchema: +class PublicDeregisterSessionKeyResultSchema(Struct): public_session_key: str transaction_id: str -@dataclass -class PublicGetVaultShareParamsSchema: +class PublicGetVaultShareParamsSchema(Struct): from_timestamp_sec: int to_timestamp_sec: int vault_name: str @@ -890,17 +811,15 @@ class PublicGetVaultShareParamsSchema: page_size: int = 100 -@dataclass -class VaultShareResponseSchema: +class VaultShareResponseSchema(Struct): base_value: Decimal block_number: int block_timestamp: int - underlying_value: Optional[Decimal] usd_value: Decimal + underlying_value: Optional[Decimal] = None -@dataclass -class PrivateExpiredAndCancelledHistoryParamsSchema: +class PrivateExpiredAndCancelledHistoryParamsSchema(Struct): end_timestamp: int expiry: int start_timestamp: int @@ -908,13 +827,11 @@ class PrivateExpiredAndCancelledHistoryParamsSchema: wallet: str -@dataclass -class PrivateExpiredAndCancelledHistoryResultSchema: +class PrivateExpiredAndCancelledHistoryResultSchema(Struct): presigned_urls: List[str] -@dataclass -class PrivateEditSessionKeyParamsSchema: +class PrivateEditSessionKeyParamsSchema(Struct): public_session_key: str wallet: str disable: bool = False @@ -922,21 +839,16 @@ class PrivateEditSessionKeyParamsSchema: label: Optional[str] = None -@dataclass class PrivateEditSessionKeyResultSchema(SessionKeyResponseSchema): pass -@dataclass class PublicGetAllCurrenciesParamsSchema(PublicGetVaultStatisticsParamsSchema): pass -@dataclass -class CurrencyDetailedResponseSchema: - asset_cap_and_supply_per_manager: Dict[ - str, Dict[str, List[OpenInterestStatsSchema]] - ] +class CurrencyDetailedResponseSchema(Struct): + asset_cap_and_supply_per_manager: Dict[str, Dict[str, List[OpenInterestStatsSchema]]] borrow_apy: Decimal currency: str instrument_types: List[InstrumentType] @@ -953,30 +865,25 @@ class CurrencyDetailedResponseSchema: spot_price_24h: Optional[Decimal] = None -@dataclass -class PrivateCancelByLabelParamsSchema: +class PrivateCancelByLabelParamsSchema(Struct): label: str subaccount_id: int instrument_name: Optional[str] = None -@dataclass -class PrivateCancelByLabelResultSchema: +class PrivateCancelByLabelResultSchema(Struct): cancelled_orders: int -@dataclass class PublicWithdrawDebugParamsSchema(PublicDepositDebugParamsSchema): pass -@dataclass class PublicWithdrawDebugResultSchema(PublicDepositDebugResultSchema): pass -@dataclass -class PublicGetMarginParamsSchema: +class PublicGetMarginParamsSchema(Struct): margin_type: MarginType simulated_collaterals: List[SimulatedCollateralSchema] simulated_positions: List[SimulatedPositionSchema] @@ -985,24 +892,20 @@ class PublicGetMarginParamsSchema: simulated_position_changes: Optional[List[SimulatedPositionSchema]] = None -@dataclass class PublicGetMarginResultSchema(PrivateGetMarginResultSchema): pass -@dataclass class PrivateGetSubaccountsParamsSchema(PrivateSessionKeysParamsSchema): pass -@dataclass -class PrivateGetSubaccountsResultSchema: +class PrivateGetSubaccountsResultSchema(Struct): subaccount_ids: List[int] wallet: str -@dataclass -class PrivatePollRfqsParamsSchema: +class PrivatePollRfqsParamsSchema(Struct): subaccount_id: int from_timestamp: int = 0 page: int = 1 @@ -1013,15 +916,13 @@ class PrivatePollRfqsParamsSchema: to_timestamp: int = 18446744073709552000 -@dataclass -class LegUnpricedSchema: +class LegUnpricedSchema(Struct): amount: Decimal direction: Direction instrument_name: str -@dataclass -class PrivateWithdrawParamsSchema: +class PrivateWithdrawParamsSchema(Struct): amount: Decimal asset_name: str nonce: int @@ -1032,42 +933,36 @@ class PrivateWithdrawParamsSchema: is_atomic_signing: bool = False -@dataclass class PrivateWithdrawResultSchema(PrivateTransferErc20ResultSchema): pass class Status6(str, Enum): - unseen = "unseen" - seen = "seen" - hidden = "hidden" + unseen = 'unseen' + seen = 'seen' + hidden = 'hidden' -@dataclass -class PrivateUpdateNotificationsParamsSchema: +class PrivateUpdateNotificationsParamsSchema(Struct): notification_ids: List[int] subaccount_id: int - status: Status6 = Status6.seen + status: Status6 = 'seen' -@dataclass -class PrivateUpdateNotificationsResultSchema: +class PrivateUpdateNotificationsResultSchema(Struct): updated_count: int -@dataclass -class PrivateSetCancelOnDisconnectParamsSchema: +class PrivateSetCancelOnDisconnectParamsSchema(Struct): enabled: bool wallet: str -@dataclass class PrivateSetCancelOnDisconnectResponseSchema(PrivateResetMmpResponseSchema): pass -@dataclass -class PrivateGetTradeHistoryParamsSchema: +class PrivateGetTradeHistoryParamsSchema(Struct): from_timestamp: int = 0 instrument_name: Optional[str] = None order_id: Optional[str] = None @@ -1079,34 +974,29 @@ class PrivateGetTradeHistoryParamsSchema: wallet: Optional[str] = None -@dataclass -class PrivateGetTradeHistoryResultSchema: - pagination: PaginationInfoSchema +class PrivateGetTradeHistoryResultSchema(Struct): subaccount_id: int trades: List[TradeResponseSchema] + pagination: PaginationInfoSchema | None = None -@dataclass class PrivateOrderParamsSchema(PrivateOrderDebugParamsSchema): pass -@dataclass -class PrivateOrderResultSchema: +class PrivateOrderResultSchema(Struct): order: OrderResponseSchema trades: List[TradeResponseSchema] -@dataclass -class PublicGetInterestRateHistoryParamsSchema: +class PublicGetInterestRateHistoryParamsSchema(Struct): from_timestamp_sec: int to_timestamp_sec: int page: int = 1 page_size: int = 100 -@dataclass -class InterestRateHistoryResponseSchema: +class InterestRateHistoryResponseSchema(Struct): block: int borrow_apy: Decimal supply_apy: Decimal @@ -1115,27 +1005,23 @@ class InterestRateHistoryResponseSchema: total_supply: Decimal -@dataclass -class PublicGetOptionSettlementHistoryParamsSchema: +class PublicGetOptionSettlementHistoryParamsSchema(Struct): page: int = 1 page_size: int = 100 subaccount_id: Optional[int] = None -@dataclass -class PublicGetOptionSettlementHistoryResultSchema: - pagination: PaginationInfoSchema +class PublicGetOptionSettlementHistoryResultSchema(Struct): settlements: List[OptionSettlementResponseSchema] + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicGetMakerProgramScoresParamsSchema: +class PublicGetMakerProgramScoresParamsSchema(Struct): epoch_start_timestamp: int program_name: str -@dataclass -class ScoreBreakdownSchema: +class ScoreBreakdownSchema(Struct): coverage_score: Decimal holder_boost: Decimal quality_score: Decimal @@ -1145,8 +1031,7 @@ class ScoreBreakdownSchema: wallet: str -@dataclass -class PrivateGetOrdersParamsSchema: +class PrivateGetOrdersParamsSchema(Struct): subaccount_id: int instrument_name: Optional[str] = None label: Optional[str] = None @@ -1155,20 +1040,17 @@ class PrivateGetOrdersParamsSchema: status: Optional[OrderStatus] = None -@dataclass -class PrivateGetOrdersResultSchema: +class PrivateGetOrdersResultSchema(Struct): orders: List[OrderResponseSchema] - pagination: PaginationInfoSchema subaccount_id: int + pagination: PaginationInfoSchema | None = None -@dataclass class PublicGetTickerParamsSchema(PublicGetInstrumentParamsSchema): pass -@dataclass -class OptionPricingSchema: +class OptionPricingSchema(Struct): ask_iv: Decimal bid_iv: Decimal delta: Decimal @@ -1182,8 +1064,7 @@ class OptionPricingSchema: vega: Decimal -@dataclass -class AggregateTradingStatsSchema: +class AggregateTradingStatsSchema(Struct): contract_volume: Decimal high: Decimal low: Decimal @@ -1193,21 +1074,18 @@ class AggregateTradingStatsSchema: usd_change: Decimal -@dataclass -class PublicLoginParamsSchema: +class PublicLoginParamsSchema(Struct): signature: str timestamp: str wallet: str -@dataclass -class PublicLoginResponseSchema: +class PublicLoginResponseSchema(Struct): id: Union[str, int] result: List[int] -@dataclass -class PrivateGetFundingHistoryParamsSchema: +class PrivateGetFundingHistoryParamsSchema(Struct): subaccount_id: int end_timestamp: int = 9223372036854776000 instrument_name: Optional[str] = None @@ -1216,40 +1094,35 @@ class PrivateGetFundingHistoryParamsSchema: start_timestamp: int = 0 -@dataclass -class FundingPaymentSchema: +class FundingPaymentSchema(Struct): funding: Decimal instrument_name: str pnl: Decimal timestamp: int -@dataclass -class PublicGetSpotFeedHistoryParamsSchema: +class PublicGetSpotFeedHistoryParamsSchema(Struct): currency: str end_timestamp: int period: int start_timestamp: int -@dataclass -class SpotFeedHistoryResponseSchema: +class SpotFeedHistoryResponseSchema(Struct): price: Decimal timestamp: int timestamp_bucket: int -@dataclass -class PrivateSetMmpConfigParamsSchema: +class PrivateSetMmpConfigParamsSchema(Struct): currency: str mmp_frozen_time: int mmp_interval: int subaccount_id: int - mmp_amount_limit: Decimal = "0" - mmp_delta_limit: Decimal = "0" + mmp_amount_limit: Decimal = '0' + mmp_delta_limit: Decimal = '0' -@dataclass class PrivateSetMmpConfigResultSchema(PrivateSetMmpConfigParamsSchema): pass @@ -1262,32 +1135,29 @@ class Period(str, Enum): field_86400 = 86400 -@dataclass -class PublicGetFundingRateHistoryParamsSchema: +class PublicGetFundingRateHistoryParamsSchema(Struct): instrument_name: str end_timestamp: int = 9223372036854776000 - period: Period = Period.field_3600 + period: Period = 3600 start_timestamp: int = 0 -@dataclass -class FundingRateSchema: +class FundingRateSchema(Struct): funding_rate: Decimal timestamp: int class TypeEnum(str, Enum): - deposit = "deposit" - withdraw = "withdraw" - transfer = "transfer" - trade = "trade" - settlement = "settlement" - liquidation = "liquidation" - custom = "custom" + deposit = 'deposit' + withdraw = 'withdraw' + transfer = 'transfer' + trade = 'trade' + settlement = 'settlement' + liquidation = 'liquidation' + custom = 'custom' -@dataclass -class PrivateGetNotificationsParamsSchema: +class PrivateGetNotificationsParamsSchema(Struct): page: Optional[int] = 1 page_size: Optional[int] = 50 status: Optional[Status6] = None @@ -1296,8 +1166,7 @@ class PrivateGetNotificationsParamsSchema: wallet: Optional[str] = None -@dataclass -class NotificationResponseSchema: +class NotificationResponseSchema(Struct): event: str event_details: Dict[str, Any] id: int @@ -1308,8 +1177,7 @@ class NotificationResponseSchema: tx_hash: Optional[str] = None -@dataclass -class PrivateCancelBatchQuotesParamsSchema: +class PrivateCancelBatchQuotesParamsSchema(Struct): subaccount_id: int label: Optional[str] = None nonce: Optional[int] = None @@ -1317,73 +1185,69 @@ class PrivateCancelBatchQuotesParamsSchema: rfq_id: Optional[str] = None -@dataclass -class PrivateCancelBatchQuotesResultSchema: +class PrivateCancelBatchQuotesResultSchema(Struct): cancelled_ids: List[str] -@dataclass -class PrivateRfqGetBestQuoteParamsSchema: +class PrivateRfqGetBestQuoteParamsSchema(Struct): legs: List[LegUnpricedSchema] subaccount_id: int counterparties: Optional[List[str]] = None - direction: Direction = Direction.buy - label: str = "" + direction: Direction = 'buy' + label: str = '' max_total_cost: Optional[Decimal] = None min_total_cost: Optional[Decimal] = None - partial_fill_step: Decimal = "1" + partial_fill_step: Decimal = '1' rfq_id: Optional[str] = None class InvalidReason(str, Enum): Account_is_currently_under_maintenance_margin_requirements__trading_is_frozen_ = ( - "Account is currently under maintenance margin requirements, trading is frozen." + 'Account is currently under maintenance margin requirements, trading is frozen.' ) This_order_would_cause_account_to_fall_under_maintenance_margin_requirements_ = ( - "This order would cause account to fall under maintenance margin requirements." + 'This order would cause account to fall under maintenance margin requirements.' ) Insufficient_buying_power__only_a_single_risk_reducing_open_order_is_allowed_ = ( - "Insufficient buying power, only a single risk-reducing open order is allowed." + 'Insufficient buying power, only a single risk-reducing open order is allowed.' ) Insufficient_buying_power__consider_reducing_order_size_ = ( - "Insufficient buying power, consider reducing order size." + 'Insufficient buying power, consider reducing order size.' ) - Insufficient_buying_power__consider_reducing_order_size_or_canceling_other_orders_ = "Insufficient buying power, consider reducing order size or canceling other orders." - Consider_canceling_other_limit_orders_or_using_IOC__FOK__or_market_orders__This_order_is_risk_reducing__but_if_filled_with_other_open_orders__buying_power_might_be_insufficient_ = "Consider canceling other limit orders or using IOC, FOK, or market orders. This order is risk-reducing, but if filled with other open orders, buying power might be insufficient." - Insufficient_buying_power_ = "Insufficient buying power." + Insufficient_buying_power__consider_reducing_order_size_or_canceling_other_orders_ = ( + 'Insufficient buying power, consider reducing order size or canceling other orders.' + ) + Consider_canceling_other_limit_orders_or_using_IOC__FOK__or_market_orders__This_order_is_risk_reducing__but_if_filled_with_other_open_orders__buying_power_might_be_insufficient_ = 'Consider canceling other limit orders or using IOC, FOK, or market orders. This order is risk-reducing, but if filled with other open orders, buying power might be insufficient.' + Insufficient_buying_power_ = 'Insufficient buying power.' -@dataclass -class PrivateRfqGetBestQuoteResultSchema: - best_quote: Optional[QuoteResultPublicSchema] +class PrivateRfqGetBestQuoteResultSchema(Struct): direction: Direction - down_liquidation_price: Optional[Decimal] estimated_fee: Decimal estimated_realized_pnl: Decimal estimated_realized_pnl_excl_fees: Decimal estimated_total_cost: Decimal filled_pct: Decimal - invalid_reason: Optional[InvalidReason] is_valid: bool post_initial_margin: Decimal - post_liquidation_price: Optional[Decimal] pre_initial_margin: Decimal suggested_max_fee: Decimal - up_liquidation_price: Optional[Decimal] + best_quote: Optional[QuoteResultPublicSchema] = None + down_liquidation_price: Optional[Decimal] = None + invalid_reason: Optional[InvalidReason] = None + post_liquidation_price: Optional[Decimal] = None + up_liquidation_price: Optional[Decimal] = None -@dataclass class PrivateDepositParamsSchema(PrivateWithdrawParamsSchema): pass -@dataclass class PrivateDepositResultSchema(PrivateTransferErc20ResultSchema): pass -@dataclass -class PublicGetLiquidationHistoryParamsSchema: +class PublicGetLiquidationHistoryParamsSchema(Struct): end_timestamp: int = 9223372036854776000 page: int = 1 page_size: int = 100 @@ -1392,12 +1256,11 @@ class PublicGetLiquidationHistoryParamsSchema: class AuctionType(str, Enum): - solvent = "solvent" - insolvent = "insolvent" + solvent = 'solvent' + insolvent = 'insolvent' -@dataclass -class AuctionBidEventSchema: +class AuctionBidEventSchema(Struct): amounts_liquidated: Dict[str, Decimal] cash_received: Decimal discount_pnl: Decimal @@ -1410,27 +1273,21 @@ class AuctionBidEventSchema: tx_hash: str -@dataclass -class PrivateChangeSubaccountLabelParamsSchema: +class PrivateChangeSubaccountLabelParamsSchema(Struct): label: str subaccount_id: int -@dataclass -class PrivateChangeSubaccountLabelResultSchema( - PrivateChangeSubaccountLabelParamsSchema -): +class PrivateChangeSubaccountLabelResultSchema(PrivateChangeSubaccountLabelParamsSchema): pass -@dataclass -class PublicMarginWatchParamsSchema: +class PublicMarginWatchParamsSchema(Struct): subaccount_id: int force_onchain: bool = False -@dataclass -class CollateralPublicResponseSchema: +class CollateralPublicResponseSchema(Struct): amount: Decimal asset_name: str asset_type: InstrumentType @@ -1440,8 +1297,7 @@ class CollateralPublicResponseSchema: mark_value: Decimal -@dataclass -class PositionPublicResponseSchema: +class PositionPublicResponseSchema(Struct): amount: Decimal delta: Decimal gamma: Decimal @@ -1449,34 +1305,30 @@ class PositionPublicResponseSchema: initial_margin: Decimal instrument_name: str instrument_type: InstrumentType - liquidation_price: Optional[Decimal] maintenance_margin: Decimal mark_price: Decimal mark_value: Decimal theta: Decimal vega: Decimal + liquidation_price: Optional[Decimal] = None -@dataclass -class PublicGetTransactionParamsSchema: +class PublicGetTransactionParamsSchema(Struct): transaction_id: str -@dataclass -class PublicGetTransactionResultSchema: +class PublicGetTransactionResultSchema(Struct): data: str - error_log: Optional[str] status: TxStatus - transaction_hash: Optional[str] + error_log: Optional[str] = None + transaction_hash: Optional[str] = None -@dataclass class PrivateGetErc20TransferHistoryParamsSchema(PrivateGetInterestHistoryParamsSchema): pass -@dataclass -class ERC20TransferSchema: +class ERC20TransferSchema(Struct): amount: Decimal asset: str counterparty_subaccount_id: int @@ -1485,8 +1337,7 @@ class ERC20TransferSchema: tx_hash: str -@dataclass -class PrivateReplaceParamsSchema: +class PrivateReplaceParamsSchema(Struct): amount: Decimal direction: Direction instrument_name: str @@ -1499,35 +1350,33 @@ class PrivateReplaceParamsSchema: subaccount_id: int expected_filled_amount: Optional[Decimal] = None is_atomic_signing: Optional[bool] = False - label: str = "" + label: str = '' mmp: bool = False nonce_to_cancel: Optional[int] = None order_id_to_cancel: Optional[str] = None - order_type: OrderType = OrderType.limit + order_type: OrderType = 'limit' reduce_only: bool = False - referral_code: str = "" + referral_code: str = '' reject_timestamp: int = 9223372036854776000 - time_in_force: TimeInForce = TimeInForce.gtc + time_in_force: TimeInForce = 'gtc' trigger_price: Optional[Decimal] = None trigger_price_type: Optional[TriggerPriceType] = None trigger_type: Optional[TriggerType] = None -@dataclass -class RPCErrorFormatSchema: +class RPCErrorFormatSchema(Struct): code: int message: str data: Optional[str] = None class TxStatus5(str, Enum): - settled = "settled" - reverted = "reverted" - timed_out = "timed_out" + settled = 'settled' + reverted = 'reverted' + timed_out = 'timed_out' -@dataclass -class PublicGetTradeHistoryParamsSchema: +class PublicGetTradeHistoryParamsSchema(Struct): currency: Optional[str] = None from_timestamp: int = 0 instrument_name: Optional[str] = None @@ -1538,18 +1387,16 @@ class PublicGetTradeHistoryParamsSchema: to_timestamp: int = 18446744073709552000 trade_id: Optional[str] = None tx_hash: Optional[str] = None - tx_status: TxStatus5 = TxStatus5.settled + tx_status: TxStatus5 = 'settled' -@dataclass -class TradeSettledPublicResponseSchema: +class TradeSettledPublicResponseSchema(Struct): direction: Direction expected_rebate: Decimal index_price: Decimal instrument_name: str liquidity_role: LiquidityRole mark_price: Decimal - quote_id: Optional[str] realized_pnl: Decimal realized_pnl_excl_fees: Decimal subaccount_id: int @@ -1561,10 +1408,10 @@ class TradeSettledPublicResponseSchema: tx_hash: str tx_status: TxStatus5 wallet: str + quote_id: Optional[str] = None -@dataclass -class PublicSendQuoteDebugParamsSchema: +class PublicSendQuoteDebugParamsSchema(Struct): direction: Direction legs: List[LegPricedSchema] max_fee: Decimal @@ -1574,47 +1421,40 @@ class PublicSendQuoteDebugParamsSchema: signature_expiry_sec: int signer: str subaccount_id: int - label: str = "" + label: str = '' mmp: bool = False -@dataclass class PublicSendQuoteDebugResultSchema(PublicDepositDebugResultSchema): pass -@dataclass -class PrivateGetOrderHistoryParamsSchema: +class PrivateGetOrderHistoryParamsSchema(Struct): subaccount_id: int page: int = 1 page_size: int = 100 -@dataclass class PrivateGetOrderHistoryResultSchema(PrivateGetOrdersResultSchema): pass -@dataclass -class PrivateCancelBatchRfqsParamsSchema: +class PrivateCancelBatchRfqsParamsSchema(Struct): subaccount_id: int label: Optional[str] = None nonce: Optional[int] = None rfq_id: Optional[str] = None -@dataclass class PrivateCancelBatchRfqsResultSchema(PrivateCancelBatchQuotesResultSchema): pass -@dataclass class PrivateExecuteQuoteParamsSchema(PublicExecuteQuoteDebugParamsSchema): pass -@dataclass -class PrivateExecuteQuoteResultSchema: +class PrivateExecuteQuoteResultSchema(Struct): cancel_reason: CancelReason creation_timestamp: int direction: Direction @@ -1637,12 +1477,11 @@ class PrivateExecuteQuoteResultSchema: signer: str status: Status subaccount_id: int - tx_hash: Optional[str] - tx_status: Optional[TxStatus] + tx_hash: Optional[str] = None + tx_status: Optional[TxStatus] = None -@dataclass -class PublicCreateSubaccountDebugParamsSchema: +class PublicCreateSubaccountDebugParamsSchema(Struct): amount: Decimal asset_name: str margin_type: MarginType @@ -1653,47 +1492,40 @@ class PublicCreateSubaccountDebugParamsSchema: currency: Optional[str] = None -@dataclass class PublicCreateSubaccountDebugResultSchema(PublicDepositDebugResultSchema): pass -@dataclass class PrivateGetLiquidationHistoryParamsSchema(PrivateGetInterestHistoryParamsSchema): pass -@dataclass -class PrivateCancelRfqParamsSchema: +class PrivateCancelRfqParamsSchema(Struct): rfq_id: str subaccount_id: int -@dataclass class PrivateCancelRfqResponseSchema(PrivateResetMmpResponseSchema): pass -@dataclass -class PublicGetLatestSignedFeedsParamsSchema: +class PublicGetLatestSignedFeedsParamsSchema(Struct): currency: Optional[str] = None expiry: Optional[int] = None -@dataclass -class OracleSignatureDataSchema: +class OracleSignatureDataSchema(Struct): signatures: Optional[List[str]] = None signers: Optional[List[str]] = None class Type(str, Enum): - P = "P" - A = "A" - B = "B" + P = 'P' + A = 'A' + B = 'B' -@dataclass -class PerpFeedDataSchema: +class PerpFeedDataSchema(Struct): confidence: Decimal currency: str deadline: int @@ -1703,8 +1535,7 @@ class PerpFeedDataSchema: type: Type -@dataclass -class RateFeedDataSchema: +class RateFeedDataSchema(Struct): confidence: Decimal currency: str deadline: int @@ -1715,23 +1546,21 @@ class RateFeedDataSchema: class FeedSourceType(str, Enum): - S = "S" - O = "O" + S = 'S' + O = 'O' -@dataclass -class SpotFeedDataSchema: +class SpotFeedDataSchema(Struct): confidence: Decimal currency: str deadline: int price: Decimal signatures: OracleSignatureDataSchema timestamp: int - feed_source_type: FeedSourceType = FeedSourceType.S + feed_source_type: FeedSourceType = 'S' -@dataclass -class VolSVIParamDataSchema: +class VolSVIParamDataSchema(Struct): SVI_a: Decimal SVI_b: Decimal SVI_fwd: Decimal @@ -1741,23 +1570,20 @@ class VolSVIParamDataSchema: SVI_sigma: Decimal -@dataclass -class PublicGetReferralPerformanceParamsSchema: +class PublicGetReferralPerformanceParamsSchema(Struct): end_ms: int start_ms: int referral_code: Optional[str] = None wallet: Optional[str] = None -@dataclass -class ReferralPerformanceByInstrumentTypeSchema: +class ReferralPerformanceByInstrumentTypeSchema(Struct): fee_reward: Decimal notional_volume: Decimal referred_fee: Decimal -@dataclass -class PrivateCreateSubaccountParamsSchema: +class PrivateCreateSubaccountParamsSchema(Struct): amount: Decimal asset_name: str margin_type: MarginType @@ -1769,19 +1595,16 @@ class PrivateCreateSubaccountParamsSchema: currency: Optional[str] = None -@dataclass class PrivateCreateSubaccountResultSchema(PrivateTransferErc20ResultSchema): pass -@dataclass -class PrivateCancelParamsSchema: +class PrivateCancelParamsSchema(Struct): instrument_name: str order_id: str subaccount_id: int -@dataclass class PrivateCancelResultSchema(OrderResponseSchema): pass @@ -1798,16 +1621,14 @@ class Period1(str, Enum): field_604800 = 604800 -@dataclass -class PublicGetSpotFeedHistoryCandlesParamsSchema: +class PublicGetSpotFeedHistoryCandlesParamsSchema(Struct): currency: str end_timestamp: int period: Period1 start_timestamp: int -@dataclass -class SpotFeedHistoryCandlesResponseSchema: +class SpotFeedHistoryCandlesResponseSchema(Struct): close_price: Decimal high_price: Decimal low_price: Decimal @@ -1817,8 +1638,7 @@ class SpotFeedHistoryCandlesResponseSchema: timestamp_bucket: int -@dataclass -class PrivateGetRfqsParamsSchema: +class PrivateGetRfqsParamsSchema(Struct): subaccount_id: int from_timestamp: int = 0 page: int = 1 @@ -1828,83 +1648,73 @@ class PrivateGetRfqsParamsSchema: to_timestamp: int = 18446744073709552000 -@dataclass -class RFQResultSchema: - ask_total_cost: Optional[Decimal] - bid_total_cost: Optional[Decimal] +class RFQResultSchema(Struct): cancel_reason: CancelReason - counterparties: Optional[List[str]] creation_timestamp: int - filled_direction: Optional[Direction] filled_pct: Decimal label: str last_update_timestamp: int legs: List[LegUnpricedSchema] - mark_total_cost: Optional[Decimal] - max_total_cost: Optional[Decimal] - min_total_cost: Optional[Decimal] partial_fill_step: Decimal rfq_id: str status: Status subaccount_id: int - total_cost: Optional[Decimal] valid_until: int + ask_total_cost: Optional[Decimal] = None + bid_total_cost: Optional[Decimal] = None + counterparties: Optional[List[str]] = None + filled_direction: Optional[Direction] = None + mark_total_cost: Optional[Decimal] = None + max_total_cost: Optional[Decimal] = None + min_total_cost: Optional[Decimal] = None + total_cost: Optional[Decimal] = None -@dataclass -class PrivateCancelByNonceParamsSchema: +class PrivateCancelByNonceParamsSchema(Struct): instrument_name: str nonce: int subaccount_id: int wallet: str -@dataclass class PrivateCancelByNonceResultSchema(PrivateCancelByLabelResultSchema): pass -@dataclass class PrivateGetSubaccountParamsSchema(PrivateGetOpenOrdersParamsSchema): pass -@dataclass -class PrivateSendRfqParamsSchema: +class PrivateSendRfqParamsSchema(Struct): legs: List[LegUnpricedSchema] subaccount_id: int counterparties: Optional[List[str]] = None - label: str = "" + label: str = '' max_total_cost: Optional[Decimal] = None min_total_cost: Optional[Decimal] = None - partial_fill_step: Decimal = "1" + partial_fill_step: Decimal = '1' -@dataclass class PrivateSendRfqResultSchema(RFQResultSchema): pass -@dataclass class PublicGetTimeParamsSchema(PublicGetVaultStatisticsParamsSchema): pass -@dataclass -class PublicGetTimeResponseSchema: +class PublicGetTimeResponseSchema(Struct): id: Union[str, int] result: int -@dataclass -class PublicStatisticsParamsSchema: +class PublicStatisticsParamsSchema(Struct): instrument_name: str currency: Optional[str] = None end_time: Optional[int] = None -@dataclass -class PublicStatisticsResultSchema: +class PublicStatisticsResultSchema(Struct): daily_fees: Decimal daily_notional_volume: Decimal daily_premium_volume: Decimal @@ -1916,8 +1726,7 @@ class PublicStatisticsResultSchema: total_trades: int -@dataclass -class PublicGetAllInstrumentsParamsSchema: +class PublicGetAllInstrumentsParamsSchema(Struct): expired: bool instrument_type: InstrumentType currency: Optional[str] = None @@ -1925,8 +1734,7 @@ class PublicGetAllInstrumentsParamsSchema: page_size: int = 100 -@dataclass -class PrivateGetLiquidatorHistoryParamsSchema: +class PrivateGetLiquidatorHistoryParamsSchema(Struct): subaccount_id: int end_timestamp: int = 9223372036854776000 page: int = 1 @@ -1934,14 +1742,12 @@ class PrivateGetLiquidatorHistoryParamsSchema: start_timestamp: int = 0 -@dataclass -class PrivateGetLiquidatorHistoryResultSchema: +class PrivateGetLiquidatorHistoryResultSchema(Struct): bids: List[AuctionBidEventSchema] - pagination: PaginationInfoSchema + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicRegisterSessionKeyParamsSchema: +class PublicRegisterSessionKeyParamsSchema(Struct): expiry_sec: int label: str public_session_key: str @@ -1949,21 +1755,18 @@ class PublicRegisterSessionKeyParamsSchema: wallet: str -@dataclass -class PublicRegisterSessionKeyResultSchema: +class PublicRegisterSessionKeyResultSchema(Struct): label: str public_session_key: str transaction_id: str -@dataclass -class PublicGetVaultBalancesParamsSchema: +class PublicGetVaultBalancesParamsSchema(Struct): smart_contract_owner: Optional[str] = None wallet: Optional[str] = None -@dataclass -class VaultBalanceResponseSchema: +class VaultBalanceResponseSchema(Struct): address: str amount: Decimal chain_id: int @@ -1971,74 +1774,62 @@ class VaultBalanceResponseSchema: vault_asset_type: str -@dataclass class PrivateGetAccountParamsSchema(PrivateSessionKeysParamsSchema): pass -@dataclass -class AccountFeeInfoSchema: +class AccountFeeInfoSchema(Struct): base_fee_discount: Decimal - option_maker_fee: Optional[Decimal] - option_taker_fee: Optional[Decimal] - perp_maker_fee: Optional[Decimal] - perp_taker_fee: Optional[Decimal] rfq_maker_discount: Decimal rfq_taker_discount: Decimal - spot_maker_fee: Optional[Decimal] - spot_taker_fee: Optional[Decimal] + option_maker_fee: Optional[Decimal] = None + option_taker_fee: Optional[Decimal] = None + perp_maker_fee: Optional[Decimal] = None + perp_taker_fee: Optional[Decimal] = None + spot_maker_fee: Optional[Decimal] = None + spot_taker_fee: Optional[Decimal] = None -@dataclass -class PrivateCancelQuoteParamsSchema: +class PrivateCancelQuoteParamsSchema(Struct): quote_id: str subaccount_id: int -@dataclass class PrivateCancelQuoteResultSchema(QuoteResultSchema): pass -@dataclass -class PrivateCancelByInstrumentParamsSchema: +class PrivateCancelByInstrumentParamsSchema(Struct): instrument_name: str subaccount_id: int -@dataclass class PrivateCancelByInstrumentResultSchema(PrivateCancelByLabelResultSchema): pass -@dataclass class PrivateSendQuoteParamsSchema(PublicSendQuoteDebugParamsSchema): pass -@dataclass class PrivateSendQuoteResultSchema(QuoteResultSchema): pass -@dataclass class PrivateCancelAllParamsSchema(PrivateGetOpenOrdersParamsSchema): pass -@dataclass class PrivateCancelAllResponseSchema(PrivateResetMmpResponseSchema): pass -@dataclass -class PublicGetVaultStatisticsResponseSchema: +class PublicGetVaultStatisticsResponseSchema(Struct): id: Union[str, int] result: List[VaultStatisticsResponseSchema] -@dataclass -class SignedQuoteParamsSchema: +class SignedQuoteParamsSchema(Struct): direction: Direction legs: List[LegPricedSchema] max_fee: Decimal @@ -2049,46 +1840,39 @@ class SignedQuoteParamsSchema: subaccount_id: int -@dataclass -class PrivateTransferPositionsResultSchema: +class PrivateTransferPositionsResultSchema(Struct): maker_quote: QuoteResultSchema taker_quote: QuoteResultSchema -@dataclass -class PublicGetOptionSettlementPricesResultSchema: +class PublicGetOptionSettlementPricesResultSchema(Struct): expiries: List[ExpiryResponseSchema] -@dataclass -class PrivateTransferPositionParamsSchema: +class PrivateTransferPositionParamsSchema(Struct): maker_params: TradeModuleParamsSchema taker_params: TradeModuleParamsSchema wallet: str -@dataclass -class PrivateTransferPositionResultSchema: +class PrivateTransferPositionResultSchema(Struct): maker_order: OrderResponseSchema maker_trade: TradeResponseSchema taker_order: OrderResponseSchema taker_trade: TradeResponseSchema -@dataclass -class PublicDepositDebugResponseSchema: +class PublicDepositDebugResponseSchema(Struct): id: Union[str, int] result: PublicDepositDebugResultSchema -@dataclass -class PrivateGetOpenOrdersResponseSchema: +class PrivateGetOpenOrdersResponseSchema(Struct): id: Union[str, int] result: PrivateGetOpenOrdersResultSchema -@dataclass -class PrivateTransferErc20ParamsSchema: +class PrivateTransferErc20ParamsSchema(Struct): recipient_details: SignatureDetailsSchema recipient_subaccount_id: int sender_details: SignatureDetailsSchema @@ -2096,43 +1880,36 @@ class PrivateTransferErc20ParamsSchema: transfer: TransferDetailsSchema -@dataclass -class PrivateTransferErc20ResponseSchema: +class PrivateTransferErc20ResponseSchema(Struct): id: Union[str, int] result: PrivateTransferErc20ResultSchema -@dataclass -class PrivateRegisterScopedSessionKeyResponseSchema: +class PrivateRegisterScopedSessionKeyResponseSchema(Struct): id: Union[str, int] result: PrivateRegisterScopedSessionKeyResultSchema -@dataclass class PublicGetCurrencyResultSchema(CurrencyDetailedResponseSchema): pass -@dataclass -class PrivateLiquidateResponseSchema: +class PrivateLiquidateResponseSchema(Struct): id: Union[str, int] result: PrivateLiquidateResultSchema -@dataclass -class PrivateGetSubaccountValueHistoryResultSchema: +class PrivateGetSubaccountValueHistoryResultSchema(Struct): subaccount_id: int subaccount_value_history: List[SubAccountValueHistoryResponseSchema] -@dataclass -class PublicGetMakerProgramsResponseSchema: +class PublicGetMakerProgramsResponseSchema(Struct): id: Union[str, int] result: List[ProgramResponseSchema] -@dataclass -class SignedTradeOrderSchema: +class SignedTradeOrderSchema(Struct): data: TradeModuleDataSchema expiry: int is_atomic_signing: bool @@ -2144,34 +1921,28 @@ class SignedTradeOrderSchema: subaccount_id: int -@dataclass -class PrivateGetInterestHistoryResultSchema: +class PrivateGetInterestHistoryResultSchema(Struct): events: List[InterestPaymentSchema] -@dataclass -class PrivateGetDepositHistoryResultSchema: +class PrivateGetDepositHistoryResultSchema(Struct): events: List[DepositSchema] -@dataclass -class PrivateGetMmpConfigResponseSchema: +class PrivateGetMmpConfigResponseSchema(Struct): id: Union[str, int] result: List[MMPConfigResultSchema] -@dataclass -class PrivateSessionKeysResultSchema: +class PrivateSessionKeysResultSchema(Struct): public_session_keys: List[SessionKeyResponseSchema] -@dataclass class InstrumentPublicResponseSchema(PublicGetInstrumentResultSchema): pass -@dataclass -class PrivateGetSubaccountResultSchema: +class PrivateGetSubaccountResultSchema(Struct): collaterals: List[CollateralResponseSchema] collaterals_initial_margin: Decimal collaterals_maintenance_margin: Decimal @@ -2193,148 +1964,123 @@ class PrivateGetSubaccountResultSchema: subaccount_value: Decimal -@dataclass -class PublicGetInstrumentResponseSchema: +class PublicGetInstrumentResponseSchema(Struct): id: Union[str, int] result: PublicGetInstrumentResultSchema -@dataclass -class PublicExecuteQuoteDebugResponseSchema: +class PublicExecuteQuoteDebugResponseSchema(Struct): id: Union[str, int] result: PublicExecuteQuoteDebugResultSchema -@dataclass -class PrivateGetCollateralsResponseSchema: +class PrivateGetCollateralsResponseSchema(Struct): id: Union[str, int] result: PrivateGetCollateralsResultSchema -@dataclass -class PrivatePollQuotesResultSchema: - pagination: PaginationInfoSchema +class PrivatePollQuotesResultSchema(Struct): quotes: List[QuoteResultPublicSchema] + pagination: PaginationInfoSchema | None = None -@dataclass -class PrivateGetMarginParamsSchema: +class PrivateGetMarginParamsSchema(Struct): subaccount_id: int simulated_collateral_changes: Optional[List[SimulatedCollateralSchema]] = None simulated_position_changes: Optional[List[SimulatedPositionSchema]] = None -@dataclass -class PrivateGetMarginResponseSchema: +class PrivateGetMarginResponseSchema(Struct): id: Union[str, int] result: PrivateGetMarginResultSchema -@dataclass -class PublicBuildRegisterSessionKeyTxResponseSchema: +class PublicBuildRegisterSessionKeyTxResponseSchema(Struct): id: Union[str, int] result: PublicBuildRegisterSessionKeyTxResultSchema -@dataclass -class PrivateCancelTriggerOrderResponseSchema: +class PrivateCancelTriggerOrderResponseSchema(Struct): id: Union[str, int] result: PrivateCancelTriggerOrderResultSchema -@dataclass -class PrivateGetOrderResponseSchema: +class PrivateGetOrderResponseSchema(Struct): id: Union[str, int] result: PrivateGetOrderResultSchema -@dataclass -class PrivateGetWithdrawalHistoryResultSchema: +class PrivateGetWithdrawalHistoryResultSchema(Struct): events: List[WithdrawalSchema] -@dataclass -class PublicGetLiveIncidentsResultSchema: +class PublicGetLiveIncidentsResultSchema(Struct): incidents: List[IncidentResponseSchema] -@dataclass -class PrivateGetQuotesResponseSchema: +class PrivateGetQuotesResponseSchema(Struct): id: Union[str, int] result: PrivateGetQuotesResultSchema -@dataclass -class PrivateGetPositionsResponseSchema: +class PrivateGetPositionsResponseSchema(Struct): id: Union[str, int] result: PrivateGetPositionsResultSchema -@dataclass -class PrivateGetOptionSettlementHistoryResultSchema: +class PrivateGetOptionSettlementHistoryResultSchema(Struct): settlements: List[OptionSettlementResponseSchema] subaccount_id: int -@dataclass -class PublicDeregisterSessionKeyResponseSchema: +class PublicDeregisterSessionKeyResponseSchema(Struct): id: Union[str, int] result: PublicDeregisterSessionKeyResultSchema -@dataclass -class PublicGetVaultShareResultSchema: - pagination: PaginationInfoSchema +class PublicGetVaultShareResultSchema(Struct): vault_shares: List[VaultShareResponseSchema] + pagination: PaginationInfoSchema | None = None -@dataclass -class PrivateExpiredAndCancelledHistoryResponseSchema: +class PrivateExpiredAndCancelledHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateExpiredAndCancelledHistoryResultSchema -@dataclass -class PrivateEditSessionKeyResponseSchema: +class PrivateEditSessionKeyResponseSchema(Struct): id: Union[str, int] result: PrivateEditSessionKeyResultSchema -@dataclass -class PublicGetAllCurrenciesResponseSchema: +class PublicGetAllCurrenciesResponseSchema(Struct): id: Union[str, int] result: List[CurrencyDetailedResponseSchema] -@dataclass -class PrivateCancelByLabelResponseSchema: +class PrivateCancelByLabelResponseSchema(Struct): id: Union[str, int] result: PrivateCancelByLabelResultSchema -@dataclass -class PublicWithdrawDebugResponseSchema: +class PublicWithdrawDebugResponseSchema(Struct): id: Union[str, int] result: PublicWithdrawDebugResultSchema -@dataclass -class PublicGetMarginResponseSchema: +class PublicGetMarginResponseSchema(Struct): id: Union[str, int] result: PublicGetMarginResultSchema -@dataclass -class PrivateGetSubaccountsResponseSchema: +class PrivateGetSubaccountsResponseSchema(Struct): id: Union[str, int] result: PrivateGetSubaccountsResultSchema -@dataclass -class RFQResultPublicSchema: +class RFQResultPublicSchema(Struct): cancel_reason: CancelReason creation_timestamp: int - filled_direction: Optional[Direction] filled_pct: Decimal last_update_timestamp: int legs: List[LegUnpricedSchema] @@ -2342,62 +2088,54 @@ class RFQResultPublicSchema: rfq_id: str status: Status subaccount_id: int - total_cost: Optional[Decimal] valid_until: int + filled_direction: Optional[Direction] = None + total_cost: Optional[Decimal] = None -@dataclass -class PrivateWithdrawResponseSchema: +class PrivateWithdrawResponseSchema(Struct): id: Union[str, int] result: PrivateWithdrawResultSchema -@dataclass -class PrivateUpdateNotificationsResponseSchema: +class PrivateUpdateNotificationsResponseSchema(Struct): id: Union[str, int] result: PrivateUpdateNotificationsResultSchema -@dataclass -class PrivateGetTradeHistoryResponseSchema: +class PrivateGetTradeHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetTradeHistoryResultSchema -@dataclass -class PrivateOrderResponseSchema: +class PrivateOrderResponseSchema(Struct): id: Union[str, int] result: PrivateOrderResultSchema -@dataclass -class PublicGetInterestRateHistoryResultSchema: +class PublicGetInterestRateHistoryResultSchema(Struct): interest_rates: List[InterestRateHistoryResponseSchema] - pagination: PaginationInfoSchema + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicGetOptionSettlementHistoryResponseSchema: +class PublicGetOptionSettlementHistoryResponseSchema(Struct): id: Union[str, int] result: PublicGetOptionSettlementHistoryResultSchema -@dataclass -class PublicGetMakerProgramScoresResultSchema: +class PublicGetMakerProgramScoresResultSchema(Struct): program: ProgramResponseSchema scores: List[ScoreBreakdownSchema] total_score: Decimal total_volume: Decimal -@dataclass -class PrivateGetOrdersResponseSchema: +class PrivateGetOrdersResponseSchema(Struct): id: Union[str, int] result: PrivateGetOrdersResultSchema -@dataclass -class PublicGetTickerResultSchema: +class PublicGetTickerResultSchema(Struct): amount_step: Decimal base_asset_address: str base_asset_sub_id: str @@ -2407,7 +2145,6 @@ class PublicGetTickerResultSchema: best_ask_price: Decimal best_bid_amount: Decimal best_bid_price: Decimal - erc20_details: Optional[ERC20PublicDetailsSchema] fifo_min_allocation: Decimal five_percent_ask_depth: Decimal five_percent_bid_depth: Decimal @@ -2422,9 +2159,6 @@ class PublicGetTickerResultSchema: min_price: Decimal minimum_amount: Decimal open_interest: Dict[str, List[OpenInterestStatsSchema]] - option_details: Optional[OptionPublicDetailsSchema] - option_pricing: Optional[OptionPricingSchema] - perp_details: Optional[PerpPublicDetailsSchema] pro_rata_amount_step: Decimal pro_rata_fraction: Decimal quote_currency: str @@ -2434,76 +2168,69 @@ class PublicGetTickerResultSchema: taker_fee_rate: Decimal tick_size: Decimal timestamp: int + erc20_details: Optional[ERC20PublicDetailsSchema] = None + option_details: Optional[OptionPublicDetailsSchema] = None + option_pricing: Optional[OptionPricingSchema] = None + perp_details: Optional[PerpPublicDetailsSchema] = None mark_price_fee_rate_cap: Optional[Decimal] = None -@dataclass -class PrivateGetFundingHistoryResultSchema: +class PrivateGetFundingHistoryResultSchema(Struct): events: List[FundingPaymentSchema] - pagination: PaginationInfoSchema + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicGetSpotFeedHistoryResultSchema: +class PublicGetSpotFeedHistoryResultSchema(Struct): currency: str spot_feed_history: List[SpotFeedHistoryResponseSchema] -@dataclass -class PrivateSetMmpConfigResponseSchema: +class PrivateSetMmpConfigResponseSchema(Struct): id: Union[str, int] result: PrivateSetMmpConfigResultSchema -@dataclass -class PublicGetFundingRateHistoryResultSchema: +class PublicGetFundingRateHistoryResultSchema(Struct): funding_rate_history: List[FundingRateSchema] -@dataclass -class PrivateGetNotificationsResultSchema: +class PrivateGetNotificationsResultSchema(Struct): notifications: List[NotificationResponseSchema] - pagination: PaginationInfoSchema + pagination: PaginationInfoSchema | None = None -@dataclass -class PrivateCancelBatchQuotesResponseSchema: +class PrivateCancelBatchQuotesResponseSchema(Struct): id: Union[str, int] result: PrivateCancelBatchQuotesResultSchema -@dataclass -class PrivateRfqGetBestQuoteResponseSchema: +class PrivateRfqGetBestQuoteResponseSchema(Struct): id: Union[str, int] result: PrivateRfqGetBestQuoteResultSchema -@dataclass -class PrivateDepositResponseSchema: +class PrivateDepositResponseSchema(Struct): id: Union[str, int] result: PrivateDepositResultSchema -@dataclass -class AuctionResultSchema: +class AuctionResultSchema(Struct): auction_id: str auction_type: AuctionType bids: List[AuctionBidEventSchema] - end_timestamp: Optional[int] fee: Decimal start_timestamp: int subaccount_id: int tx_hash: str + end_timestamp: Optional[int] = None -@dataclass -class PrivateChangeSubaccountLabelResponseSchema: +class PrivateChangeSubaccountLabelResponseSchema(Struct): id: Union[str, int] result: PrivateChangeSubaccountLabelResultSchema -@dataclass -class PublicMarginWatchResultSchema: +class PublicMarginWatchResultSchema(Struct): collaterals: List[CollateralPublicResponseSchema] currency: str initial_margin: Decimal @@ -2515,69 +2242,58 @@ class PublicMarginWatchResultSchema: valuation_timestamp: int -@dataclass -class PublicGetTransactionResponseSchema: +class PublicGetTransactionResponseSchema(Struct): id: Union[str, int] result: PublicGetTransactionResultSchema -@dataclass -class PrivateGetErc20TransferHistoryResultSchema: +class PrivateGetErc20TransferHistoryResultSchema(Struct): events: List[ERC20TransferSchema] -@dataclass -class PrivateReplaceResultSchema: +class PrivateReplaceResultSchema(Struct): cancelled_order: OrderResponseSchema create_order_error: Optional[RPCErrorFormatSchema] = None order: Optional[OrderResponseSchema] = None trades: Optional[List[TradeResponseSchema]] = None -@dataclass -class PublicGetTradeHistoryResultSchema: - pagination: PaginationInfoSchema +class PublicGetTradeHistoryResultSchema(Struct): trades: List[TradeSettledPublicResponseSchema] + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicSendQuoteDebugResponseSchema: +class PublicSendQuoteDebugResponseSchema(Struct): id: Union[str, int] result: PublicSendQuoteDebugResultSchema -@dataclass -class PrivateGetOrderHistoryResponseSchema: +class PrivateGetOrderHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetOrderHistoryResultSchema -@dataclass -class PrivateCancelBatchRfqsResponseSchema: +class PrivateCancelBatchRfqsResponseSchema(Struct): id: Union[str, int] result: PrivateCancelBatchRfqsResultSchema -@dataclass -class PrivateExecuteQuoteResponseSchema: +class PrivateExecuteQuoteResponseSchema(Struct): id: Union[str, int] result: PrivateExecuteQuoteResultSchema -@dataclass -class PublicCreateSubaccountDebugResponseSchema: +class PublicCreateSubaccountDebugResponseSchema(Struct): id: Union[str, int] result: PublicCreateSubaccountDebugResultSchema -@dataclass -class PrivateGetLiquidationHistoryResponseSchema: +class PrivateGetLiquidationHistoryResponseSchema(Struct): id: Union[str, int] result: List[AuctionResultSchema] -@dataclass -class ForwardFeedDataSchema: +class ForwardFeedDataSchema(Struct): confidence: Decimal currency: str deadline: int @@ -2589,8 +2305,7 @@ class ForwardFeedDataSchema: timestamp: int -@dataclass -class VolFeedDataSchema: +class VolFeedDataSchema(Struct): confidence: Decimal currency: str deadline: int @@ -2600,8 +2315,7 @@ class VolFeedDataSchema: vol_data: VolSVIParamDataSchema -@dataclass -class PublicGetReferralPerformanceResultSchema: +class PublicGetReferralPerformanceResultSchema(Struct): fee_share_percentage: Decimal referral_code: str rewards: Dict[str, Dict[str, Dict[str, ReferralPerformanceByInstrumentTypeSchema]]] @@ -2611,80 +2325,67 @@ class PublicGetReferralPerformanceResultSchema: total_referred_fees: Decimal -@dataclass -class PrivateCreateSubaccountResponseSchema: +class PrivateCreateSubaccountResponseSchema(Struct): id: Union[str, int] result: PrivateCreateSubaccountResultSchema -@dataclass -class PrivateCancelResponseSchema: +class PrivateCancelResponseSchema(Struct): id: Union[str, int] result: PrivateCancelResultSchema -@dataclass -class PublicGetSpotFeedHistoryCandlesResultSchema: +class PublicGetSpotFeedHistoryCandlesResultSchema(Struct): currency: str spot_feed_history: List[SpotFeedHistoryCandlesResponseSchema] -@dataclass -class PrivateGetRfqsResultSchema: - pagination: PaginationInfoSchema +class PrivateGetRfqsResultSchema(Struct): rfqs: List[RFQResultSchema] + pagination: PaginationInfoSchema | None = None -@dataclass -class PrivateCancelByNonceResponseSchema: +class PrivateCancelByNonceResponseSchema(Struct): id: Union[str, int] result: PrivateCancelByNonceResultSchema -@dataclass -class PrivateGetSubaccountResponseSchema: +class PrivateGetSubaccountResponseSchema(Struct): id: Union[str, int] result: PrivateGetSubaccountResultSchema -@dataclass -class PrivateSendRfqResponseSchema: +class PrivateSendRfqResponseSchema(Struct): id: Union[str, int] result: PrivateSendRfqResultSchema -@dataclass -class PublicStatisticsResponseSchema: +class PublicStatisticsResponseSchema(Struct): id: Union[str, int] result: PublicStatisticsResultSchema -@dataclass -class PublicGetAllInstrumentsResultSchema: +class PublicGetAllInstrumentsResultSchema(Struct): instruments: List[InstrumentPublicResponseSchema] - pagination: PaginationInfoSchema + pagination: PaginationInfoSchema | None = None -@dataclass -class PrivateGetLiquidatorHistoryResponseSchema: +class PrivateGetLiquidatorHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetLiquidatorHistoryResultSchema -@dataclass -class PublicRegisterSessionKeyResponseSchema: +class PublicRegisterSessionKeyResponseSchema(Struct): id: Union[str, int] result: PublicRegisterSessionKeyResultSchema -@dataclass -class PublicGetVaultBalancesResponseSchema: +class PublicGetVaultBalancesResponseSchema(Struct): id: Union[str, int] result: List[VaultBalanceResponseSchema] -@dataclass -class PrivateGetAccountResultSchema: +class PrivateGetAccountResultSchema(Struct): cancel_on_disconnect: bool fee_info: AccountFeeInfoSchema is_rfq_maker: bool @@ -2698,63 +2399,53 @@ class PrivateGetAccountResultSchema: referral_code: Optional[str] = None -@dataclass -class PrivateCancelQuoteResponseSchema: +class PrivateCancelQuoteResponseSchema(Struct): id: Union[str, int] result: PrivateCancelQuoteResultSchema -@dataclass -class PrivateCancelByInstrumentResponseSchema: +class PrivateCancelByInstrumentResponseSchema(Struct): id: Union[str, int] result: PrivateCancelByInstrumentResultSchema -@dataclass -class PrivateSendQuoteResponseSchema: +class PrivateSendQuoteResponseSchema(Struct): id: Union[str, int] result: PrivateSendQuoteResultSchema -@dataclass -class PrivateTransferPositionsParamsSchema: +class PrivateTransferPositionsParamsSchema(Struct): maker_params: SignedQuoteParamsSchema taker_params: SignedQuoteParamsSchema wallet: str -@dataclass -class PrivateTransferPositionsResponseSchema: +class PrivateTransferPositionsResponseSchema(Struct): id: Union[str, int] result: PrivateTransferPositionsResultSchema -@dataclass -class PublicGetOptionSettlementPricesResponseSchema: +class PublicGetOptionSettlementPricesResponseSchema(Struct): id: Union[str, int] result: PublicGetOptionSettlementPricesResultSchema -@dataclass -class PrivateTransferPositionResponseSchema: +class PrivateTransferPositionResponseSchema(Struct): id: Union[str, int] result: PrivateTransferPositionResultSchema -@dataclass -class PublicGetCurrencyResponseSchema: +class PublicGetCurrencyResponseSchema(Struct): id: Union[str, int] result: PublicGetCurrencyResultSchema -@dataclass -class PrivateGetSubaccountValueHistoryResponseSchema: +class PrivateGetSubaccountValueHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetSubaccountValueHistoryResultSchema -@dataclass -class PrivateOrderDebugResultSchema: +class PrivateOrderDebugResultSchema(Struct): action_hash: str encoded_data: str encoded_data_hashed: str @@ -2762,146 +2453,122 @@ class PrivateOrderDebugResultSchema: typed_data_hash: str -@dataclass -class PrivateGetInterestHistoryResponseSchema: +class PrivateGetInterestHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetInterestHistoryResultSchema -@dataclass -class PrivateGetDepositHistoryResponseSchema: +class PrivateGetDepositHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetDepositHistoryResultSchema -@dataclass -class PrivateSessionKeysResponseSchema: +class PrivateSessionKeysResponseSchema(Struct): id: Union[str, int] result: PrivateSessionKeysResultSchema -@dataclass -class PublicGetInstrumentsResponseSchema: +class PublicGetInstrumentsResponseSchema(Struct): id: Union[str, int] result: List[InstrumentPublicResponseSchema] -@dataclass -class PrivateGetAllPortfoliosResponseSchema: +class PrivateGetAllPortfoliosResponseSchema(Struct): id: Union[str, int] result: List[PrivateGetSubaccountResultSchema] -@dataclass -class PrivatePollQuotesResponseSchema: +class PrivatePollQuotesResponseSchema(Struct): id: Union[str, int] result: PrivatePollQuotesResultSchema -@dataclass -class PrivateGetWithdrawalHistoryResponseSchema: +class PrivateGetWithdrawalHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetWithdrawalHistoryResultSchema -@dataclass -class PublicGetLiveIncidentsResponseSchema: +class PublicGetLiveIncidentsResponseSchema(Struct): id: Union[str, int] result: PublicGetLiveIncidentsResultSchema -@dataclass -class PrivateGetOptionSettlementHistoryResponseSchema: +class PrivateGetOptionSettlementHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetOptionSettlementHistoryResultSchema -@dataclass -class PublicGetVaultShareResponseSchema: +class PublicGetVaultShareResponseSchema(Struct): id: Union[str, int] result: PublicGetVaultShareResultSchema -@dataclass -class PrivatePollRfqsResultSchema: - pagination: PaginationInfoSchema +class PrivatePollRfqsResultSchema(Struct): rfqs: List[RFQResultPublicSchema] + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicGetInterestRateHistoryResponseSchema: +class PublicGetInterestRateHistoryResponseSchema(Struct): id: Union[str, int] result: PublicGetInterestRateHistoryResultSchema -@dataclass -class PublicGetMakerProgramScoresResponseSchema: +class PublicGetMakerProgramScoresResponseSchema(Struct): id: Union[str, int] result: PublicGetMakerProgramScoresResultSchema -@dataclass -class PublicGetTickerResponseSchema: +class PublicGetTickerResponseSchema(Struct): id: Union[str, int] result: PublicGetTickerResultSchema -@dataclass -class PrivateGetFundingHistoryResponseSchema: +class PrivateGetFundingHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetFundingHistoryResultSchema -@dataclass -class PublicGetSpotFeedHistoryResponseSchema: +class PublicGetSpotFeedHistoryResponseSchema(Struct): id: Union[str, int] result: PublicGetSpotFeedHistoryResultSchema -@dataclass -class PublicGetFundingRateHistoryResponseSchema: +class PublicGetFundingRateHistoryResponseSchema(Struct): id: Union[str, int] result: PublicGetFundingRateHistoryResultSchema -@dataclass -class PrivateGetNotificationsResponseSchema: +class PrivateGetNotificationsResponseSchema(Struct): id: Union[str, int] result: PrivateGetNotificationsResultSchema -@dataclass -class PublicGetLiquidationHistoryResultSchema: +class PublicGetLiquidationHistoryResultSchema(Struct): auctions: List[AuctionResultSchema] - pagination: PaginationInfoSchema + pagination: PaginationInfoSchema | None = None -@dataclass -class PublicMarginWatchResponseSchema: +class PublicMarginWatchResponseSchema(Struct): id: Union[str, int] result: PublicMarginWatchResultSchema -@dataclass -class PrivateGetErc20TransferHistoryResponseSchema: +class PrivateGetErc20TransferHistoryResponseSchema(Struct): id: Union[str, int] result: PrivateGetErc20TransferHistoryResultSchema -@dataclass -class PrivateReplaceResponseSchema: +class PrivateReplaceResponseSchema(Struct): id: Union[str, int] result: PrivateReplaceResultSchema -@dataclass -class PublicGetTradeHistoryResponseSchema: +class PublicGetTradeHistoryResponseSchema(Struct): id: Union[str, int] result: PublicGetTradeHistoryResultSchema -@dataclass -class PublicGetLatestSignedFeedsResultSchema: +class PublicGetLatestSignedFeedsResultSchema(Struct): fwd_data: Dict[str, Dict[str, ForwardFeedDataSchema]] perp_data: Dict[str, Dict[str, PerpFeedDataSchema]] rate_data: Dict[str, Dict[str, RateFeedDataSchema]] @@ -2909,55 +2576,46 @@ class PublicGetLatestSignedFeedsResultSchema: vol_data: Dict[str, Dict[str, VolFeedDataSchema]] -@dataclass -class PublicGetReferralPerformanceResponseSchema: +class PublicGetReferralPerformanceResponseSchema(Struct): id: Union[str, int] result: PublicGetReferralPerformanceResultSchema -@dataclass -class PublicGetSpotFeedHistoryCandlesResponseSchema: +class PublicGetSpotFeedHistoryCandlesResponseSchema(Struct): id: Union[str, int] result: PublicGetSpotFeedHistoryCandlesResultSchema -@dataclass -class PrivateGetRfqsResponseSchema: +class PrivateGetRfqsResponseSchema(Struct): id: Union[str, int] result: PrivateGetRfqsResultSchema -@dataclass -class PublicGetAllInstrumentsResponseSchema: +class PublicGetAllInstrumentsResponseSchema(Struct): id: Union[str, int] result: PublicGetAllInstrumentsResultSchema -@dataclass -class PrivateGetAccountResponseSchema: +class PrivateGetAccountResponseSchema(Struct): id: Union[str, int] result: PrivateGetAccountResultSchema -@dataclass -class PrivateOrderDebugResponseSchema: +class PrivateOrderDebugResponseSchema(Struct): id: Union[str, int] result: PrivateOrderDebugResultSchema -@dataclass -class PrivatePollRfqsResponseSchema: +class PrivatePollRfqsResponseSchema(Struct): id: Union[str, int] result: PrivatePollRfqsResultSchema -@dataclass -class PublicGetLiquidationHistoryResponseSchema: +class PublicGetLiquidationHistoryResponseSchema(Struct): id: Union[str, int] result: PublicGetLiquidationHistoryResultSchema -@dataclass -class PublicGetLatestSignedFeedsResponseSchema: +class PublicGetLatestSignedFeedsResponseSchema(Struct): id: Union[str, int] result: PublicGetLatestSignedFeedsResultSchema diff --git a/derive_client/data/rpc_endpoints.yaml b/derive_client/data/rpc_endpoints.yaml index d5b722a7..06c025f3 100644 --- a/derive_client/data/rpc_endpoints.yaml +++ b/derive_client/data/rpc_endpoints.yaml @@ -22,7 +22,6 @@ BASE: - https://base.llamarpc.com - https://mainnet.base.org - https://base-rpc.publicnode.com - - https://0xrpc.io/base - https://base.therpc.io - https://base-pokt.nodies.app # - https://base.api.onfinality.io/public diff --git a/derive_client/data_types/__init__.py b/derive_client/data_types/__init__.py index 5635777e..245165d7 100644 --- a/derive_client/data_types/__init__.py +++ b/derive_client/data_types/__init__.py @@ -40,6 +40,7 @@ FeeEstimate, FeeEstimates, FeeHistory, + Leg, ManagerAddress, MintableTokenData, NonMintableTokenData, @@ -66,6 +67,7 @@ "TxResult", "ChainID", "LayerZeroChainIDv2", + "Leg", "DeriveTokenAddresses", "Currency", "InstrumentType", diff --git a/derive_client/data_types/enums.py b/derive_client/data_types/enums.py index 69f34f4c..95b1d475 100644 --- a/derive_client/data_types/enums.py +++ b/derive_client/data_types/enums.py @@ -1,6 +1,6 @@ """Enums used in the derive_client module.""" -from enum import Enum, IntEnum +from enum import Enum, IntEnum, StrEnum class TxStatus(IntEnum): @@ -382,3 +382,8 @@ class DeriveJSONRPCErrorCode(IntEnum): INVALID_SWELL_SEASON = 18006 VAULT_NOT_FOUND = 18007 MAKER_PROGRAM_NOT_FOUND_19000 = 19000 + + +class OptionType(StrEnum): + CALL = "C" + PUT = "P" diff --git a/derive_client/data_types/models.py b/derive_client/data_types/models.py index 9c878ef7..e083aef6 100644 --- a/derive_client/data_types/models.py +++ b/derive_client/data_types/models.py @@ -541,7 +541,7 @@ class Leg(BaseModel): amount: float direction: OrderSide # TODO: PositionSide instrument_name: str - price: float + price: float = 0.0 class Quote(BaseModel): diff --git a/derive_client/endpoints.py b/derive_client/endpoints.py index 499404d1..c0074b90 100644 --- a/derive_client/endpoints.py +++ b/derive_client/endpoints.py @@ -49,7 +49,10 @@ def __init__(self, base_url: str): poll_quotes = Endpoint("private", "poll_quotes") cancel_rfq = Endpoint("private", "cancel_rfq") cancel_batch_rfqs = Endpoint("private", "cancel_batch_rfqs") + execute_quote = Endpoint("private", "execute_quote") send_quote = Endpoint("private", "send_quote") + poll_quotes = Endpoint("private", "poll_quotes") + execute_quote = Endpoint("private", "execute_quote") deposit = Endpoint("private", "deposit") withdraw = Endpoint("private", "withdraw") order = Endpoint("private", "order") diff --git a/derive_client/utils/__init__.py b/derive_client/utils/__init__.py index c3fc9e41..daf6005b 100644 --- a/derive_client/utils/__init__.py +++ b/derive_client/utils/__init__.py @@ -1,6 +1,7 @@ """Utils for the Derive Client package.""" from .abi import download_prod_address_abis +from .fees import rfq_max_fee from .logger import get_logger from .prod_addresses import get_prod_derive_addresses from .retry import exp_backoff_retry, get_retry_session, wait_until @@ -19,4 +20,5 @@ "from_base_units", "download_prod_address_abis", "unwrap_or_raise", + "rfq_max_fee", ] diff --git a/derive_client/utils/fees.py b/derive_client/utils/fees.py new file mode 100644 index 00000000..2b0b4a6f --- /dev/null +++ b/derive_client/utils/fees.py @@ -0,0 +1,124 @@ +"""Module for calculating the fees on Derive.""" + +# https://docs.derive.xyz/reference/fees-1 + +from decimal import Decimal +from enum import Enum + +from derive_client.data_types import InstrumentType, Leg, OrderSide + +SECONDS_PER_YEAR = 60 * 60 * 24 * 365 + + +class LegGroup(Enum): + LONG_CALLS = "long_calls" + SHORT_CALLS = "short_calls" + LONG_PUTS = "long_puts" + SHORT_PUTS = "short_puts" + PERPS = "perps" + + +def _is_box_spread(legs: list[Leg], tickers: dict) -> bool: + """ + 1. must have 4 legs + 2. all options + 3. same expiry + 4. one long call and short put at one strike price, + and one short call and a long put at another strike price + """ + + if not len(legs) == 4: + return False + + options_details = [tickers[leg.instrument_name].get("options_details") for leg in legs] + if not all(options_details): + return False + + expiries = set() + strikes = dict() + for leg, details in zip(legs, options_details): + expiries.add(details["expiry"]) + strike = details["strike"] + option_type = details["option_type"] + strikes.setdefault(strike, dict()).setdefault(option_type, set()).add(leg.direction) + + if not len(set(expiries)) == 1: + return False + + if not len(strikes) == 2: + return False + + # check we have both calls and puts at each price + if not (set(positions) == {"C", "P"} for positions in strikes.values()): + return False + + # calls must be opposite, puts must be opposite + strike1_positions, strike2_positions = strikes.values() + call1, put1 = strike1_positions["C"], strike1_positions["P"] + call2, put2 = strike2_positions["C"], strike2_positions["P"] + return call1 != call2 and put1 != put2 + + +def _classify_leg(leg: Leg, ticker: dict): + instrument_type = InstrumentType(ticker["instrument_type"]) + option_type = ticker.get("option_details", {}).get("option_type", {}) + + match instrument_type, leg.direction, option_type: + case InstrumentType.PERP, _, _: + return LegGroup.PERPS + case InstrumentType.OPTION, OrderSide.BUY, "C": + return LegGroup.LONG_CALLS + case InstrumentType.OPTION, OrderSide.SELL, "C": + return LegGroup.SHORT_CALLS + case InstrumentType.OPTION, OrderSide.BUY, "P": + return LegGroup.LONG_PUTS + case InstrumentType.OPTION, OrderSide.SELL, "P": + return LegGroup.SHORT_PUTS + case _: + raise NotImplementedError() + + +def rfq_max_fee(client, legs: list[Leg], is_taker: bool = True) -> float: + """ + Max fee ($ for the full trade). + Request will be rejected if the supplied max fee is below the estimated fee for this trade. + DeriveJSONRPCException: Derive RPC 11023: Max fee order param is too low + """ + + tickers = {} + for leg in legs: + instrument_name = leg.instrument_name + ticker = client.fetch_ticker(instrument_name=instrument_name) + tickers[instrument_name] = ticker + + if _is_box_spread(legs, tickers): + + first_ticker = tickers[legs[0]["instrument_name"]] + timestamp = int(first_ticker["timestamp"]) + expiry = int(first_ticker["option_details"]["expiry"]) + + strike1, strike2 = {Decimal(t["option_details"]["strike"]) for t in tickers.values()} + notional = abs(strike1 - strike2) + years_to_expiry = (expiry - timestamp / 1000) / SECONDS_PER_YEAR # why not use Fraction? + yield_spread_fee = notional * Decimal("0.01") * Decimal(str(years_to_expiry)) + + total_fee = yield_spread_fee + if is_taker: + total_fee += max(t["base_fee"] for t in tickers.values()) + + amounts = [Decimal(leg["amount"]) for leg in legs] + return total_fee + + # Normal multi-leg handling + for leg in legs: + ticker = tickers[leg.instrument_name] + group = _classify_leg(leg, ticker) + + base_fee = float(ticker["base_fee"]) + maker_fee_rate = float(ticker["maker_fee_rate"]) + taker_fee_rate = float(ticker["taker_fee_rate"]) + index_price = float(ticker["index_price"]) + mark_price = float(ticker["mark_price"]) + max_fee = str(base_fee + index_price * taker_fee_rate) + + return diff --git a/derive_client/utils/retry.py b/derive_client/utils/retry.py index 06498b0a..c80d9083 100644 --- a/derive_client/utils/retry.py +++ b/derive_client/utils/retry.py @@ -123,6 +123,4 @@ def is_retryable(e: RequestException) -> bool: status = getattr(e.response, "status_code", None) if status in RETRY_STATUS_CODES: return True - if isinstance(e, RETRY_EXCEPTIONS): - return True - return False + return bool(isinstance(e, RETRY_EXCEPTIONS)) diff --git a/examples/rfq_trading_flow.py b/examples/rfq_trading_flow.py new file mode 100644 index 00000000..a0c15367 --- /dev/null +++ b/examples/rfq_trading_flow.py @@ -0,0 +1,175 @@ +""" +Complete RFQ (Request for Quote) trading flow demonstration. + +This example shows: +1. Maker creating and posting quotes +2. Taker discovering and requesting quotes +3. Price comparison with Deribit +4. Complete trade execution +""" + +from rich import print + +from derive_client.data_types import Currency, Environment, InstrumentType, OrderSide +from derive_client.derive import DeriveClient +from tests.conftest import TEST_PRIVATE_KEY, TEST_WALLET + + +def setup_clients(): + """Setup separate clients for maker and taker roles""" + + maker_client = DeriveClient(wallet=TEST_WALLET, private_key=TEST_PRIVATE_KEY, env=Environment.TEST) + taker_client = DeriveClient(wallet=TEST_WALLET, private_key=TEST_PRIVATE_KEY, env=Environment.TEST) + + maker_client.subaccount_id = maker_client.subaccount_ids[0] + taker_client.subaccount_id = taker_client.subaccount_ids[1] + + return maker_client, taker_client + + +def create_demo_rfq(client): + """Helper function to create a demo RFQ for maker flow demonstration""" + print(" Creating demo RFQ...") + + # Get some active ETH options + markets = client.fetch_instruments(instrument_type=InstrumentType.OPTION, currency=Currency.ETH) + active_markets = [m for m in markets if m.get('is_active')] + + if len(active_markets) < 2: + raise ValueError("Need at least 2 active markets for demo") + + breakpoint() + + # Create simple two-leg RFQ + leg_1 = { + 'instrument_name': active_markets[0]['instrument_name'], + 'amount': 0.5, # Smaller amount for demo + 'direction': OrderSide.BUY.value, + } + leg_2 = {'instrument_name': active_markets[1]['instrument_name'], 'amount': 0.5, 'direction': OrderSide.SELL.value} + + rfq_data = { + 'subaccount_id': client.subaccount_id, + 'legs': sorted([leg_1, leg_2], key=lambda x: x['instrument_name']), # Sort by name + } + + rfq_result = client.send_rfq(rfq_data) + print(f" Demo RFQ created: {rfq_result['rfq_id'][:8]}...") + + return rfq_result + + +def demonstrate_maker_flow(client): + """Show maker creating and posting quotes for incoming RFQs""" + print("\n[bold blue]MAKER FLOW - Market Making Operations[/bold blue]") + + # Step 1: Check for incoming RFQs + print("1. Polling for incoming RFQs...") + rfq_response = client.poll_rfqs() + rfqs = rfq_response.get('rfqs', []) + + if not rfqs: + print(" [yellow]No active RFQs found. In a real scenario, you would wait for RFQs.[/yellow]") + print(" [dim]For demonstration, we'll create our own RFQ first...[/dim]") + + # Create a sample RFQ for demo purposes + demo_rfq = create_demo_rfq(client) + rfqs = [demo_rfq] + + print(f" Found {len(rfqs)} active RFQ(s)") + + # Step 2: Analyze the first RFQ + target_rfq = rfqs[0] + print(f"\n2. Analyzing RFQ {target_rfq['rfq_id'][:8]}...") + print(f" - Legs: {len(target_rfq['legs'])}") + for i, leg in enumerate(target_rfq['legs']): + print(f" Leg {i+1}: {leg['direction']} {leg['amount']} {leg['instrument_name']}") + + # Step 3: Calculate fair prices for each leg + print("\n3. Calculating fair prices based on market data...") + legs_with_prices = [] + + for leg in target_rfq['legs']: + # Get current market data + ticker = client.fetch_ticker(leg['instrument_name']) + mark_price = float(ticker['mark_price']) + + # Simple pricing logic (in practice, this would be more sophisticated) + if leg['direction'] == 'buy': + # If RFQ wants to buy, we sell - price slightly above mark + our_price = mark_price * 1.02 # 2% markup + else: + # If RFQ wants to sell, we buy - price slightly below mark + our_price = mark_price * 0.98 # 2% discount + + # Round to tick size + tick_size = float(ticker['tick_size']) + our_price = round(our_price / tick_size) * tick_size + + leg_with_price = { + 'instrument_name': leg['instrument_name'], + 'amount': leg['amount'], + 'direction': leg['direction'], + 'price': our_price, + } + legs_with_prices.append(leg_with_price) + + print(f" {leg['instrument_name']}: Mark ${mark_price:.2f} → Our Quote ${our_price:.2f}") + + # Step 4: Create and submit quote + print(f"\n4. Submitting quote for RFQ {target_rfq['rfq_id'][:8]}...") + + try: + quote = client.create_quote( + rfq_id=target_rfq['rfq_id'], legs=legs_with_prices, direction="sell" # We're selling to the RFQ creator + ) + + print(f" [green]✓[/green] Quote created successfully!") + print(f" Quote ID: {quote['quote_id'][:8]}...") + print(f" Status: {quote['status']}") + print(f" Direction: {quote['direction']}") + + # Step 5: Monitor quote status + print("\n5. Quote submitted - waiting for potential execution...") + print(" [dim]In practice, you would monitor for execution or expiry[/dim]") + + return quote + + except Exception as e: + raise + print(f" [red]✗[/red] Failed to create quote: {e}") + return None + + +def demonstrate_taker_flow(client, quote_id): + """Show taker requesting and accepting quotes""" + print("\n[bold green]TAKER FLOW[/bold green]") + + +def compare_with_deribit(instrument_name): + """Compare pricing with Deribit for reference""" + print("\n[bold yellow]PRICE COMPARISON[/bold yellow]") + + +def main(): + """ + Complete RFQ trading demonstration + """ + print("[bold]RFQ Trading Flow Demonstration[/bold]") + + maker_client, taker_client = setup_clients() + + # 1. Maker creates quote + quote = demonstrate_maker_flow(maker_client) + + # 2. Price comparison + compare_with_deribit(quote['instrument_name']) + + # 3. Taker accepts quote + trade = demonstrate_taker_flow(taker_client, quote['quote_id']) + + print(f"\n[bold green]Trade completed: {trade}[/bold green]") + + +if __name__ == "__main__": + main() diff --git a/examples/rfqs/create_rfq.py b/examples/rfqs/create_rfq.py index 88f80c97..08f186a2 100644 --- a/examples/rfqs/create_rfq.py +++ b/examples/rfqs/create_rfq.py @@ -3,60 +3,306 @@ """ import json +import sys from datetime import datetime +from decimal import Decimal +from enum import Enum +from time import sleep + +import rich_click as click +from ccxt import deribit +from derive_action_signing.module_data import RFQExecuteModuleData, RFQQuoteDetails from derive_client import DeriveClient from derive_client.data_types import Environment from derive_client.data_types.enums import InstrumentType, OrderSide, UnderlyingCurrency -from tests.conftest import TEST_PRIVATE_KEY, TEST_WALLET -from tests.test_rfq import Leg, Rfq +from tests.conftest import OWNER_TEST_WALLET, TEST_PRIVATE_KEY + + +class TxStatus(Enum): + """Transaction status enum.""" + + PENDING = 'pending' + REVERTED = 'reverted' + REQUESTED = 'requested' + + +deribit_client = deribit() + SLEEP_TIME = 1 -def main(): +@click.group() +def rfq(): + """RFQ related commands.""" + pass + + +@rfq.command(help="Create an RFQ and poll for quotes") +@click.option( + '-s', + '--side', + type=click.Choice(['buy', 'sell'], case_sensitive=False), + required=True, + help="Side of the RFQ (buy or sell)", +) +@click.option( + '-a', + '--amount', + type=click.FLOAT, + required=False, + default=1.0, + help="Amount of the Leg of the RFQ", +) +@click.option( + '-i', + '--instrument', + type=click.STRING, + required=False, + default=None, + help="Instrument name to use for the RFQ (e.g. ETH-30JUN23-1500-C)", +) +@click.option( + '-it', + '--instrument-type', + type=InstrumentType, + required=False, + default=InstrumentType.OPTION, + help="Instrument name to use for the RFQ (e.g. ETH-30JUN23-1500-C)", +) +def create(side: str, amount: float, instrument: str, instrument_type: InstrumentType = InstrumentType.OPTION): """ Sample of polling for RFQs and printing their status. """ client: DeriveClient = DeriveClient( private_key=TEST_PRIVATE_KEY, - wallet=TEST_WALLET, + wallet=OWNER_TEST_WALLET, env=Environment.TEST, ) + client.subaccount_id = client.subaccount_ids[-1] + # we get an option market markets = client.fetch_instruments( - instrument_type=InstrumentType.OPTION, + instrument_type=instrument_type, currency=UnderlyingCurrency.ETH, expired=False, ) - sorted_markets = sorted(markets, key=lambda m: (m['option_details']['expiry'])) + if instrument: + markets = [m for m in markets if m['instrument_name'] == instrument] + if not markets: + print(f"No market found for instrument {instrument}. Please check the instrument name and try again.") + return - zero_day_markets = list( - filter(lambda m: (m['option_details']['expiry'] - datetime.utcnow().timestamp()) < (3600 * 24), sorted_markets) - ) - print("Zero day markets:") - selected_market = zero_day_markets[0] + if not instrument and instrument_type == InstrumentType.OPTION: + sorted_markets = sorted(markets, key=lambda m: (m['option_details']['expiry'])) + + zero_day_markets = list( + filter( + lambda m: (m['option_details']['expiry'] - datetime.utcnow().timestamp()) < (3600 * 24), sorted_markets + ) + ) + print(f"Found {len(zero_day_markets)} zero day markets") + selected_market = zero_day_markets[0] + expiry_time = selected_market['option_details']['expiry'] + current_time = datetime.utcnow().timestamp() + print( + f"Expiry time: {expiry_time}, current time: {current_time}, time to expiry: {(expiry_time - current_time) / 3600:.2f} hours" + ) + else: + selected_market = markets[0] print(json.dumps(selected_market, indent=2)) - print(f"Found {len(zero_day_markets)} zero day markets") - expiry_time = selected_market['option_details']['expiry'] - current_time = datetime.utcnow().timestamp() - print( - f"Expiry time: {expiry_time}, current time: {current_time}, time to expiry: {(expiry_time - current_time) / 3600:.2f} hours" - ) - # we create an rfq for this market + request_direction: OrderSide = OrderSide.BUY if side.lower() == 'buy' else OrderSide.SELL - leg = Leg(instrument_name=selected_market['instrument_name'], amount=1, direction=OrderSide.BUY) - request = Rfq( + leg = RFQQuoteDetails( + instrument_name=selected_market['instrument_name'], + amount=Decimal(str(amount)), + direction=request_direction.value, + asset_address=selected_market['base_asset_address'], + sub_id=int(selected_market['base_asset_sub_id']), + price=None, # we are willing to pay 10% more than the mark price + ) + request = RFQExecuteModuleData( + global_direction=OrderSide.BUY.value, legs=[leg], - subaccount_id=client.subaccount_id, + max_fee=Decimal(10), ) - rfq = client.send_rfq(request.model_dump()) + rfq = client.send_rfq(request.to_rfq_json()) print("RFQ created with id:", rfq['rfq_id']) + auction_duration = 5 # seconds + + start_time = datetime.utcnow().timestamp() + end_time = start_time + auction_duration + + current_quotes = [] + while True: + quotes = client.poll_quotes( + rfq_id=rfq['rfq_id'], + ) + if quotes.get('quotes'): + quotes = quotes['quotes'] + new_quotes = [q for q in quotes if q not in current_quotes] + for q in new_quotes: + on_new_quote(client, q) + current_quotes.extend(new_quotes) + # check the time + current_time = datetime.utcnow().timestamp() + if current_time > end_time: + print("Timeout reached, exiting") + break + print("Final quotes:") + current_quotes = [f for f in current_quotes if f['status'] == 'open'] + print(json.dumps(current_quotes, indent=2)) + # we now select the best price. + + def pricer(quote: dict) -> float: + """ + we need to get the total price of the quote + """ + total_price = 0.0 + for leg in quote['legs']: + total_price += float(leg['price']) * float(leg['amount']) + return total_price + + if not current_quotes: + print("No quotes received, exiting") + return + print(rfq) + ordered_quotes = sorted(current_quotes, key=lambda q: pricer(q), reverse=True) + print("Best quote is:") + print("Total quotes received:", len(ordered_quotes)) + # print(json.dumps(ordered_quotes[0], indent=2)) + print("Best price is:", pricer(ordered_quotes[0])) + + # use display a spinner for a few seconds + sleep_time = 270 + spinner = click.progressbar(length=sleep_time, label="Waiting before accepting the best quote") + + def is_quote_arbable(client: DeriveClient, quote: dict) -> bool: + """ + Check if a quote is arbable by checking the underlying index price and the mark price of the legs. + """ + leg_profits = [] + total_mark_price = 0.0 + for leg in quote['legs']: + ticker = client.fetch_ticker(leg['instrument_name']) + leg_price = float(leg['price']) + leg_amount = float(leg['amount']) + leg_quote_cost = leg_price * leg_amount + if leg['direction'] == 'sell': + price = float(ticker['best_ask_price']) + cost = price * leg_amount + total_mark_price += cost + elif leg['direction'] == 'buy': + price = float(ticker['best_bid_price']) + cost = price * leg_amount + total_mark_price += cost + + leg_profit = cost - leg_quote_cost + leg_profits.append(leg_profit) + if not total_mark_price: + return False + total_quote_price = sum(float(leg['price']) * float(leg['amount']) for leg in quote['legs']) + print(f"Total mark price: {total_mark_price}, total quote price: {total_quote_price}") + # we consider a quote arbable if the total quote price is less than 99% of the total mark price + return total_quote_price > total_mark_price if side.lower() == 'sell' else total_quote_price < total_mark_price + + for _ in range(sleep_time): + sleep(1) + spinner.update(1) + is_arbable = is_quote_arbable(client, ordered_quotes[0]) + if is_arbable: + break + print(f"Is the best quote arbable? {'Yes' if is_arbable else 'No'}") + if is_arbable: + # if accept := input("Do you want to accept this quote? (y/n): ") == 'y': + accepted_quote = client.execute_quote( + request=request, + quote=ordered_quotes[0], + rfq_id=rfq['rfq_id'], + quote_id=ordered_quotes[0]['quote_id'], + ) + print("Accepted quote:", json.dumps(accepted_quote['quote_id'], indent=2)) + is_filled = False + is_finalised = False + + # we also take the market of the leg to hedge our position + ticker = client.fetch_ticker(selected_market['instrument_name']) + price = float(ticker['best_ask_price']) if side.lower() == 'sell' else float(ticker['best_bid_price']) + print( + f"Hedging position by placing a market order for {amount} {selected_market['instrument_name']} at price {price} side {'SELL' if side.lower() == 'buy' else 'BUY'}" + ) + print(side) + order = client.create_order( + instrument_name=selected_market['instrument_name'], + amount=amount, + side=OrderSide.SELL if side.lower() == 'buy' else OrderSide.BUY, + instrument_type=InstrumentType.OPTION, + price=price, + ) + print("Placed hedge order:", order) + + while not is_filled: + polled_quote = client.poll_quotes(quote_id=accepted_quote['quote_id']) + for quote in polled_quote.get('quotes', []): + if is_filled: + break + print( + f"Quote ID: {quote['quote_id']} Status: {quote['status']}, Price: {sum(float(leg['price']) * float(leg['amount']) for leg in quote['legs'])}" + ) + if quote['status'] in ['accepted', 'expired', 'rejected', 'cancelled', "filled"]: + print(f"Quote ID: {quote['quote_id']} final status: {quote['status']}") + is_filled = quote['status'] == 'filled' + is_finalised = False + break + + print("Waiting for quote to be finalised...") + failed_status = ['reverted'] + success_status = ['settled'] + while not is_finalised: + polled_quote = client.poll_quotes(quote_id=accepted_quote['quote_id']) + for quote in polled_quote.get('quotes', []): + if is_finalised: + break + tx_hash, tx_status = quote.get('tx_hash'), quote.get('tx_status') + print( + f"Quote ID: {quote['quote_id']} Status: {quote['status']}, Tx Hash: {tx_hash}, Tx Status: {tx_status}" + ) + if tx_hash and tx_status in (success_status + failed_status): + is_finalised = True + break + if not is_finalised: + print("Waiting before next poll...") + sleep(SLEEP_TIME) + print("Quote finalised.") + + txn_hash = accepted_quote.get('tx_hash') + if quote['tx_status'] in success_status: + print("Quote executed successfully with status:", quote['tx_status']) + elif quote['tx_status'] in failed_status: + print("Quote execution failed with status:", quote['tx_status']) + sys.exit(1) + return + # 'tx_status': 'reverted', 'tx_hash': '0xcfa89b200cb144dc29d76ba3a0c56e3af04bcc04085495b701d002d958ea869b' + if txn_hash: + print("Waiting for transaction to be mined:", txn_hash) + receipt = client.w3.eth.wait_for_transaction_receipt(txn_hash, timeout=600) + print("Transaction mined:", receipt) + + else: + print("Quote not accepted, exiting") + + +def on_new_quote(derive_client: DeriveClient, quote: dict): + """ + Handle a new quote by printing it. + """ + print(f"New quote received: {quote}") if __name__ == "__main__": - main() + rfq() diff --git a/examples/rfqs/poll_rfq.py b/examples/rfqs/poll_rfq.py index 1672f8ad..2e50bc71 100644 --- a/examples/rfqs/poll_rfq.py +++ b/examples/rfqs/poll_rfq.py @@ -2,11 +2,16 @@ Example of how to poll RFQ (Request for Quote) status and handle transfers between subaccount and funding account. """ +from decimal import Decimal +from threading import Thread from time import sleep from derive_client import DeriveClient from derive_client.data_types import Environment -from tests.conftest import TEST_PRIVATE_KEY, TEST_WALLET +from derive_client.data_types.enums import RfqStatus +from derive_client.exceptions import DeriveJSONRPCException +from tests.conftest import TEST_PRIVATE_KEY +from tests.conftest import TEST_WALLET as TEST_WALLET SLEEP_TIME = 1 @@ -25,25 +30,113 @@ def main(): processed_rfqs = set() while True: - quotes = client.poll_rfqs() + rfqs = client.poll_rfqs() sleep(SLEEP_TIME) # Sleep for a while before polling again - raw_rfqs = quotes.get('rfqs', []) + raw_rfqs = rfqs.get('rfqs', []) rfqs = {rfq['rfq_id']: rfq for rfq in raw_rfqs} if not rfqs: print("No RFQs found, exiting.") - break + continue for rfq_id in rfqs: if rfq_id in processed_rfqs: continue rfq = rfqs[rfq_id] print(f"RFQ ID: {rfq_id} Status: {rfq['status']}, Legs: {len(rfq['legs'])}") processed_rfqs.add(rfq_id) + on_new_rfq(client, rfq) + for rfq in processed_rfqs.copy(): if rfq not in rfqs: print(f"RFQ ID {rfq} no longer present in polled RFQs, removing from processed list.") processed_rfqs.remove(rfq) +def on_quote_created(derive_client: DeriveClient, quote: dict): + """ + Handle a new quote by polling its status until it is accepted or expired + """ + print(f"New Quote detected: {quote['quote_id']} for RFQ: {quote['rfq_id']}, polling status...") + attempts = 10 + while True: + polled_quote = derive_client.poll_quotes(quote_id=quote['quote_id'], status=RfqStatus.OPEN) + for quote in polled_quote.get('quotes', []): + print( + f"Quote ID: {polled_quote['quote_id']} Status: {polled_quote['status']}, Price: {polled_quote['price']}" + ) + if polled_quote['status'] in ['accepted', 'expired', 'rejected', 'cancelled']: + print(f"Quote ID: {polled_quote['quote_id']} final status: {polled_quote['status']}") + break + if not polled_quote.get('quotes') and attempts < 0: + print(f"Quote ID: {quote['quote_id']} not found, exiting polling.") + break + attempts -= 1 + print(f"Waiting before next poll... for quote {quote['quote_id']}") + sleep(SLEEP_TIME) + + +def on_new_rfq(derive_client: DeriveClient, rfq: dict): + """ + Handle a new RFQ by returning a quote for the RFQ based on the index price + """ + print(f"New RFQ detected: {rfq['rfq_id']}") + + if rfq['status'] != 'open': + print(f"RFQ {rfq['rfq_id']} is not open (status: {rfq['status']}), skipping.") + return + # we check that the subaccount isnt the same as ours + if rfq['subaccount_id'] == derive_client.subaccount_id: + print(f"RFQ {rfq['rfq_id']} is from our own subaccount, skipping.") + return + print("RFQ details:") + print(rfq) + + leg_tickers = {i['instrument_name']: derive_client.fetch_ticker(i['instrument_name']) for i in rfq['legs']} + + premium_per_rfq = 0.01 # 1% premium on top of index price + premium_per_rfq = 0.0 # 1% premium on top of index price + fixed_cost_per_leg = 0.5 # $0.5 fixed cost per leg to cover fees + total_price: float = 0.0 + + quote_legs = [] + for leg in rfq['legs']: + ticker = leg_tickers[leg['instrument_name']] + print(f"Leg: {leg['instrument_name']} amount: {leg['amount']}, direction: {leg['direction']}") + + if_leg_sell = leg['direction'] == 'sell' + + if leg['direction'] == 'buy': + price = float(ticker['mark_price']) * (1 + premium_per_rfq) + fixed_cost_per_leg + elif leg['direction'] == 'sell': + price = float(ticker['mark_price']) * (1 - premium_per_rfq) + fixed_cost_per_leg + else: + print(f"Unknown leg direction: {leg['direction']}, skipping RFQ.") + return + leg_price = price * float(leg['amount']) + + leg['price'] = Decimal(f"{price:.2f}") + quote_legs.append(leg) + total_price += leg_price if if_leg_sell else -leg_price + print(f" -> Leg Price: {leg_price:.2f} USD at Price: {price:.2f} USD") + print(f"Total RFQ Price: {total_price:.2f} USD") + print("responding with quote...") + + try: + quote = derive_client.create_quote( + legs=quote_legs, + rfq_id=rfq['rfq_id'], + direction='sell', + ) + print("Quote response:", quote) + except DeriveJSONRPCException as e: + print(f"Error creating quote: {e}") + return + + print(f"Quote created: {quote['quote_id']} for RFQ: {rfq['rfq_id']} with total price: {total_price:.2f} USD") + print("Starting to poll quote status. in background...") + Thread(target=on_quote_created, args=(derive_client, quote)).start() + print("Continuing to poll for new RFQs...") + + if __name__ == "__main__": main() diff --git a/examples/websockets/websocket_quoter.py b/examples/websockets/websocket_quoter.py new file mode 100644 index 00000000..81a42767 --- /dev/null +++ b/examples/websockets/websocket_quoter.py @@ -0,0 +1,187 @@ +""" +Simple trading class for the websocket client. +""" + +import os + +from dotenv import load_dotenv +from websockets import ConnectionClosedError + +from derive_client.clients.ws_client import ( + Orderbook, + OrderResponseSchema, + Position, + Positions, + PrivateGetOrdersResultSchema, + TradeResponseSchema, + WsClient, +) +from derive_client.data.generated.models import Direction, OrderStatus +from derive_client.data_types import Environment +from derive_client.data_types.enums import OrderSide, OrderType + +MARKET_1 = "ETH-PERP" +MAX_POSTION_SIZE = 0.5 +QUOTE_SIZE = 0.1 +BUY_OFFSET = 0.99 +SELL_OFFSET = 1.01 + + +class WebsocketQuoter: + def __init__(self, ws_client: WsClient): + self.ws_client = ws_client + self.current_positions: Positions | None = None + self.current_position: Position | None = None + self.orders = { + Direction.buy: {}, + Direction.sell: {}, + } + self.pending_orders = { + Direction.buy: {}, + Direction.sell: {}, + } + + def on_orderbook_update(self, orderbook: Orderbook): + if not orderbook.bids or not orderbook.asks: + return + + if not self.current_position: + return + + bid_price = orderbook.bids[0][0] * BUY_OFFSET + ask_price = orderbook.asks[0][0] * SELL_OFFSET + + if all( + [ + self.current_position.amount <= (MAX_POSTION_SIZE - QUOTE_SIZE), + not self.orders[Direction.buy], + self.pending_orders[Direction.buy] == {}, + ] + ): + self.create_order(Direction.buy, bid_price, QUOTE_SIZE) + if all( + [ + self.current_position.amount >= -(MAX_POSTION_SIZE + QUOTE_SIZE), + not self.orders[Direction.sell], + self.pending_orders[Direction.sell] == {}, + ] + ): + self.create_order(Direction.sell, ask_price, QUOTE_SIZE) + + def create_order(self, side: OrderSide, price: float, amount: float) -> OrderResponseSchema: + order = self.ws_client.create_order( + instrument_name=MARKET_1, + side=side, + price=price, + amount=amount, + order_type=OrderType.LIMIT, + ) + self.pending_orders[side][order.nonce] = order + print(f"{side.value} order placed: {order.nonce} at {price} for {amount}") + return order + + def on_position_update(self, positions: Positions): + self.current_positions = positions + if not positions.positions: + self.current_position = Position(instrument_name=MARKET_1, amount=0) + else: + _matches = [p for p in positions.positions if p.instrument_name == MARKET_1] + self.current_position = _matches[0] if _matches else Position(instrument_name=MARKET_1, amount=0) + + pos = self.current_position + print(f"Current position: {pos.instrument_name} {pos.amount} @ {pos.average_price}") + + def on_order(self, order: OrderResponseSchema): + print(f"Order update: {order.nonce} {order.order_status} {order.direction} {order.limit_price} {order.amount}") + self.ws_client.get_positions() + if order.order_status is OrderStatus.open: + if order.nonce in self.pending_orders[order.direction]: + print(f"Moving order {order.nonce} from pending to active") + del self.pending_orders[order.direction][order.nonce] + self.orders[order.direction][order.nonce] = order + + def on_orders_update(self, orders: PrivateGetOrdersResultSchema): + print(f"Orders update: {len(orders.orders)} orders") + + for side in [Direction.buy, Direction.sell]: + side_orders = [o for o in orders.orders if o.direction == side] + self.orders[side].update({o.nonce: o for o in side_orders}) + current_orders = self.orders[side] + for ix, (nonce, order) in enumerate(current_orders.copy().items()): + if order.order_status != OrderStatus.open or ix > 0: + print(f"Removing order {nonce} from tracking") + del self.orders[side][nonce] + self.ws_client.cancel(order.order_id, MARKET_1) + + def on_trade(self, trades: TradeResponseSchema): + print(f"Trades update: {len(trades.trades)} trades") + self.ws_client.get_positions() + if self.current_position and abs(self.current_position.amount) >= MAX_POSTION_SIZE: + self.ws_client.cancel_all() + + def run_loop(self): + """ + Run the message loop. + """ + self.setup_session() + + while True: + try: + raw_message = self.ws_client.ws.recv() + except ConnectionClosedError: + print("Connection closed, exiting...") + self.setup_session() + parsed_message = self.ws_client.parse_message(raw_message) + if isinstance(parsed_message, TradeResponseSchema): + self.on_trade(parsed_message) + elif isinstance(parsed_message, Positions): + self.on_position_update(parsed_message) + elif isinstance(parsed_message, PrivateGetOrdersResultSchema): + self.on_orders_update(parsed_message) + elif isinstance(parsed_message, OrderResponseSchema): + self.on_order(parsed_message) + elif isinstance(parsed_message, Orderbook): + self.on_orderbook_update(parsed_message) + else: + print(f"Received unhandled message: {parsed_message}") + + def setup_session(self): + self.ws_client.connect_ws() + self.ws_client.login_client() + # get state data + self.ws_client.get_orders() + self.ws_client.get_positions() + # subscribe to updates + self.ws_client.subscribe_orderbook(MARKET_1) + self.ws_client.subscribe_trades() + self.ws_client.subscribe_orders() + + +def create_client_from_env() -> WsClient: + """ + Load in the client from environment variables. + """ + load_dotenv() + private_key = os.environ["ETH_PRIVATE_KEY"] + wallet = os.environ["DERIVE_WALLET"] + env = os.environ["DERIVE_ENV"] + subaccount_id = os.environ.get( + "SUBACCOUNT_ID", + ) + return WsClient( + private_key=private_key, + wallet=wallet, + env=Environment(env), + subaccount_id=subaccount_id, + ) + + +if __name__ == "__main__": + ws_client = create_client_from_env() + quoter = WebsocketQuoter(ws_client) + try: + quoter.run_loop() + except KeyboardInterrupt: + print("On keyboard interupt...") + finally: + ws_client.ws.close() diff --git a/poetry.lock b/poetry.lock index 961fda23..1706d352 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -6,7 +6,6 @@ version = "2.6.1" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -18,7 +17,6 @@ version = "3.12.15" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc"}, {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af"}, @@ -111,7 +109,6 @@ files = [ [package.dependencies] aiohappyeyeballs = ">=2.5.0" aiosignal = ">=1.4.0" -async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -119,7 +116,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "brotlicffi ; platform_python_implementation != \"CPython\""] +speedups = ["Brotli", "aiodns (>=3.3.0)", "brotlicffi"] [[package]] name = "aiolimiter" @@ -127,7 +124,6 @@ version = "1.2.1" description = "asyncio rate limiter, a leaky bucket implementation" optional = false python-versions = "<4.0,>=3.8" -groups = ["main"] files = [ {file = "aiolimiter-1.2.1-py3-none-any.whl", hash = "sha256:d3f249e9059a20badcb56b61601a83556133655c11d1eb3dd3e04ff069e5f3c7"}, {file = "aiolimiter-1.2.1.tar.gz", hash = "sha256:e02a37ea1a855d9e832252a105420ad4d15011505512a1a1d814647451b5cca9"}, @@ -139,7 +135,6 @@ version = "1.4.0" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, @@ -155,7 +150,6 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -167,7 +161,6 @@ version = "3.6.2" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591"}, {file = "argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf"}, @@ -176,38 +169,24 @@ files = [ [package.extras] test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] -[[package]] -name = "async-timeout" -version = "5.0.1" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version < \"3.11\"" -files = [ - {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, - {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, -] - [[package]] name = "attrs" version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "bitarray" @@ -215,7 +194,6 @@ version = "3.7.1" description = "efficient arrays of booleans -- C extension" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "bitarray-3.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a05982bb49c73463cb0f0f4bed2d8da82631708a2c2d1926107ba99651b419ec"}, {file = "bitarray-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d30e7daaf228e3d69cdd8b02c0dd4199cec034c4b93c80109f56f4675a6db957"}, @@ -359,7 +337,6 @@ version = "25.9.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7"}, {file = "black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92"}, @@ -392,8 +369,6 @@ packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" pytokens = ">=0.1.10" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -407,7 +382,6 @@ version = "2025.8.3" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, @@ -419,7 +393,6 @@ version = "3.4.3" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] files = [ {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, @@ -504,112 +477,111 @@ files = [ [[package]] name = "ckzg" -version = "2.1.3" +version = "2.1.5" description = "Python bindings for C-KZG-4844" optional = false python-versions = "*" -groups = ["main"] -files = [ - {file = "ckzg-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90597d18e981dcaac1c5017ea843cc96a6b30fdbefd41e4c363e26df6cd3105f"}, - {file = "ckzg-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe8673a1778102cbea878f4be1a59a3fb24d2a615bc8d00b171d2d3c0890f3ec"}, - {file = "ckzg-2.1.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90c00e14881fb9e07ad0699dae7e6fb32d8446f68426450e53e62d7fbbc91aa2"}, - {file = "ckzg-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:683661ef9e23693b18d04480d254379b36e283ec183cefa19c54e71edc0e9064"}, - {file = "ckzg-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:834b4f8ce03f8b93ef8386a693f6c0f7cb243cbc99c1e29b47cdf802ebf1750e"}, - {file = "ckzg-2.1.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a1cc6bebbc072c7ad3e65d5a60b6d35d152346ef70d1759367a17089da01e8b"}, - {file = "ckzg-2.1.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:085f8d24955a040671206cd5219e38d2150200da3df2ce9ec37eb8cdc86f58b6"}, - {file = "ckzg-2.1.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eb34b25633d41185971a9779cd11d67cfd842a71a3ea5f7766a082ad45a0c75b"}, - {file = "ckzg-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab7e00c97178a71b82405a955ff3eca0217c5bc54307d73baaa4571bc4a8d479"}, - {file = "ckzg-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a54d7f1f70915649c31d75283b866aa4999ea80702108cceea7cb913feb187c1"}, - {file = "ckzg-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1cb4e3a44c93e2828c04cf8696f21554555f213d98264019083823c4481a36a"}, - {file = "ckzg-2.1.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fb04d784512f4a3d9cef017d4f9a15b69957437f89183083fc2ea102b6f2174"}, - {file = "ckzg-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf1de42389c04cb2e898b870ec093b9c3793b0f0737fb1df96587cbbeb2bb521"}, - {file = "ckzg-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f66333c812cf9ec5b07f294abfd8f1ee95d0ac64b7d86d35f5ae0b24ebcc3d0e"}, - {file = "ckzg-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fbeb4d15fec2da0ed4d9dbd5187bbee5fe4494126defef74fb6367ffb6008fe6"}, - {file = "ckzg-2.1.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:56033219a8c27fc5a5ce23a3088452fd79d4cf8808dad333b9ab63c6c0e66029"}, - {file = "ckzg-2.1.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b5043efe61da9d10bcd110006d84019924311f1520a21d0cc7e72bb89f8db029"}, - {file = "ckzg-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d8796cb9adcfd63439bcac0fb8fc5038dac335b5b0179f9597db8c1b6b6a05f4"}, - {file = "ckzg-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:59c31e50c1d21cfc81983404da680824cc17e2b81e1c0808258d03dacac9ff66"}, - {file = "ckzg-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4c40008dad0f2998697655ffdebf1bf9993498761e77081def9b56b97825f9b5"}, - {file = "ckzg-2.1.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c1c3d192b142f92487735804c5fc7ce028e60d51011dd7041636dca7ee4bc2"}, - {file = "ckzg-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f529f0ea9812de5b2884e6a788b13b4565d5d62c9e533b200146ddb8e3ac00"}, - {file = "ckzg-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84faf26596e19e84c17a36fde4588592239820e9ce02daa0c53bd7b4bd87a340"}, - {file = "ckzg-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c022b5310c1ecfbbe37b8e9a84dc241178c4f15d85418c5b7e3d2b3b58d15c55"}, - {file = "ckzg-2.1.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2efec1c26cf81caaa65cd2046d966af754cae6aa602e8d49118cd22ad7eeb555"}, - {file = "ckzg-2.1.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95050627e9d90e713ba85e0bc049620fbf83a12c260fab541b719e3bb4a9d981"}, - {file = "ckzg-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:14c303af18aa46a9728fd8c9d4a8cf1886b18004fc02a8bfcdcb6300fd5c9570"}, - {file = "ckzg-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd13602ae766ea128e05009777bcde282710ba0f2e0e4d63c8b6fbba052c2b"}, - {file = "ckzg-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0f9a995c739e50b071b33f9ff08f50ed01f904cc7abf839e356c22eb832ce7f"}, - {file = "ckzg-2.1.3-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24a51a9f5c98c08e10bc5ed8f2f86ce460c925ae8a1785771871bbaba03de4a6"}, - {file = "ckzg-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86e76c4c356f05a46767d9bc9a4a1f0d9332de254b56385d6f1285a2e1ef6801"}, - {file = "ckzg-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:745450f7b3036328de9dbc0b5620c2678f845867069d9bff3787603463cd5f14"}, - {file = "ckzg-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ca0efa070034294042174a450cfee36c7408decaead6cb9d7d1b17ac52dfd61a"}, - {file = "ckzg-2.1.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4617935023fe772c917be78d7fd4baa646d8734a5434b7a40db3152fd2b431e6"}, - {file = "ckzg-2.1.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d2e62b085ed7a912c8cc6c8e4ce6873b9b451a7243f86878d906b1f227b6d7b2"}, - {file = "ckzg-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:e5883177a0cda39be4a83ff9a5f1440972c022131675689563528fbe20f9cf75"}, - {file = "ckzg-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:220358007c8c9ba179da3a576cf0fcccd0d52b155f083b45370fd5110dc6b5ed"}, - {file = "ckzg-2.1.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e6a24aa60b89c775f7e47510e110dc2ec9944d6a815a7aead71f750bff0de61"}, - {file = "ckzg-2.1.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a50e216c9a0255730bc81c0fbdc762a70fd242aeaf75d2f0d7e54d8a48953a89"}, - {file = "ckzg-2.1.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89a5469d6728a1d5105d0442b5ddcb2de90e6508ac9414741a3aba57fb6dca72"}, - {file = "ckzg-2.1.3-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:eea0d2efbf2d96ff64f59b70cfdf707d5ff14dbd8c0c4d4f14b18b1b077af37c"}, - {file = "ckzg-2.1.3-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:3af4ac80a70e89fc4a0250c060d313c45e1b11d49d3b616e3fc11b9bde08d4e1"}, - {file = "ckzg-2.1.3-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:42832ad346065852e0ab7ee73156a4a70e1222c576b0fbaad5ef66b47110dc58"}, - {file = "ckzg-2.1.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b9e0d81aed356c2183522ee1a71710bf8d6be4ad8128200c9df252f1ff84cb7a"}, - {file = "ckzg-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1b1920b27c036997b4cf05c89b0cd56180fd5f37359a10497434f66f2c5c29b2"}, - {file = "ckzg-2.1.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2622ab41bf9d3dbe14e1161285a545e61c92400f035ec75b7aa07eab48f0796"}, - {file = "ckzg-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bb7ed18e36620efb48a58fcb9388cfe010687229fee08a24eda4efda9caef43"}, - {file = "ckzg-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d92aacee3abef1447340b0b3bee0d4d3b2c06cc6938ce15a91e478b3d6765bb"}, - {file = "ckzg-2.1.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a0b5cba09592aeb130a2e78d08744affc4e99f738e6fcc05cf14849c200f07bc"}, - {file = "ckzg-2.1.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:4ee0d1391b4bc3029f49681bb436117f4b158e415bfb59221cf4cadf5e3a341a"}, - {file = "ckzg-2.1.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:a829e347460c4c43d564394becd4055fff00f41d88074dce8720b263431af32c"}, - {file = "ckzg-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6d893b666dc6ed0e725f87f94fa77e1cfb4239d1a01d06a618cdd3c7aeaafe7b"}, - {file = "ckzg-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ef42db126c748f8eca8f813e2827194b59a5cf541a1ba329d500300463694371"}, - {file = "ckzg-2.1.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b30a5267e1a3283f50f886cd1515f2d971116a9b72ccc1fad2dae13dfd777e8d"}, - {file = "ckzg-2.1.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30ae2d95544fa8f50dfb8db1205ea4d9c3393a6f80bb2251b2a453f6ebf4257e"}, - {file = "ckzg-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4d6cb7a4e39391a97b708d2a48410564e468b3e45ae2eed1720c1e8231e0ed3"}, - {file = "ckzg-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f885004c0c7ed64c08ac394bd0c2a9f29658524afc5eba50145e1c6b4590deb"}, - {file = "ckzg-2.1.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c5aa43765305ba95cb0a46a5f34de964dc593440d4b5a4b5bfb4011d429298a1"}, - {file = "ckzg-2.1.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9686a9649c18a99c9f39930371122ba13a51906101e65f81c52382eaff09950a"}, - {file = "ckzg-2.1.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:810e1b694a3683b77ca5764b0fe04835a634e1358aed8714f6af7e70bbbf0969"}, - {file = "ckzg-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:13686b9a059e0943d57a58484ae2abcd406911f77372920c21ef1317e4aa8163"}, - {file = "ckzg-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:431071dbb7dff4d585ac416cbe312525a268895cf074a6b3079c8ec091d75cf5"}, - {file = "ckzg-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cc33456d82cf6f3318b8a60211081d9e77ca7357404816fad4103ccf9627af5"}, - {file = "ckzg-2.1.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cac846856b0ae278798b57226c24142dc676b2ee71b2a0cc350772376f95fb2"}, - {file = "ckzg-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50945f90b1ae7841d9c771650faa0017fe7c8ca9f814c2d4c3f100817f425a21"}, - {file = "ckzg-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c3af446a59482fc50df55e303675de186e8b52de8375d23da281dddb8a1e0b"}, - {file = "ckzg-2.1.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b4fa816f976886201df20a35734a04407cb023cf2187121562d362211e597f6"}, - {file = "ckzg-2.1.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c1d0bbe086038afbe23b801c7bbbf9be12f1ad0af48b397eb26268086e4c03bd"}, - {file = "ckzg-2.1.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a52989bebef7cfdeff50fb24be8c2eea17f65a0d866c7ef81052997f1da36a32"}, - {file = "ckzg-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:0f1c5f7763e83fad734646b0aa4cc9413f5f91a417e6baf7336a3752f3d7381f"}, - {file = "ckzg-2.1.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1030b55d169970081a392a4bc95a7b440d59332f78db7d92a49a7b23202ac4e6"}, - {file = "ckzg-2.1.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:43884e8c27c59f2de1df504607184b6cf8bfd6cb1e5bfd56f916cc950d7b2cf0"}, - {file = "ckzg-2.1.3-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d949e08dd8aa94d832de4e4b0be70603ac453faef83d778dd170ce5795c22c0"}, - {file = "ckzg-2.1.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb0a6434037dfbf1382c411a4de9edf26c132ceba6006b7aa230e90b947c8f3"}, - {file = "ckzg-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939bd54b8dc64409c910214ccd0dfb90d6ef4a05eb17baff0f8529c9b0bf4a78"}, - {file = "ckzg-2.1.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:518c485233f05907ffa7d5cd98eb01deeb697b63a4a36c79475b0e6133180e78"}, - {file = "ckzg-2.1.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3a960df9870083fa2de0f7a558ee4f56288991914099f6de9908ab4a1d646f1d"}, - {file = "ckzg-2.1.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:347bc156e6e1f2d14b9778a1749b46a8ba4c5492d27b7c3a255d75d33cfe10e4"}, - {file = "ckzg-2.1.3-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b831483ff27aec4970396e6bae290d18e541a259a5a8258e3917b412d86a223f"}, - {file = "ckzg-2.1.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71198d831277132b9e48bfd1b3cc3d6f1f0b1f6f1733335633d652ef3b2fa12c"}, - {file = "ckzg-2.1.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d6fb4e2fba975fca1cc51ee1562f5f871d9b941f2082f7dfbc350e210243b77"}, - {file = "ckzg-2.1.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6c9749dc7e8dcbfeafe4cef8c9820e513e3d497a4f077fd11837190a3de347a1"}, - {file = "ckzg-2.1.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dac7428ef48206768f113f4ec3aa816e0ffb83ca803093d0399277e9c0a40d79"}, - {file = "ckzg-2.1.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95ec39217ce355db25110767fa89ed2fe516f09f73470cf6dffb3ba01de762e4"}, - {file = "ckzg-2.1.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3a51761c2a2c297aa5b65ebcd9f8d61e730eb5eb6b910c455e9fba3ddb482cb"}, - {file = "ckzg-2.1.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab798b04e3e4f0ab185a74619a1d9c46de79908fe326a07cfb002f32c66f0683"}, - {file = "ckzg-2.1.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:fdcb581a59ff3139c6dc4eb6ee4ce693004c8f0b58a0e135e0ef4a98c880ea26"}, - {file = "ckzg-2.1.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:318b851a14505eb651ccc6bdddf7da54a2f58fce7cc94c2f7b7faaa1322fe33f"}, - {file = "ckzg-2.1.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:24f6713382895d1c1580cf4ffa7bf42c8d1608bfd495cc46c813bef1aad86128"}, - {file = "ckzg-2.1.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:daf66c4f8754bd9c85612f027ffce977265a3ea3a40b68ef3e6f62cc06de5d80"}, - {file = "ckzg-2.1.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1309f76d1b3cf48a54d72b5dbf73d036451b9b1fea13851628fc544ad5a1df7a"}, - {file = "ckzg-2.1.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:055c470ffb4241402731e63024ee0fc5043ddb265e08c9deeed2564282abade2"}, - {file = "ckzg-2.1.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9efa076a74a851cc60e31fe9e6f96f84a2a8234193ea46986d729389859c3321"}, - {file = "ckzg-2.1.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5cc3caf897004ec02cfd8b2e0dc142cf99bce1aa1d9062d777d8c3c3b092626a"}, - {file = "ckzg-2.1.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4db9f91db0e2a496e4297af747becf9425536bedaf150af28c09c2cd47fd3804"}, - {file = "ckzg-2.1.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1444d2ee298ad85b9a882dacce993d7afe7a32c97ae0e1c0f8785a2a72e74b1e"}, - {file = "ckzg-2.1.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a4b43c56b095e0ef1095e65152bb8736a1eaffdd9d82ab5c3b4ab4a2adb80bc"}, - {file = "ckzg-2.1.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:601396d20b37c7f22b3d1f1a7aa0072e2ce6934ca933709570d9c59814d86d1f"}, - {file = "ckzg-2.1.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:94e4623dcea1b323a61317cd07acb8e562742a54f616e082fbb87d313ceb703d"}, - {file = "ckzg-2.1.3.tar.gz", hash = "sha256:643eb63f091d8c0cace5618348bb2ca3de96a1e53905b1a7fc608c754e70e29d"}, +files = [ + {file = "ckzg-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49ee4c830de89764bfd9e8188446f3020f14d32bd4486fcbc5a4a5afad775ac0"}, + {file = "ckzg-2.1.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3b4f0c6c2f1a629d4d64e900c65633595c63d208001d588c61b6c8bc1b189dec"}, + {file = "ckzg-2.1.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a45aaea4a42babea48bb27e387fb209f2aaaaaa16abea25a4a92a056b616f9af"}, + {file = "ckzg-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:060562273057911c39a1491e9b76055c095c10cfff1704ed70011e38b53f83d8"}, + {file = "ckzg-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12a90277b17e1cb5c326c5c261dad2ebb14a7136e754593e3a0a92c94799fc1"}, + {file = "ckzg-2.1.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:084f284d842b0a51befb2b595bf45c9c623ee3713c12500ceee9dcd05b24d14d"}, + {file = "ckzg-2.1.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7d42760b353c5d4a0f0d70a3161c1db75e22f4529fad4cef2228be1b8cd2d579"}, + {file = "ckzg-2.1.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0c547c0c61d2087f70170898948cad4d0e4583a7e25b24fdf247a426066b47bc"}, + {file = "ckzg-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:2b7ef12896e2afff613f058e3bc8e3478ff626ae8a6f2d3200950304a536935f"}, + {file = "ckzg-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cead4ba760a49eaa4d7a50a0483aad9727d6103fc00c408aef15f2cd8f8dec7b"}, + {file = "ckzg-2.1.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3156983ba598fa05f0136325125e75197e4cf24ded255aaa6ace068cede92932"}, + {file = "ckzg-2.1.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d05e2c9466b2a4214dc19da35ea4cae636e033f3434768b982d37317a0f9c520"}, + {file = "ckzg-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c754bbc253cfce8814d633f135be4891e6f83a50125f418fee01323ba306f59a"}, + {file = "ckzg-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2b766d4aed52c8c717322f2af935da0b916bf59fbba771adb822499b45e491"}, + {file = "ckzg-2.1.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dd7a296475baa5f20b5e7972448d4cb2f44d00b920d680de756c90c512af1c3b"}, + {file = "ckzg-2.1.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:97d3e93b3d94031fbd376005d86bf9b2c230ecfb4a4f4ced3b06b4aeefae6c9f"}, + {file = "ckzg-2.1.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d2d35ba937f002b72a9a168696d0073a8e5912fa7058e77a06c370b86586401"}, + {file = "ckzg-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:ce2047071353ee099d44aa6575974648663204eb9b42354bfa5ac6f9b8fb63e9"}, + {file = "ckzg-2.1.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:edead535bd9afef27b8650bba09659debd4f52638aee5ec1ab7d2c9d7e86953c"}, + {file = "ckzg-2.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dc78622855de3d47767cdeecfdf58fd58911f43a0fa783524e414b7e75149020"}, + {file = "ckzg-2.1.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094add5f197a3d278924ec1480d258f3b8b0e9f8851ae409eec83a21a738bffe"}, + {file = "ckzg-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b4b05f798784400e8c4dedaf1a1d57bbbc54de790855855add876fff3c9f629"}, + {file = "ckzg-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64aef50a1cf599041b9af018bc885a3fad6a20bbaf443fc45f0457cb47914610"}, + {file = "ckzg-2.1.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0171484eedc42b9417a79e33aff3f35d48915b01c54f42c829b891947ac06551"}, + {file = "ckzg-2.1.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2342b98acd7b6e6e33fbbc48ccec9093e1652461daf4353115adcd708498efcd"}, + {file = "ckzg-2.1.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cbce75c1e17fa60b5c33bae5069b8533cf5a4d028ef7d1f755b14a16f72307cf"}, + {file = "ckzg-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:827be2aeffc8a10bfb39b8dad45def82164dfcde735818c4053f5064474ae1b4"}, + {file = "ckzg-2.1.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d955f4e18bb9a9b3a6f55114052edd41650c29edd5f81e417c8f01abace8207"}, + {file = "ckzg-2.1.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c0961a685761196264aa49b1cf06e8a2b2add4d57987853d7dd7a7240dc5de7"}, + {file = "ckzg-2.1.5-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:badb1c7dc6b932bed2c3f7695e1ce3e4bcc9601706136957408ac2bde5dd0892"}, + {file = "ckzg-2.1.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d92816b9babaee87bd9f23be10c07d5d07c709be184aa7ea08ddb2bcf2541c"}, + {file = "ckzg-2.1.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cf39f9abe8b3f1a71188fb601a8589672ee40eb0671fc36d8cdf4e78f00f43f"}, + {file = "ckzg-2.1.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:999df675674d8d31528fd9b9afd548e86decc86447f5555b451237e7953fd63f"}, + {file = "ckzg-2.1.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c39a1c7b32ac345cc44046076fd069ad6b7e6f7bef230ef9be414c712c4453b8"}, + {file = "ckzg-2.1.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4564765b0cc65929eca057241b9c030afac1dbae015f129cb60ca6abd6ff620"}, + {file = "ckzg-2.1.5-cp313-cp313-win_amd64.whl", hash = "sha256:55013b36514b8176197655b929bc53f020aa51a144331720dead2efc3793ed85"}, + {file = "ckzg-2.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44d585f756ab223e34ac80ae04be7969cb364ee250a91f9b2b1dae37e1f3020a"}, + {file = "ckzg-2.1.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecade6a3aee63dffc8e8d4adba838460b40f9b29d46ffd9f4d4502261fbcddff"}, + {file = "ckzg-2.1.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8548de14e6e53271b246c7dc0bf843030b7f2144edb9ea73c68f46174a2bacd6"}, + {file = "ckzg-2.1.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff2551364440520376fae53840b4709eb592463f092f7c181a1086c7acfaf12"}, + {file = "ckzg-2.1.5-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:113b5b8f8bff50d1f296f0cbd02b869112279383f64f555c5271c98b93b7d4af"}, + {file = "ckzg-2.1.5-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4da91c21f004d3e6a9fa6265188142c6206a2ee8f8ebdb9f9c7000ebe06a8513"}, + {file = "ckzg-2.1.5-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:f8a86aed39387b29747c97d1ba656e7fe351bf377b2670f9f2ec29358698d804"}, + {file = "ckzg-2.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:f4de89a07e654403b45181e9b7d145c57c22896cadab40e4e093703139dcec63"}, + {file = "ckzg-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e95f41b95d97d8eb197f9cf2073cbd0f936d6a79ebe18c76747927c3c66bde42"}, + {file = "ckzg-2.1.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf522a67cfc1b86ae535c454efaebe55c29364fc91a6b20c9816cf5d1e085bbb"}, + {file = "ckzg-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178e50db70fbb8a0a83dc4684b238e960f8c0ea695a0fe7d1824b449aae3c489"}, + {file = "ckzg-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:105c08b20688c820fee992066eee8b106716bc523fa2ac656e902144f47a210f"}, + {file = "ckzg-2.1.5-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:9147af5e665dd2c01a4e3db8dd4e163194965d2ad187f69aa3304d5d494f7826"}, + {file = "ckzg-2.1.5-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:8849b7030023c48d375d7bcb3cb91baa339e5d0b73e6574c0a46bde3bafd3802"}, + {file = "ckzg-2.1.5-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:135a8da0ae4e594f06935325f1d855cdf5b6c588bddbda130709e453c41437c4"}, + {file = "ckzg-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d2fed86e47399b06b564c8d3715a3ccec5d3a0a63326227a34e15515b8c514db"}, + {file = "ckzg-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b1b52d359013b551b85fff538d2ef12763abd87efbc544d6f2808b9dd6bf0a4b"}, + {file = "ckzg-2.1.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cfe1cacea729c06196dcecec9c38f9b59bb7eadce51145e7ee27de10854dd59"}, + {file = "ckzg-2.1.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d22cef6551dee8d05151cc5184c37b190101b2027c0851301393561c559c669"}, + {file = "ckzg-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2867e4a49f19248644206e82f5b8795e22096722dcd1e21acdad133e87632d5c"}, + {file = "ckzg-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e7fd0c4b4d2af5661e3d54648c0447d33f17cbafa5dd1b0576899864b5b7da"}, + {file = "ckzg-2.1.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ba3f1702780e5c47ef9c351b8d023110c9b6c27e7952f23216f37de5deb7e6eb"}, + {file = "ckzg-2.1.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3c5e90f96867c32af0b3bf889de03043b2f26fb6d3722d194175b576d0e9d7c6"}, + {file = "ckzg-2.1.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6b66c43fb23e0957e05481b07972702ff94d993c3f7b060aa80dc9c602778a42"}, + {file = "ckzg-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:15e0f7342a451569fa427c6ad3cb992975462c52c3ecdc2bd7c3ed35847bbb8b"}, + {file = "ckzg-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3773ccdb3501ff3779988aa97e5b15629d58ac02281f186030f66d2fc2b4b7ec"}, + {file = "ckzg-2.1.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c9b798c6eb4db9cf82272e5a5c62be86f0d435206c6c49cc078cbb67ebd51bd"}, + {file = "ckzg-2.1.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ea32c21f71b786ea04b62cbe982b600da5e6f180b1d256fc9e397074041a6d"}, + {file = "ckzg-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10455cc15e769a749c19fd3031dd0149eb92c2f9b4a054117cb20327242fd920"}, + {file = "ckzg-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21c38740aa5fcdc0cacfe9eda82cbf7bdffc743fa85344495bfecc18619d7d6"}, + {file = "ckzg-2.1.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ce6133c5475bf9810d228522a963666f3f138e9a70c709f7f498268991101666"}, + {file = "ckzg-2.1.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:60c25fa2095656ee127f2986d934741b3d62890dff5f07405683c348290a9cc8"}, + {file = "ckzg-2.1.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:65f7bfcba3cacad19459d97fe2e543d153f7c115cb7cc2d7a5a6670ca5d2176b"}, + {file = "ckzg-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:123da114b6ec1c4ce758976798a075418664cc2ac6e25a0d12333f6cae798743"}, + {file = "ckzg-2.1.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:65960cf6feaf1b281af76efdfedecc536f52e47ec3982c1a2c58c0d1b36a391b"}, + {file = "ckzg-2.1.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f97d29d2ef0bfd4ad4ded126a514ced89c30ee1a30dc5d20d68918263b883c23"}, + {file = "ckzg-2.1.5-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3560a4dcd50f3b3a289c8b73657b239bbc6461eb9aa6ef5fe81a242f70591ff4"}, + {file = "ckzg-2.1.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13150a17d6aa76eb39d301440c02e5395540796d30e4d9ae30724ce191c50a28"}, + {file = "ckzg-2.1.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242e77af051028e4388df7c1ebc68897cf630cf80745f7b26ff0eb6e3ec7a78d"}, + {file = "ckzg-2.1.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a77975d10c17f617d3a43d664d0f74eb342b2cb3deb9f20860e2e2aaa24643c1"}, + {file = "ckzg-2.1.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0ae260c705a82d9cf4b88eaa2e8f86263c23d99d4ec282f22838f27d24f9306c"}, + {file = "ckzg-2.1.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:7c21b0a4ad05a9e32e715118695d7a0912b4ee73198d63cc98de4d585597627e"}, + {file = "ckzg-2.1.5-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0577aee9848d7a9cef750ff6f303f586caf33da986a762ca57ac0c57e59fb6d"}, + {file = "ckzg-2.1.5-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e15faa1145b2408e17e3b2f0b159de325b0198615aa30268bb6cd8f4385ed745"}, + {file = "ckzg-2.1.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d009dba9838630183610008a81bd80aafb389d45d8293d7a2fff7a5ea82266"}, + {file = "ckzg-2.1.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:df66d2be54d91f74aded4ceb71e7b1f789e2636a3015f438904a22ec9de750f1"}, + {file = "ckzg-2.1.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:60106be3df3987eb77c37f81d1bfd3042b1dadee80189dcab19e40fdb03cbab5"}, + {file = "ckzg-2.1.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76ae039df3d8ca2dfbd969c4dc7f394c90def4c3b53a5388980c206c7ef1fc98"}, + {file = "ckzg-2.1.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7a6890d0ae0a0383bd1b486ae4a5d22503ac92fbc0052d82f3c3d7489d8a499"}, + {file = "ckzg-2.1.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8490506f6a0e806f1135dab515c317ad498aaeeb65f6af4d1802326dfb6d637b"}, + {file = "ckzg-2.1.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:89fc31651d53221c2a9e6225955aab25cf23ebcf5c283c78701bc111220d9f79"}, + {file = "ckzg-2.1.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:33b9ec66b8cc977ae861ec796b40aa4072f73ef53f2d7e7b67185219af7f361f"}, + {file = "ckzg-2.1.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:993476a2a7ff37e7085a7d3d3536b4278856228c737a3a73da7dc0731188faf5"}, + {file = "ckzg-2.1.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c773dd27bb9dd4738a9a1b94ed969ae2860536b559cd973ea21b44921227676"}, + {file = "ckzg-2.1.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68e286edaf8f3279177619a05b430e8a2b249db1f26ade39540ef9b4f912ca3"}, + {file = "ckzg-2.1.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a8904743a733dedea5b926dea58a346b3ee9f26d74d7b99ba400ba6fc1669a8"}, + {file = "ckzg-2.1.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f3802221dde71cfafaa2c932b7981c2ad7de5f8e67c8c3aa79cba0c949b65958"}, + {file = "ckzg-2.1.5-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b2cd37c7dcbefe56fc85a6ebbc1920f32e8f61eae9b18b7e35d50b7bf9536f1"}, + {file = "ckzg-2.1.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00fa1aaf21d12011b41403ce631c57b8ea442af46c1a8d16d0851646c705f016"}, + {file = "ckzg-2.1.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ecb2e1bd2272905dbcf8cad509735748043b63c303d67c9ba7aa263fd8edf06"}, + {file = "ckzg-2.1.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c2e40cb8374b67c25eeca2c1296ff595371f94b819487f5385fad3ec8a26b88"}, + {file = "ckzg-2.1.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0ddd295ca5d1b1fe56f52608b93d5ccac9b3d4c13ee0d9a5f51ca909c203bca"}, + {file = "ckzg-2.1.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6ca0a6c822793f2cd644f4d4fbdac75e11d80b4ceb1e31bcd3936d272a01e794"}, + {file = "ckzg-2.1.5.tar.gz", hash = "sha256:e48e092f9b89ebb6aaa195de2e2bb72ad2d4b35c87d3a15e4545f13c51fbbe30"}, ] [[package]] @@ -618,7 +590,6 @@ version = "0.19.0" description = "Build Nice User Interfaces In The Terminal" optional = false python-versions = "<4.0,>=3.9" -groups = ["dev"] files = [ {file = "cli_ui-0.19.0-py3-none-any.whl", hash = "sha256:1cf1b93328f7377730db29507e10bcb29ccc1427ceef45714b522d1f2055e7cd"}, {file = "cli_ui-0.19.0.tar.gz", hash = "sha256:59cdab0c6a2a6703c61b31cb75a1943076888907f015fffe15c5a8eb41a933aa"}, @@ -631,14 +602,13 @@ unidecode = ">=1.3.6,<2.0.0" [[package]] name = "click" -version = "8.2.1" +version = "8.3.0" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] files = [ - {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, - {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, + {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"}, + {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"}, ] [package.dependencies] @@ -650,12 +620,10 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\""} [[package]] name = "cytoolz" @@ -663,8 +631,6 @@ version = "1.0.1" description = "Cython implementation of Toolz: High performance functional utilities" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "implementation_name == \"cpython\"" files = [ {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, @@ -780,7 +746,6 @@ version = "0.34.0" description = "Datamodel Code Generator" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "datamodel_code_generator-0.34.0-py3-none-any.whl", hash = "sha256:74d1aaf2ab27e21b6d6e28b5236f27271b8404b7fd0e856be95c2f7562d694ff"}, {file = "datamodel_code_generator-0.34.0.tar.gz", hash = "sha256:4695bdd2c9e85049db4bdf5791f68647518d98fd589d30bd8525e941e628acf7"}, @@ -812,7 +777,6 @@ version = "0.0.13" description = "Python package to sign on-chain self-custodial requests for orders, transfers, deposits, withdrawals and RFQs." optional = false python-versions = "<4.0,>=3.9" -groups = ["main"] files = [ {file = "derive_action_signing-0.0.13-py3-none-any.whl", hash = "sha256:b5fb8ad9d4888a09441da9fc97d66fc0c909d1d1268c54a65c4e8bbd141d6598"}, {file = "derive_action_signing-0.0.13.tar.gz", hash = "sha256:753b3766e4c836d4cc4b36e076b14e4b9ebf28843a6192312459f718f0236d60"}, @@ -832,7 +796,6 @@ version = "0.6.2" description = "Pythonic argument parser, that will make you smile" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] @@ -843,7 +806,6 @@ version = "5.2.0" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, @@ -866,7 +828,6 @@ version = "0.13.7" description = "eth-account: Sign Ethereum transactions and messages with local private keys" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_account-0.13.7-py3-none-any.whl", hash = "sha256:39727de8c94d004ff61d10da7587509c04d2dc7eac71e04830135300bdfc6d24"}, {file = "eth_account-0.13.7.tar.gz", hash = "sha256:5853ecbcbb22e65411176f121f5f24b8afeeaf13492359d254b16d8b18c77a46"}, @@ -895,7 +856,6 @@ version = "0.7.1" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a"}, {file = "eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5"}, @@ -908,7 +868,7 @@ pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"p dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] pycryptodome = ["pycryptodome (>=3.6.6,<4)"] -pysha3 = ["pysha3 (>=1.0.0,<2.0.0) ; python_version < \"3.9\"", "safe-pysha3 (>=1.0.0) ; python_version >= \"3.9\""] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] @@ -917,7 +877,6 @@ version = "0.8.1" description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, @@ -939,7 +898,6 @@ version = "0.7.0" description = "eth-keys: Common API for Ethereum key operations" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_keys-0.7.0-py3-none-any.whl", hash = "sha256:b0cdda8ffe8e5ba69c7c5ca33f153828edcace844f67aabd4542d7de38b159cf"}, {file = "eth_keys-0.7.0.tar.gz", hash = "sha256:79d24fd876201df67741de3e3fefb3f4dbcbb6ace66e47e6fe662851a4547814"}, @@ -961,7 +919,6 @@ version = "2.2.0" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_rlp-2.2.0-py3-none-any.whl", hash = "sha256:5692d595a741fbaef1203db6a2fedffbd2506d31455a6ad378c8449ee5985c47"}, {file = "eth_rlp-2.2.0.tar.gz", hash = "sha256:5e4b2eb1b8213e303d6a232dfe35ab8c29e2d3051b86e8d359def80cd21db83d"}, @@ -971,7 +928,6 @@ files = [ eth-utils = ">=2.0.0" hexbytes = ">=1.2.0" rlp = ">=0.6.0" -typing_extensions = {version = ">=4.0.1", markers = "python_version <= \"3.10\""} [package.extras] dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] @@ -984,7 +940,6 @@ version = "4.4.0" description = "eth-typing: Common type annotations for ethereum python packages" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_typing-4.4.0-py3-none-any.whl", hash = "sha256:a5e30a6e69edda7b1d1e96e9d71bab48b9bb988a77909d8d1666242c5562f841"}, {file = "eth_typing-4.4.0.tar.gz", hash = "sha256:93848083ac6bb4c20cc209ea9153a08b0a528be23337c889f89e1e5ffbe9807d"}, @@ -1004,7 +959,6 @@ version = "4.1.1" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "eth_utils-4.1.1-py3-none-any.whl", hash = "sha256:ccbbac68a6d65cb6e294c5bcb6c6a5cec79a241c56dc5d9c345ed788c30f8534"}, {file = "eth_utils-4.1.1.tar.gz", hash = "sha256:71c8d10dec7494aeed20fa7a4d52ec2ce4a2e52fdce80aab4f5c3c19f3648b25"}, @@ -1021,32 +975,12 @@ dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hy docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] test = ["hypothesis (>=4.43.0)", "mypy (==1.5.1)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] -[[package]] -name = "exceptiongroup" -version = "1.3.0" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version < \"3.11\"" -files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "frozenlist" version = "1.7.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a"}, {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61"}, @@ -1160,7 +1094,6 @@ version = "1.3.0" description = "GenSON is a powerful, user-friendly JSON Schema generator." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, @@ -1172,7 +1105,6 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1190,7 +1122,6 @@ version = "1.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "hexbytes-1.3.1-py3-none-any.whl", hash = "sha256:da01ff24a1a9a2b1881c4b85f0e9f9b0f51b526b379ffa23832ae7899d29c2c7"}, {file = "hexbytes-1.3.1.tar.gz", hash = "sha256:a657eebebdfe27254336f98d8af6e2236f3f83aed164b87466b6cf6c5f5a4765"}, @@ -1207,7 +1138,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1222,7 +1152,6 @@ version = "7.5.0" description = "Correctly generate plurals, singular nouns, ordinals, indefinite articles" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "inflect-7.5.0-py3-none-any.whl", hash = "sha256:2aea70e5e70c35d8350b8097396ec155ffd68def678c7ff97f51aa69c1d92344"}, {file = "inflect-7.5.0.tar.gz", hash = "sha256:faf19801c3742ed5a05a8ce388e0d8fe1a07f8d095c82201eb904f5d27ad571f"}, @@ -1233,7 +1162,7 @@ more_itertools = ">=8.5.0" typeguard = ">=4.0.1" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] @@ -1246,7 +1175,6 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -1258,7 +1186,6 @@ version = "6.0.1" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.9.0" -groups = ["dev"] files = [ {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, @@ -1274,7 +1201,6 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1292,7 +1218,6 @@ version = "4.25.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, @@ -1314,7 +1239,6 @@ version = "2025.9.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, @@ -1329,7 +1253,6 @@ version = "1.3.0" description = "An Dict like LRU container." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b"}, {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4073333894db9840f066226d50e6f914a2240711c87d60885d8c940b69a6673f"}, @@ -1423,7 +1346,6 @@ version = "3.9" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280"}, {file = "markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a"}, @@ -1439,7 +1361,6 @@ version = "4.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, @@ -1459,73 +1380,100 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] [[package]] name = "markupsafe" -version = "3.0.2" +version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] [[package]] @@ -1534,7 +1482,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -1546,7 +1493,6 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -1558,7 +1504,6 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -1581,7 +1526,7 @@ watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4) ; platform_system == \"Windows\"", "ghp-import (==1.0)", "importlib-metadata (==4.4) ; python_version < \"3.10\"", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" @@ -1589,7 +1534,6 @@ version = "0.4.1" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, @@ -1605,7 +1549,6 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -1622,7 +1565,6 @@ version = "3.9.1" description = "Mkdocs Markdown includer plugin." optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mkdocs_include_markdown_plugin-3.9.1-py3-none-any.whl", hash = "sha256:f33687e29ac66d045ba181ea50f054646b0090b42b0a4318f08e7f1d1235e6f6"}, {file = "mkdocs_include_markdown_plugin-3.9.1.tar.gz", hash = "sha256:5e5698e78d7fea111be9873a456089daa333497988405acaac8eba2924a19152"}, @@ -1638,7 +1580,6 @@ version = "8.5.11" description = "Documentation that simply works" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mkdocs_material-8.5.11-py3-none-any.whl", hash = "sha256:c907b4b052240a5778074a30a78f31a1f8ff82d7012356dc26898b97559f082e"}, {file = "mkdocs_material-8.5.11.tar.gz", hash = "sha256:b0ea0513fd8cab323e8a825d6692ea07fa83e917bb5db042e523afecc7064ab7"}, @@ -1659,7 +1600,6 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -1671,19 +1611,69 @@ version = "10.8.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b"}, {file = "more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd"}, ] +[[package]] +name = "msgspec" +version = "0.19.0" +description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." +optional = false +python-versions = ">=3.9" +files = [ + {file = "msgspec-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d8dd848ee7ca7c8153462557655570156c2be94e79acec3561cf379581343259"}, + {file = "msgspec-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0553bbc77662e5708fe66aa75e7bd3e4b0f209709c48b299afd791d711a93c36"}, + {file = "msgspec-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2c4bf29bf4e89790b3117470dea2c20b59932772483082c468b990d45fb947"}, + {file = "msgspec-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e87ecfa9795ee5214861eab8326b0e75475c2e68a384002aa135ea2a27d909"}, + {file = "msgspec-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3c4ec642689da44618f68c90855a10edbc6ac3ff7c1d94395446c65a776e712a"}, + {file = "msgspec-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2719647625320b60e2d8af06b35f5b12d4f4d281db30a15a1df22adb2295f633"}, + {file = "msgspec-0.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:695b832d0091edd86eeb535cd39e45f3919f48d997685f7ac31acb15e0a2ed90"}, + {file = "msgspec-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa77046904db764b0462036bc63ef71f02b75b8f72e9c9dd4c447d6da1ed8f8e"}, + {file = "msgspec-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:047cfa8675eb3bad68722cfe95c60e7afabf84d1bd8938979dd2b92e9e4a9551"}, + {file = "msgspec-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e78f46ff39a427e10b4a61614a2777ad69559cc8d603a7c05681f5a595ea98f7"}, + {file = "msgspec-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c7adf191e4bd3be0e9231c3b6dc20cf1199ada2af523885efc2ed218eafd011"}, + {file = "msgspec-0.19.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f04cad4385e20be7c7176bb8ae3dca54a08e9756cfc97bcdb4f18560c3042063"}, + {file = "msgspec-0.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45c8fb410670b3b7eb884d44a75589377c341ec1392b778311acdbfa55187716"}, + {file = "msgspec-0.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:70eaef4934b87193a27d802534dc466778ad8d536e296ae2f9334e182ac27b6c"}, + {file = "msgspec-0.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f98bd8962ad549c27d63845b50af3f53ec468b6318400c9f1adfe8b092d7b62f"}, + {file = "msgspec-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:43bbb237feab761b815ed9df43b266114203f53596f9b6e6f00ebd79d178cdf2"}, + {file = "msgspec-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cfc033c02c3e0aec52b71710d7f84cb3ca5eb407ab2ad23d75631153fdb1f12"}, + {file = "msgspec-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d911c442571605e17658ca2b416fd8579c5050ac9adc5e00c2cb3126c97f73bc"}, + {file = "msgspec-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:757b501fa57e24896cf40a831442b19a864f56d253679f34f260dcb002524a6c"}, + {file = "msgspec-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5f0f65f29b45e2816d8bded36e6b837a4bf5fb60ec4bc3c625fa2c6da4124537"}, + {file = "msgspec-0.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:067f0de1c33cfa0b6a8206562efdf6be5985b988b53dd244a8e06f993f27c8c0"}, + {file = "msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f12d30dd6266557aaaf0aa0f9580a9a8fbeadfa83699c487713e355ec5f0bd86"}, + {file = "msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82b2c42c1b9ebc89e822e7e13bbe9d17ede0c23c187469fdd9505afd5a481314"}, + {file = "msgspec-0.19.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19746b50be214a54239aab822964f2ac81e38b0055cca94808359d779338c10e"}, + {file = "msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ef4bdb0ec8e4ad62e5a1f95230c08efb1f64f32e6e8dd2ced685bcc73858b5"}, + {file = "msgspec-0.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac7f7c377c122b649f7545810c6cd1b47586e3aa3059126ce3516ac7ccc6a6a9"}, + {file = "msgspec-0.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5bc1472223a643f5ffb5bf46ccdede7f9795078194f14edd69e3aab7020d327"}, + {file = "msgspec-0.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:317050bc0f7739cb30d257ff09152ca309bf5a369854bbf1e57dffc310c1f20f"}, + {file = "msgspec-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15c1e86fff77184c20a2932cd9742bf33fe23125fa3fcf332df9ad2f7d483044"}, + {file = "msgspec-0.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b5541b2b3294e5ffabe31a09d604e23a88533ace36ac288fa32a420aa38d229"}, + {file = "msgspec-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f5c043ace7962ef188746e83b99faaa9e3e699ab857ca3f367b309c8e2c6b12"}, + {file = "msgspec-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca06aa08e39bf57e39a258e1996474f84d0dd8130d486c00bec26d797b8c5446"}, + {file = "msgspec-0.19.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e695dad6897896e9384cf5e2687d9ae9feaef50e802f93602d35458e20d1fb19"}, + {file = "msgspec-0.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3be5c02e1fee57b54130316a08fe40cca53af92999a302a6054cd451700ea7db"}, + {file = "msgspec-0.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:0684573a821be3c749912acf5848cce78af4298345cb2d7a8b8948a0a5a27cfe"}, + {file = "msgspec-0.19.0.tar.gz", hash = "sha256:604037e7cd475345848116e89c553aa9a233259733ab51986ac924ab1b976f8e"}, +] + +[package.extras] +dev = ["attrs", "coverage", "eval-type-backport", "furo", "ipython", "msgpack", "mypy", "pre-commit", "pyright", "pytest", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "tomli", "tomli_w"] +doc = ["furo", "ipython", "sphinx", "sphinx-copybutton", "sphinx-design"] +test = ["attrs", "eval-type-backport", "msgpack", "pytest", "pyyaml", "tomli", "tomli_w"] +toml = ["tomli", "tomli_w"] +yaml = ["pyyaml"] + [[package]] name = "multidict" version = "6.6.4" description = "multidict implementation" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "multidict-6.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b8aa6f0bd8125ddd04a6593437bad6a7e70f300ff4180a531654aa2ab3f6d58f"}, {file = "multidict-6.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9e5853bbd7264baca42ffc53391b490d65fe62849bf2c690fa3f6273dbcd0cb"}, @@ -1797,16 +1787,12 @@ files = [ {file = "multidict-6.6.4.tar.gz", hash = "sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} - [[package]] name = "mypy-extensions" version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -1818,7 +1804,6 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -1864,7 +1849,6 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -1872,59 +1856,70 @@ files = [ [[package]] name = "pandas" -version = "2.3.2" +version = "2.3.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "pandas-2.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52bc29a946304c360561974c6542d1dd628ddafa69134a7131fdfd6a5d7a1a35"}, - {file = "pandas-2.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:220cc5c35ffaa764dd5bb17cf42df283b5cb7fdf49e10a7b053a06c9cb48ee2b"}, - {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c05e15111221384019897df20c6fe893b2f697d03c811ee67ec9e0bb5a3424"}, - {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc03acc273c5515ab69f898df99d9d4f12c4d70dbfc24c3acc6203751d0804cf"}, - {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d25c20a03e8870f6339bcf67281b946bd20b86f1a544ebbebb87e66a8d642cba"}, - {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21bb612d148bb5860b7eb2c10faacf1a810799245afd342cf297d7551513fbb6"}, - {file = "pandas-2.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:b62d586eb25cb8cb70a5746a378fc3194cb7f11ea77170d59f889f5dfe3cec7a"}, - {file = "pandas-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1333e9c299adcbb68ee89a9bb568fc3f20f9cbb419f1dd5225071e6cddb2a743"}, - {file = "pandas-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76972bcbd7de8e91ad5f0ca884a9f2c477a2125354af624e022c49e5bd0dfff4"}, - {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98bdd7c456a05eef7cd21fd6b29e3ca243591fe531c62be94a2cc987efb5ac2"}, - {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d81573b3f7db40d020983f78721e9bfc425f411e616ef019a10ebf597aedb2e"}, - {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e190b738675a73b581736cc8ec71ae113d6c3768d0bd18bffa5b9a0927b0b6ea"}, - {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c253828cb08f47488d60f43c5fc95114c771bbfff085da54bfc79cb4f9e3a372"}, - {file = "pandas-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9467697b8083f9667b212633ad6aa4ab32436dcbaf4cd57325debb0ddef2012f"}, - {file = "pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9"}, - {file = "pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b"}, - {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175"}, - {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9"}, - {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4"}, - {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811"}, - {file = "pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae"}, - {file = "pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e"}, - {file = "pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9"}, - {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a"}, - {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b"}, - {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6"}, - {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a"}, - {file = "pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b"}, - {file = "pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57"}, - {file = "pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2"}, - {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9"}, - {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2"}, - {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012"}, - {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370"}, - {file = "pandas-2.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88080a0ff8a55eac9c84e3ff3c7665b3b5476c6fbc484775ca1910ce1c3e0b87"}, - {file = "pandas-2.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4a558c7620340a0931828d8065688b3cc5b4c8eb674bcaf33d18ff4a6870b4a"}, - {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45178cf09d1858a1509dc73ec261bf5b25a625a389b65be2e47b559905f0ab6a"}, - {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77cefe00e1b210f9c76c697fedd8fdb8d3dd86563e9c8adc9fa72b90f5e9e4c2"}, - {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:13bd629c653856f00c53dc495191baa59bcafbbf54860a46ecc50d3a88421a96"}, - {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:36d627906fd44b5fd63c943264e11e96e923f8de77d6016dc2f667b9ad193438"}, - {file = "pandas-2.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a9d7ec92d71a420185dec44909c32e9a362248c4ae2238234b76d5be37f208cc"}, - {file = "pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb"}, +files = [ + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, ] [package.dependencies] numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] @@ -1963,7 +1958,6 @@ version = "0.10.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, @@ -1978,7 +1972,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1990,7 +1983,6 @@ version = "4.4.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, @@ -2007,7 +1999,6 @@ version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -2023,7 +2014,6 @@ version = "0.3.2" description = "Accelerated property cache" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770"}, {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3"}, @@ -2131,7 +2121,6 @@ version = "6.32.1" description = "" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "protobuf-6.32.1-cp310-abi3-win32.whl", hash = "sha256:a8a32a84bc9f2aad712041b8b366190f71dde248926da517bde9e832e4412085"}, {file = "protobuf-6.32.1-cp310-abi3-win_amd64.whl", hash = "sha256:b00a7d8c25fa471f16bc8153d0e53d6c9e827f0953f3c09aaa4331c718cae5e1"}, @@ -2144,13 +2133,42 @@ files = [ {file = "protobuf-6.32.1.tar.gz", hash = "sha256:ee2469e4a021474ab9baafea6cd070e5bf27c7d29433504ddea1a4ee5850f68d"}, ] +[[package]] +name = "py-lets-be-rational" +version = "1.0.1" +description = "Pure python implementation of Peter Jaeckel's LetsBeRational." +optional = false +python-versions = "*" +files = [ + {file = "py_lets_be_rational-1.0.1.tar.gz", hash = "sha256:0e0788a4109e102a666f26d67276c0d3c2feb8a059e788354a90e565f2db0ed2"}, +] + +[package.dependencies] +numpy = "*" + +[[package]] +name = "py-vollib" +version = "1.0.1" +description = "" +optional = false +python-versions = "*" +files = [ + {file = "py_vollib-1.0.1.tar.gz", hash = "sha256:36e752eee16dcf52994c42aaf5372f0ab9cfd0d2aedc5462c4c1b6123c9ecf20"}, +] + +[package.dependencies] +numpy = "*" +pandas = "*" +py_lets_be_rational = "*" +scipy = "*" +simplejson = "*" + [[package]] name = "pycryptodome" version = "3.23.0" description = "Cryptographic library for Python" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main"] files = [ {file = "pycryptodome-3.23.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a176b79c49af27d7f6c12e4b178b0824626f40a7b9fed08f712291b6d54bf566"}, {file = "pycryptodome-3.23.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:573a0b3017e06f2cffd27d92ef22e46aa3be87a2d317a5abf7cc0e84e321bd75"}, @@ -2201,7 +2219,6 @@ version = "2.11.9" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2"}, {file = "pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2"}, @@ -2215,7 +2232,7 @@ typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] +timezone = ["tzdata"] [[package]] name = "pydantic-core" @@ -2223,7 +2240,6 @@ version = "2.33.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, @@ -2335,7 +2351,6 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -2350,7 +2365,6 @@ version = "10.16.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d"}, {file = "pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91"}, @@ -2369,7 +2383,6 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -2377,11 +2390,9 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] @@ -2392,7 +2403,6 @@ version = "13.0" description = "pytest plugin to re-run tests to eliminate flaky failures" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-rerunfailures-13.0.tar.gz", hash = "sha256:e132dbe420bc476f544b96e7036edd0a69707574209b6677263c950d19b09199"}, {file = "pytest_rerunfailures-13.0-py3-none-any.whl", hash = "sha256:34919cb3fcb1f8e5d4b940aa75ccdea9661bade925091873b7c6fa5548333069"}, @@ -2408,7 +2418,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -2423,7 +2432,6 @@ version = "1.1.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"}, {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"}, @@ -2438,7 +2446,6 @@ version = "0.1.10" description = "A Fast, spec compliant Python 3.12+ tokenizer that runs on older Pythons." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytokens-0.1.10-py3-none-any.whl", hash = "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b"}, {file = "pytokens-0.1.10.tar.gz", hash = "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044"}, @@ -2453,7 +2460,6 @@ version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, @@ -2461,14 +2467,13 @@ files = [ [[package]] name = "pyunormalize" -version = "16.0.0" -description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent of the Python core Unicode database." +version = "17.0.0" +description = "A library for Unicode normalization (NFC, NFD, NFKC, NFKD) independent of Python's core Unicode database." optional = false -python-versions = ">=3.6" -groups = ["main"] +python-versions = ">=3.8" files = [ - {file = "pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152"}, - {file = "pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7"}, + {file = "pyunormalize-17.0.0-py3-none-any.whl", hash = "sha256:f0d93b076f938db2b26d319d04f2b58505d1cd7a80b5b72badbe7d1aa4d2a31c"}, + {file = "pyunormalize-17.0.0.tar.gz", hash = "sha256:0949a3e56817e287febcaf1b0cc4b5adf0bb107628d379335938040947eec792"}, ] [[package]] @@ -2477,8 +2482,6 @@ version = "311" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["main"] -markers = "platform_system == \"Windows\"" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, @@ -2504,65 +2507,84 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +files = [ + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] @@ -2571,7 +2593,6 @@ version = "1.1" description = "A custom YAML tag for referencing environment variables in YAML files." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04"}, {file = "pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff"}, @@ -2586,7 +2607,6 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -2599,99 +2619,126 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "regex" -version = "2025.9.1" +version = "2025.9.18" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5aa2a6a73bf218515484b36a0d20c6ad9dc63f6339ff6224147b0e2c095ee55"}, - {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c2ff5c01d5e47ad5fc9d31bcd61e78c2fa0068ed00cab86b7320214446da766"}, - {file = "regex-2025.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d49dc84e796b666181de8a9973284cad6616335f01b52bf099643253094920fc"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9914fe1040874f83c15fcea86d94ea54091b0666eab330aaab69e30d106aabe"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e71bceb3947362ec5eabd2ca0870bb78eae4edfc60c6c21495133c01b6cd2df4"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67a74456f410fe5e869239ee7a5423510fe5121549af133809d9591a8075893f"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c3b96ed0223b32dbdc53a83149b6de7ca3acd5acd9c8e64b42a166228abe29c"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:113d5aa950f428faf46fd77d452df62ebb4cc6531cb619f6cc30a369d326bfbd"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fcdeb38de4f7f3d69d798f4f371189061446792a84e7c92b50054c87aae9c07c"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4bcdff370509164b67a6c8ec23c9fb40797b72a014766fdc159bb809bd74f7d8"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7383efdf6e8e8c61d85e00cfb2e2e18da1a621b8bfb4b0f1c2747db57b942b8f"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ec2bd3bdf0f73f7e9f48dca550ba7d973692d5e5e9a90ac42cc5f16c4432d8b"}, - {file = "regex-2025.9.1-cp310-cp310-win32.whl", hash = "sha256:9627e887116c4e9c0986d5c3b4f52bcfe3df09850b704f62ec3cbf177a0ae374"}, - {file = "regex-2025.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:94533e32dc0065eca43912ee6649c90ea0681d59f56d43c45b5bcda9a740b3dd"}, - {file = "regex-2025.9.1-cp310-cp310-win_arm64.whl", hash = "sha256:a874a61bb580d48642ffd338570ee24ab13fa023779190513fcacad104a6e251"}, - {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e5bcf112b09bfd3646e4db6bf2e598534a17d502b0c01ea6550ba4eca780c5e6"}, - {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:67a0295a3c31d675a9ee0238d20238ff10a9a2fdb7a1323c798fc7029578b15c"}, - {file = "regex-2025.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea8267fbadc7d4bd7c1301a50e85c2ff0de293ff9452a1a9f8d82c6cafe38179"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aeff21de7214d15e928fb5ce757f9495214367ba62875100d4c18d293750cc1"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d89f1bbbbbc0885e1c230f7770d5e98f4f00b0ee85688c871d10df8b184a6323"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca3affe8ddea498ba9d294ab05f5f2d3b5ad5d515bc0d4a9016dd592a03afe52"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91892a7a9f0a980e4c2c85dd19bc14de2b219a3a8867c4b5664b9f972dcc0c78"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e1cb40406f4ae862710615f9f636c1e030fd6e6abe0e0f65f6a695a2721440c6"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94f6cff6f7e2149c7e6499a6ecd4695379eeda8ccbccb9726e8149f2fe382e92"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6c0226fb322b82709e78c49cc33484206647f8a39954d7e9de1567f5399becd0"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a12f59c7c380b4fcf7516e9cbb126f95b7a9518902bcf4a852423ff1dcd03e6a"}, - {file = "regex-2025.9.1-cp311-cp311-win32.whl", hash = "sha256:49865e78d147a7a4f143064488da5d549be6bfc3f2579e5044cac61f5c92edd4"}, - {file = "regex-2025.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:d34b901f6f2f02ef60f4ad3855d3a02378c65b094efc4b80388a3aeb700a5de7"}, - {file = "regex-2025.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:47d7c2dab7e0b95b95fd580087b6ae196039d62306a592fa4e162e49004b6299"}, - {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84a25164bd8dcfa9f11c53f561ae9766e506e580b70279d05a7946510bdd6f6a"}, - {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:645e88a73861c64c1af558dd12294fb4e67b5c1eae0096a60d7d8a2143a611c7"}, - {file = "regex-2025.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10a450cba5cd5409526ee1d4449f42aad38dd83ac6948cbd6d7f71ca7018f7db"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9dc5991592933a4192c166eeb67b29d9234f9c86344481173d1bc52f73a7104"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a32291add816961aab472f4fad344c92871a2ee33c6c219b6598e98c1f0108f2"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:588c161a68a383478e27442a678e3b197b13c5ba51dbba40c1ccb8c4c7bee9e9"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47829ffaf652f30d579534da9085fe30c171fa2a6744a93d52ef7195dc38218b"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e978e5a35b293ea43f140c92a3269b6ab13fe0a2bf8a881f7ac740f5a6ade85"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf09903e72411f4bf3ac1eddd624ecfd423f14b2e4bf1c8b547b72f248b7bf7"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d016b0f77be63e49613c9e26aaf4a242f196cd3d7a4f15898f5f0ab55c9b24d2"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:656563e620de6908cd1c9d4f7b9e0777e3341ca7db9d4383bcaa44709c90281e"}, - {file = "regex-2025.9.1-cp312-cp312-win32.whl", hash = "sha256:df33f4ef07b68f7ab637b1dbd70accbf42ef0021c201660656601e8a9835de45"}, - {file = "regex-2025.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5aba22dfbc60cda7c0853516104724dc904caa2db55f2c3e6e984eb858d3edf3"}, - {file = "regex-2025.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:ec1efb4c25e1849c2685fa95da44bfde1b28c62d356f9c8d861d4dad89ed56e9"}, - {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef"}, - {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025"}, - {file = "regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7"}, - {file = "regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8"}, - {file = "regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7"}, - {file = "regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0"}, - {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1"}, - {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03"}, - {file = "regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273"}, - {file = "regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86"}, - {file = "regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70"}, - {file = "regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993"}, - {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a13d20007dce3c4b00af5d84f6c191ed1c0f70928c6d9b6cd7b8d2f125df7f46"}, - {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d6b046b0a01cb713fd53ef36cb59db4b0062b343db28e83b52ac6aa01ee5b368"}, - {file = "regex-2025.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fa9a7477288717f42dbd02ff5d13057549e9a8cdb81f224c313154cc10bab52"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2b3ad150c6bc01a8cd5030040675060e2adbe6cbc50aadc4da42c6d32ec266e"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aa88d5a82dfe80deaf04e8c39c8b0ad166d5d527097eb9431cb932c44bf88715"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f1dae2cf6c2dbc6fd2526653692c144721b3cf3f769d2a3c3aa44d0f38b9a58"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff62a3022914fc19adaa76b65e03cf62bc67ea16326cbbeb170d280710a7d719"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a34ef82216189d823bc82f614d1031cb0b919abef27cecfd7b07d1e9a8bdeeb4"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d40e6b49daae9ebbd7fa4e600697372cba85b826592408600068e83a3c47211"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0aeb0fe80331059c152a002142699a89bf3e44352aee28261315df0c9874759b"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a90014d29cb3098403d82a879105d1418edbbdf948540297435ea6e377023ea7"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6ff623271e0b0cc5a95b802666bbd70f17ddd641582d65b10fb260cc0c003529"}, - {file = "regex-2025.9.1-cp39-cp39-win32.whl", hash = "sha256:d161bfdeabe236290adfd8c7588da7f835d67e9e7bf2945f1e9e120622839ba6"}, - {file = "regex-2025.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:43ebc77a7dfe36661192afd8d7df5e8be81ec32d2ad0c65b536f66ebfec3dece"}, - {file = "regex-2025.9.1-cp39-cp39-win_arm64.whl", hash = "sha256:5d74b557cf5554001a869cda60b9a619be307df4d10155894aeaad3ee67c9899"}, - {file = "regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff"}, +files = [ + {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:12296202480c201c98a84aecc4d210592b2f55e200a1d193235c4db92b9f6788"}, + {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:220381f1464a581f2ea988f2220cf2a67927adcef107d47d6897ba5a2f6d51a4"}, + {file = "regex-2025.9.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87f681bfca84ebd265278b5daa1dcb57f4db315da3b5d044add7c30c10442e61"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34d674cbba70c9398074c8a1fcc1a79739d65d1105de2a3c695e2b05ea728251"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:385c9b769655cb65ea40b6eea6ff763cbb6d69b3ffef0b0db8208e1833d4e746"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8900b3208e022570ae34328712bef6696de0804c122933414014bae791437ab2"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c204e93bf32cd7a77151d44b05eb36f469d0898e3fba141c026a26b79d9914a0"}, + {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3acc471d1dd7e5ff82e6cacb3b286750decd949ecd4ae258696d04f019817ef8"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6479d5555122433728760e5f29edb4c2b79655a8deb681a141beb5c8a025baea"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:431bd2a8726b000eb6f12429c9b438a24062a535d06783a93d2bcbad3698f8a8"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0cc3521060162d02bd36927e20690129200e5ac9d2c6d32b70368870b122db25"}, + {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a021217b01be2d51632ce056d7a837d3fa37c543ede36e39d14063176a26ae29"}, + {file = "regex-2025.9.18-cp310-cp310-win32.whl", hash = "sha256:4a12a06c268a629cb67cc1d009b7bb0be43e289d00d5111f86a2efd3b1949444"}, + {file = "regex-2025.9.18-cp310-cp310-win_amd64.whl", hash = "sha256:47acd811589301298c49db2c56bde4f9308d6396da92daf99cba781fa74aa450"}, + {file = "regex-2025.9.18-cp310-cp310-win_arm64.whl", hash = "sha256:16bd2944e77522275e5ee36f867e19995bcaa533dcb516753a26726ac7285442"}, + {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:51076980cd08cd13c88eb7365427ae27f0d94e7cebe9ceb2bb9ffdae8fc4d82a"}, + {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:828446870bd7dee4e0cbeed767f07961aa07f0ea3129f38b3ccecebc9742e0b8"}, + {file = "regex-2025.9.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28821d5637866479ec4cc23b8c990f5bc6dd24e5e4384ba4a11d38a526e1414"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726177ade8e481db669e76bf99de0b278783be8acd11cef71165327abd1f170a"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5cca697da89b9f8ea44115ce3130f6c54c22f541943ac8e9900461edc2b8bd4"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dfbde38f38004703c35666a1e1c088b778e35d55348da2b7b278914491698d6a"}, + {file = "regex-2025.9.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2f422214a03fab16bfa495cfec72bee4aaa5731843b771860a471282f1bf74f"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a295916890f4df0902e4286bc7223ee7f9e925daa6dcdec4192364255b70561a"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5db95ff632dbabc8c38c4e82bf545ab78d902e81160e6e455598014f0abe66b9"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb967eb441b0f15ae610b7069bdb760b929f267efbf522e814bbbfffdf125ce2"}, + {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f04d2f20da4053d96c08f7fde6e1419b7ec9dbcee89c96e3d731fca77f411b95"}, + {file = "regex-2025.9.18-cp311-cp311-win32.whl", hash = "sha256:895197241fccf18c0cea7550c80e75f185b8bd55b6924fcae269a1a92c614a07"}, + {file = "regex-2025.9.18-cp311-cp311-win_amd64.whl", hash = "sha256:7e2b414deae99166e22c005e154a5513ac31493db178d8aec92b3269c9cce8c9"}, + {file = "regex-2025.9.18-cp311-cp311-win_arm64.whl", hash = "sha256:fb137ec7c5c54f34a25ff9b31f6b7b0c2757be80176435bf367111e3f71d72df"}, + {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:436e1b31d7efd4dcd52091d076482031c611dde58bf9c46ca6d0a26e33053a7e"}, + {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c190af81e5576b9c5fdc708f781a52ff20f8b96386c6e2e0557a78402b029f4a"}, + {file = "regex-2025.9.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4121f1ce2b2b5eec4b397cc1b277686e577e658d8f5870b7eb2d726bd2300ab"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:300e25dbbf8299d87205e821a201057f2ef9aa3deb29caa01cd2cac669e508d5"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b47fcf9f5316c0bdaf449e879407e1b9937a23c3b369135ca94ebc8d74b1742"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:57a161bd3acaa4b513220b49949b07e252165e6b6dc910ee7617a37ff4f5b425"}, + {file = "regex-2025.9.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f130c3a7845ba42de42f380fff3c8aebe89a810747d91bcf56d40a069f15352"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f96fa342b6f54dcba928dd452e8d8cb9f0d63e711d1721cd765bb9f73bb048d"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f0d676522d68c207828dcd01fb6f214f63f238c283d9f01d85fc664c7c85b56"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:40532bff8a1a0621e7903ae57fce88feb2e8a9a9116d341701302c9302aef06e"}, + {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:039f11b618ce8d71a1c364fdee37da1012f5a3e79b1b2819a9f389cd82fd6282"}, + {file = "regex-2025.9.18-cp312-cp312-win32.whl", hash = "sha256:e1dd06f981eb226edf87c55d523131ade7285137fbde837c34dc9d1bf309f459"}, + {file = "regex-2025.9.18-cp312-cp312-win_amd64.whl", hash = "sha256:3d86b5247bf25fa3715e385aa9ff272c307e0636ce0c9595f64568b41f0a9c77"}, + {file = "regex-2025.9.18-cp312-cp312-win_arm64.whl", hash = "sha256:032720248cbeeae6444c269b78cb15664458b7bb9ed02401d3da59fe4d68c3a5"}, + {file = "regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2"}, + {file = "regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb"}, + {file = "regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68"}, + {file = "regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23"}, + {file = "regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f"}, + {file = "regex-2025.9.18-cp313-cp313-win32.whl", hash = "sha256:3810a65675845c3bdfa58c3c7d88624356dd6ee2fc186628295e0969005f928d"}, + {file = "regex-2025.9.18-cp313-cp313-win_amd64.whl", hash = "sha256:16eaf74b3c4180ede88f620f299e474913ab6924d5c4b89b3833bc2345d83b3d"}, + {file = "regex-2025.9.18-cp313-cp313-win_arm64.whl", hash = "sha256:4dc98ba7dd66bd1261927a9f49bd5ee2bcb3660f7962f1ec02617280fc00f5eb"}, + {file = "regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2"}, + {file = "regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3"}, + {file = "regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef"}, + {file = "regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90"}, + {file = "regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7"}, + {file = "regex-2025.9.18-cp313-cp313t-win32.whl", hash = "sha256:168be0d2f9b9d13076940b1ed774f98595b4e3c7fc54584bba81b3cc4181742e"}, + {file = "regex-2025.9.18-cp313-cp313t-win_amd64.whl", hash = "sha256:d59ecf3bb549e491c8104fea7313f3563c7b048e01287db0a90485734a70a730"}, + {file = "regex-2025.9.18-cp313-cp313t-win_arm64.whl", hash = "sha256:dbef80defe9fb21310948a2595420b36c6d641d9bea4c991175829b2cc4bc06a"}, + {file = "regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129"}, + {file = "regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea"}, + {file = "regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203"}, + {file = "regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282"}, + {file = "regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773"}, + {file = "regex-2025.9.18-cp314-cp314-win32.whl", hash = "sha256:0c3506682ea19beefe627a38872d8da65cc01ffa25ed3f2e422dffa1474f0788"}, + {file = "regex-2025.9.18-cp314-cp314-win_amd64.whl", hash = "sha256:57929d0f92bebb2d1a83af372cd0ffba2263f13f376e19b1e4fa32aec4efddc3"}, + {file = "regex-2025.9.18-cp314-cp314-win_arm64.whl", hash = "sha256:6a4b44df31d34fa51aa5c995d3aa3c999cec4d69b9bd414a8be51984d859f06d"}, + {file = "regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306"}, + {file = "regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946"}, + {file = "regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3"}, + {file = "regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b"}, + {file = "regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41"}, + {file = "regex-2025.9.18-cp314-cp314t-win32.whl", hash = "sha256:2e1eddc06eeaffd249c0adb6fafc19e2118e6308c60df9db27919e96b5656096"}, + {file = "regex-2025.9.18-cp314-cp314t-win_amd64.whl", hash = "sha256:8620d247fb8c0683ade51217b459cb4a1081c0405a3072235ba43a40d355c09a"}, + {file = "regex-2025.9.18-cp314-cp314t-win_arm64.whl", hash = "sha256:b7531a8ef61de2c647cdf68b3229b071e46ec326b3138b2180acb4275f470b01"}, + {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3dbcfcaa18e9480669030d07371713c10b4f1a41f791ffa5cb1a99f24e777f40"}, + {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1e85f73ef7095f0380208269055ae20524bfde3f27c5384126ddccf20382a638"}, + {file = "regex-2025.9.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9098e29b3ea4ffffeade423f6779665e2a4f8db64e699c0ed737ef0db6ba7b12"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90b6b7a2d0f45b7ecaaee1aec6b362184d6596ba2092dd583ffba1b78dd0231c"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c81b892af4a38286101502eae7aec69f7cd749a893d9987a92776954f3943408"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3b524d010973f2e1929aeb635418d468d869a5f77b52084d9f74c272189c251d"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b498437c026a3d5d0be0020023ff76d70ae4d77118e92f6f26c9d0423452446"}, + {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0716e4d6e58853d83f6563f3cf25c281ff46cf7107e5f11879e32cb0b59797d9"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:065b6956749379d41db2625f880b637d4acc14c0a4de0d25d609a62850e96d36"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d4a691494439287c08ddb9b5793da605ee80299dd31e95fa3f323fac3c33d9d4"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ef8d10cc0989565bcbe45fb4439f044594d5c2b8919d3d229ea2c4238f1d55b0"}, + {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4baeb1b16735ac969a7eeecc216f1f8b7caf60431f38a2671ae601f716a32d25"}, + {file = "regex-2025.9.18-cp39-cp39-win32.whl", hash = "sha256:8e5f41ad24a1e0b5dfcf4c4e5d9f5bd54c895feb5708dd0c1d0d35693b24d478"}, + {file = "regex-2025.9.18-cp39-cp39-win_amd64.whl", hash = "sha256:50e8290707f2fb8e314ab3831e594da71e062f1d623b05266f8cfe4db4949afd"}, + {file = "regex-2025.9.18-cp39-cp39-win_arm64.whl", hash = "sha256:039a9d7195fd88c943d7c777d4941e8ef736731947becce773c31a1009cb3c35"}, + {file = "regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4"}, ] [[package]] @@ -2700,7 +2747,6 @@ version = "2.32.5" description = "Python HTTP for Humans." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, @@ -2722,7 +2768,6 @@ version = "0.26.0" description = "Make your functions return something meaningful, typed, and safe!" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] files = [ {file = "returns-0.26.0-py3-none-any.whl", hash = "sha256:7cae94c730d6c56ffd9d0f583f7a2c0b32cfe17d141837150c8e6cff3eb30d71"}, {file = "returns-0.26.0.tar.gz", hash = "sha256:180320e0f6e9ea9845330ccfc020f542330f05b7250941d9b9b7c00203fcc3da"}, @@ -2741,7 +2786,6 @@ version = "14.1.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" -groups = ["main"] files = [ {file = "rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f"}, {file = "rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8"}, @@ -2756,24 +2800,22 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rich-click" -version = "1.9.0" +version = "1.9.1" description = "Format click help output nicely with rich" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ - {file = "rich_click-1.9.0-py3-none-any.whl", hash = "sha256:28e6eb34a99c8c45eb910259078bc54dd78cf6f18cc75cb77a50012a98458664"}, - {file = "rich_click-1.9.0.tar.gz", hash = "sha256:212a19875b1e485803a5448130a9157b04c0d0befcc2bc29cb64d3577b93b005"}, + {file = "rich_click-1.9.1-py3-none-any.whl", hash = "sha256:ea6114a9e081b7d68cc07b315070398f806f01bb0e0c49da56f129e672877817"}, + {file = "rich_click-1.9.1.tar.gz", hash = "sha256:4f2620589d7287f86265432e6a909de4f281de909fe68d8c835fbba49265d268"}, ] [package.dependencies] click = ">=8" rich = ">=12" -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} [package.extras] dev = ["inline-snapshot (>=0.24)", "jsonschema (>=4)", "mypy (>=1.14.1)", "nodeenv (>=1.9.1)", "packaging (>=25)", "pre-commit (>=3.5)", "pytest (>=8.3.5)", "pytest-cov (>=5)", "rich-codex (>=1.2.11)", "ruff (>=0.12.4)", "typer (>=0.15)", "types-setuptools (>=75.8.0.20250110)"] -docs = ["markdown-include (>=0.8.1)", "mike (>=2.1.3)", "mkdocs-github-admonitions-plugin (>=0.1.1)", "mkdocs-glightbox (>=0.4)", "mkdocs-include-markdown-plugin (>=7.1.7) ; python_version >= \"3.9\"", "mkdocs-material-extensions (>=1.3.1)", "mkdocs-material[imaging] (>=9.5.18,<9.6.0)", "mkdocs-redirects (>=1.2.2)", "mkdocs-rss-plugin (>=1.15)", "mkdocs[docs] (>=1.6.1)", "mkdocstrings[python] (>=0.26.1)", "rich-codex (>=1.2.11)", "typer (>=0.15)"] +docs = ["markdown-include (>=0.8.1)", "mike (>=2.1.3)", "mkdocs-github-admonitions-plugin (>=0.1.1)", "mkdocs-glightbox (>=0.4)", "mkdocs-include-markdown-plugin (>=7.1.7)", "mkdocs-material-extensions (>=1.3.1)", "mkdocs-material[imaging] (>=9.5.18,<9.6.0)", "mkdocs-redirects (>=1.2.2)", "mkdocs-rss-plugin (>=1.15)", "mkdocs[docs] (>=1.6.1)", "mkdocstrings[python] (>=0.26.1)", "rich-codex (>=1.2.11)", "typer (>=0.15)"] [[package]] name = "rlp" @@ -2781,7 +2823,6 @@ version = "4.1.0" description = "rlp: A package for Recursive Length Prefix encoding and decoding" optional = false python-versions = "<4,>=3.8" -groups = ["main"] files = [ {file = "rlp-4.1.0-py3-none-any.whl", hash = "sha256:8eca394c579bad34ee0b937aecb96a57052ff3716e19c7a578883e767bc5da6f"}, {file = "rlp-4.1.0.tar.gz", hash = "sha256:be07564270a96f3e225e2c107db263de96b5bc1f27722d2855bd3459a08e95a9"}, @@ -2802,7 +2843,6 @@ version = "0.27.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef"}, {file = "rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be"}, @@ -2963,31 +3003,30 @@ files = [ [[package]] name = "ruff" -version = "0.13.0" +version = "0.13.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "ruff-0.13.0-py3-none-linux_armv6l.whl", hash = "sha256:137f3d65d58ee828ae136a12d1dc33d992773d8f7644bc6b82714570f31b2004"}, - {file = "ruff-0.13.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:21ae48151b66e71fd111b7d79f9ad358814ed58c339631450c66a4be33cc28b9"}, - {file = "ruff-0.13.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:64de45f4ca5441209e41742d527944635a05a6e7c05798904f39c85bafa819e3"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b2c653ae9b9d46e0ef62fc6fbf5b979bda20a0b1d2b22f8f7eb0cde9f4963b8"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cec632534332062bc9eb5884a267b689085a1afea9801bf94e3ba7498a2d207"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcd628101d9f7d122e120ac7c17e0a0f468b19bc925501dbe03c1cb7f5415b24"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afe37db8e1466acb173bb2a39ca92df00570e0fd7c94c72d87b51b21bb63efea"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f96a8d90bb258d7d3358b372905fe7333aaacf6c39e2408b9f8ba181f4b6ef2"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b5e3d883e4f924c5298e3f2ee0f3085819c14f68d1e5b6715597681433f153"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03447f3d18479df3d24917a92d768a89f873a7181a064858ea90a804a7538991"}, - {file = "ruff-0.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fbc6b1934eb1c0033da427c805e27d164bb713f8e273a024a7e86176d7f462cf"}, - {file = "ruff-0.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a8ab6a3e03665d39d4a25ee199d207a488724f022db0e1fe4002968abdb8001b"}, - {file = "ruff-0.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2a5c62f8ccc6dd2fe259917482de7275cecc86141ee10432727c4816235bc41"}, - {file = "ruff-0.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b7b85ca27aeeb1ab421bc787009831cffe6048faae08ad80867edab9f2760945"}, - {file = "ruff-0.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:79ea0c44a3032af768cabfd9616e44c24303af49d633b43e3a5096e009ebe823"}, - {file = "ruff-0.13.0-py3-none-win32.whl", hash = "sha256:4e473e8f0e6a04e4113f2e1de12a5039579892329ecc49958424e5568ef4f768"}, - {file = "ruff-0.13.0-py3-none-win_amd64.whl", hash = "sha256:48e5c25c7a3713eea9ce755995767f4dcd1b0b9599b638b12946e892123d1efb"}, - {file = "ruff-0.13.0-py3-none-win_arm64.whl", hash = "sha256:ab80525317b1e1d38614addec8ac954f1b3e662de9d59114ecbf771d00cf613e"}, - {file = "ruff-0.13.0.tar.gz", hash = "sha256:5b4b1ee7eb35afae128ab94459b13b2baaed282b1fb0f472a73c82c996c8ae60"}, +files = [ + {file = "ruff-0.13.2-py3-none-linux_armv6l.whl", hash = "sha256:3796345842b55f033a78285e4f1641078f902020d8450cade03aad01bffd81c3"}, + {file = "ruff-0.13.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ff7e4dda12e683e9709ac89e2dd436abf31a4d8a8fc3d89656231ed808e231d2"}, + {file = "ruff-0.13.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c75e9d2a2fafd1fdd895d0e7e24b44355984affdde1c412a6f6d3f6e16b22d46"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cceac74e7bbc53ed7d15d1042ffe7b6577bf294611ad90393bf9b2a0f0ec7cb6"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae3f469b5465ba6d9721383ae9d49310c19b452a161b57507764d7ef15f4b07"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f8f9e3cd6714358238cd6626b9d43026ed19c0c018376ac1ef3c3a04ffb42d8"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c6ed79584a8f6cbe2e5d7dbacf7cc1ee29cbdb5df1172e77fbdadc8bb85a1f89"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aed130b2fde049cea2019f55deb939103123cdd191105f97a0599a3e753d61b0"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1887c230c2c9d65ed1b4e4cfe4d255577ea28b718ae226c348ae68df958191aa"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5bcb10276b69b3cfea3a102ca119ffe5c6ba3901e20e60cf9efb53fa417633c3"}, + {file = "ruff-0.13.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:afa721017aa55a555b2ff7944816587f1cb813c2c0a882d158f59b832da1660d"}, + {file = "ruff-0.13.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1dbc875cf3720c64b3990fef8939334e74cb0ca65b8dbc61d1f439201a38101b"}, + {file = "ruff-0.13.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939a1b2a960e9742e9a347e5bbc9b3c3d2c716f86c6ae273d9cbd64f193f22"}, + {file = "ruff-0.13.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:50e2d52acb8de3804fc5f6e2fa3ae9bdc6812410a9e46837e673ad1f90a18736"}, + {file = "ruff-0.13.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3196bc13ab2110c176b9a4ae5ff7ab676faaa1964b330a1383ba20e1e19645f2"}, + {file = "ruff-0.13.2-py3-none-win32.whl", hash = "sha256:7c2a0b7c1e87795fec3404a485096bcd790216c7c146a922d121d8b9c8f1aaac"}, + {file = "ruff-0.13.2-py3-none-win_amd64.whl", hash = "sha256:17d95fb32218357c89355f6f6f9a804133e404fc1f65694372e02a557edf8585"}, + {file = "ruff-0.13.2-py3-none-win_arm64.whl", hash = "sha256:da711b14c530412c827219312b7d7fbb4877fb31150083add7e8c5336549cea7"}, + {file = "ruff-0.13.2.tar.gz", hash = "sha256:cb12fffd32fb16d32cef4ed16d8c7cdc27ed7c944eaa98d99d01ab7ab0b710ff"}, ] [[package]] @@ -2996,19 +3035,95 @@ version = "0.7.7" description = "Simple data validation library" optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "schema-0.7.7-py2.py3-none-any.whl", hash = "sha256:5d976a5b50f36e74e2157b47097b60002bd4d42e65425fcc9c9befadb4255dde"}, {file = "schema-0.7.7.tar.gz", hash = "sha256:7da553abd2958a19dc2547c388cde53398b39196175a9be59ea1caf5ab0a1807"}, ] +[[package]] +name = "scipy" +version = "1.16.2" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.11" +files = [ + {file = "scipy-1.16.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6ab88ea43a57da1af33292ebd04b417e8e2eaf9d5aa05700be8d6e1b6501cd92"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c95e96c7305c96ede73a7389f46ccd6c659c4da5ef1b2789466baeaed3622b6e"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:87eb178db04ece7c698220d523c170125dbffebb7af0345e66c3554f6f60c173"}, + {file = "scipy-1.16.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:4e409eac067dcee96a57fbcf424c13f428037827ec7ee3cb671ff525ca4fc34d"}, + {file = "scipy-1.16.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e574be127bb760f0dad24ff6e217c80213d153058372362ccb9555a10fc5e8d2"}, + {file = "scipy-1.16.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5db5ba6188d698ba7abab982ad6973265b74bb40a1efe1821b58c87f73892b9"}, + {file = "scipy-1.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec6e74c4e884104ae006d34110677bfe0098203a3fec2f3faf349f4cb05165e3"}, + {file = "scipy-1.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912f46667d2d3834bc3d57361f854226475f695eb08c08a904aadb1c936b6a88"}, + {file = "scipy-1.16.2-cp311-cp311-win_amd64.whl", hash = "sha256:91e9e8a37befa5a69e9cacbe0bcb79ae5afb4a0b130fd6db6ee6cc0d491695fa"}, + {file = "scipy-1.16.2-cp311-cp311-win_arm64.whl", hash = "sha256:f3bf75a6dcecab62afde4d1f973f1692be013110cad5338007927db8da73249c"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0"}, + {file = "scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232"}, + {file = "scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1"}, + {file = "scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f"}, + {file = "scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef"}, + {file = "scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1"}, + {file = "scipy-1.16.2-cp312-cp312-win_amd64.whl", hash = "sha256:0ce54e07bbb394b417457409a64fd015be623f36e330ac49306433ffe04bc97e"}, + {file = "scipy-1.16.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a8ffaa4ac0df81a0b94577b18ee079f13fecdb924df3328fc44a7dc5ac46851"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5"}, + {file = "scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925"}, + {file = "scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9"}, + {file = "scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7"}, + {file = "scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb"}, + {file = "scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e"}, + {file = "scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c"}, + {file = "scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f"}, + {file = "scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4"}, + {file = "scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21"}, + {file = "scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7"}, + {file = "scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8"}, + {file = "scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472"}, + {file = "scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351"}, + {file = "scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88"}, + {file = "scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f"}, + {file = "scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb"}, + {file = "scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7"}, + {file = "scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548"}, + {file = "scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936"}, + {file = "scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff"}, + {file = "scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831"}, + {file = "scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3"}, + {file = "scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac"}, + {file = "scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374"}, + {file = "scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6"}, + {file = "scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c"}, + {file = "scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9"}, + {file = "scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779"}, + {file = "scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b"}, +] + +[package.dependencies] +numpy = ">=1.25.2,<2.6" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "semver" version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -3020,20 +3135,138 @@ version = "75.9.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "setuptools-75.9.1-py3-none-any.whl", hash = "sha256:0a6f876d62f4d978ca1a11ab4daf728d1357731f978543ff18ecdbf9fd071f73"}, {file = "setuptools-75.9.1.tar.gz", hash = "sha256:b6eca2c3070cdc82f71b4cb4bb2946bc0760a210d11362278cf1ff394e6ea32c"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "simplejson" +version = "3.20.2" +description = "Simple, fast, extensible JSON encoder/decoder for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" +files = [ + {file = "simplejson-3.20.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:11847093fd36e3f5a4f595ff0506286c54885f8ad2d921dfb64a85bce67f72c4"}, + {file = "simplejson-3.20.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d291911d23b1ab8eb3241204dd54e3ec60ddcd74dfcb576939d3df327205865"}, + {file = "simplejson-3.20.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:da6d16d7108d366bbbf1c1f3274662294859c03266e80dd899fc432598115ea4"}, + {file = "simplejson-3.20.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9ddf9a07694c5bbb4856271cbc4247cc6cf48f224a7d128a280482a2f78bae3d"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:3a0d2337e490e6ab42d65a082e69473717f5cc75c3c3fb530504d3681c4cb40c"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8ba88696351ed26a8648f8378a1431223f02438f8036f006d23b4f5b572778fa"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:00bcd408a4430af99d1f8b2b103bb2f5133bb688596a511fcfa7db865fbb845e"}, + {file = "simplejson-3.20.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4fc62feb76f590ccaff6f903f52a01c58ba6423171aa117b96508afda9c210f0"}, + {file = "simplejson-3.20.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6d7286dc11af60a2f76eafb0c2acde2d997e87890e37e24590bb513bec9f1bc5"}, + {file = "simplejson-3.20.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01379b4861c3b0aa40cba8d44f2b448f5743999aa68aaa5d3ef7049d4a28a2d"}, + {file = "simplejson-3.20.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16b029ca25645b3bc44e84a4f941efa51bf93c180b31bd704ce6349d1fc77c1"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e22a5fb7b1437ffb057e02e1936a3bfb19084ae9d221ec5e9f4cf85f69946b6"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b6ff02fc7b8555c906c24735908854819b0d0dc85883d453e23ca4c0445d01"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2bfc1c396ad972ba4431130b42307b2321dba14d988580c1ac421ec6a6b7cee3"}, + {file = "simplejson-3.20.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a97249ee1aee005d891b5a211faf58092a309f3d9d440bc269043b08f662eda"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f1036be00b5edaddbddbb89c0f80ed229714a941cfd21e51386dc69c237201c2"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5d6f5bacb8cdee64946b45f2680afa3f54cd38e62471ceda89f777693aeca4e4"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8db6841fb796ec5af632f677abf21c6425a1ebea0d9ac3ef1a340b8dc69f52b8"}, + {file = "simplejson-3.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0a341f7cc2aae82ee2b31f8a827fd2e51d09626f8b3accc441a6907c88aedb7"}, + {file = "simplejson-3.20.2-cp310-cp310-win32.whl", hash = "sha256:27f9c01a6bc581d32ab026f515226864576da05ef322d7fc141cd8a15a95ce53"}, + {file = "simplejson-3.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0a63ec98a4547ff366871bf832a7367ee43d047bcec0b07b66c794e2137b476"}, + {file = "simplejson-3.20.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:06190b33cd7849efc413a5738d3da00b90e4a5382fd3d584c841ac20fb828c6f"}, + {file = "simplejson-3.20.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ad4eac7d858947a30d2c404e61f16b84d16be79eb6fb316341885bdde864fa8"}, + {file = "simplejson-3.20.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b392e11c6165d4a0fde41754a0e13e1d88a5ad782b245a973dd4b2bdb4e5076a"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51eccc4e353eed3c50e0ea2326173acdc05e58f0c110405920b989d481287e51"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:306e83d7c331ad833d2d43c76a67f476c4b80c4a13334f6e34bb110e6105b3bd"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f820a6ac2ef0bc338ae4963f4f82ccebdb0824fe9caf6d660670c578abe01013"}, + {file = "simplejson-3.20.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e7a066528a5451433eb3418184f05682ea0493d14e9aae690499b7e1eb6b81"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:438680ddde57ea87161a4824e8de04387b328ad51cfdf1eaf723623a3014b7aa"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cac78470ae68b8d8c41b6fca97f5bf8e024ca80d5878c7724e024540f5cdaadb"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7524e19c2da5ef281860a3d74668050c6986be15c9dd99966034ba47c68828c2"}, + {file = "simplejson-3.20.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e9b6d845a603b2eef3394eb5e21edb8626cd9ae9a8361d14e267eb969dbe413"}, + {file = "simplejson-3.20.2-cp311-cp311-win32.whl", hash = "sha256:47d8927e5ac927fdd34c99cc617938abb3624b06ff86e8e219740a86507eb961"}, + {file = "simplejson-3.20.2-cp311-cp311-win_amd64.whl", hash = "sha256:ba4edf3be8e97e4713d06c3d302cba1ff5c49d16e9d24c209884ac1b8455520c"}, + {file = "simplejson-3.20.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4376d5acae0d1e91e78baeba4ee3cf22fbf6509d81539d01b94e0951d28ec2b6"}, + {file = "simplejson-3.20.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f8fe6de652fcddae6dec8f281cc1e77e4e8f3575249e1800090aab48f73b4259"}, + {file = "simplejson-3.20.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25ca2663d99328d51e5a138f22018e54c9162438d831e26cfc3458688616eca8"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12a6b2816b6cab6c3fd273d43b1948bc9acf708272074c8858f579c394f4cbc9"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac20dc3fcdfc7b8415bfc3d7d51beccd8695c3f4acb7f74e3a3b538e76672868"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db0804d04564e70862ef807f3e1ace2cc212ef0e22deb1b3d6f80c45e5882c6b"}, + {file = "simplejson-3.20.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:979ce23ea663895ae39106946ef3d78527822d918a136dbc77b9e2b7f006237e"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a2ba921b047bb029805726800819675249ef25d2f65fd0edb90639c5b1c3033c"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:12d3d4dc33770069b780cc8f5abef909fe4a3f071f18f55f6d896a370fd0f970"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aff032a59a201b3683a34be1169e71ddda683d9c3b43b261599c12055349251e"}, + {file = "simplejson-3.20.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30e590e133b06773f0dc9c3f82e567463df40598b660b5adf53eb1c488202544"}, + {file = "simplejson-3.20.2-cp312-cp312-win32.whl", hash = "sha256:8d7be7c99939cc58e7c5bcf6bb52a842a58e6c65e1e9cdd2a94b697b24cddb54"}, + {file = "simplejson-3.20.2-cp312-cp312-win_amd64.whl", hash = "sha256:2c0b4a67e75b945489052af6590e7dca0ed473ead5d0f3aad61fa584afe814ab"}, + {file = "simplejson-3.20.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90d311ba8fcd733a3677e0be21804827226a57144130ba01c3c6a325e887dd86"}, + {file = "simplejson-3.20.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:feed6806f614bdf7f5cb6d0123cb0c1c5f40407ef103aa935cffaa694e2e0c74"}, + {file = "simplejson-3.20.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6b1d8d7c3e1a205c49e1aee6ba907dcb8ccea83651e6c3e2cb2062f1e52b0726"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:552f55745044a24c3cb7ec67e54234be56d5d6d0e054f2e4cf4fb3e297429be5"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2da97ac65165d66b0570c9e545786f0ac7b5de5854d3711a16cacbcaa8c472d"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f59a12966daa356bf68927fca5a67bebac0033cd18b96de9c2d426cd11756cd0"}, + {file = "simplejson-3.20.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133ae2098a8e162c71da97cdab1f383afdd91373b7ff5fe65169b04167da976b"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7977640af7b7d5e6a852d26622057d428706a550f7f5083e7c4dd010a84d941f"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b530ad6d55e71fa9e93e1109cf8182f427a6355848a4ffa09f69cc44e1512522"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bd96a7d981bf64f0e42345584768da4435c05b24fd3c364663f5fbc8fabf82e3"}, + {file = "simplejson-3.20.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f28ee755fadb426ba2e464d6fcf25d3f152a05eb6b38e0b4f790352f5540c769"}, + {file = "simplejson-3.20.2-cp313-cp313-win32.whl", hash = "sha256:472785b52e48e3eed9b78b95e26a256f59bb1ee38339be3075dad799e2e1e661"}, + {file = "simplejson-3.20.2-cp313-cp313-win_amd64.whl", hash = "sha256:a1a85013eb33e4820286139540accbe2c98d2da894b2dcefd280209db508e608"}, + {file = "simplejson-3.20.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a135941a50795c934bdc9acc74e172b126e3694fe26de3c0c1bc0b33ea17e6ce"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ba488decb18738f5d6bd082018409689ed8e74bc6c4d33a0b81af6edf1c9f4"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d81f8e982923d5e9841622ff6568be89756428f98a82c16e4158ac32b92a3787"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdad497ccb1edc5020bef209e9c3e062a923e8e6fca5b8a39f0fb34380c8a66c"}, + {file = "simplejson-3.20.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a3f1db97bcd9fb592928159af7a405b18df7e847cbcc5682a209c5b2ad5d6b1"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:215b65b0dc2c432ab79c430aa4f1e595f37b07a83c1e4c4928d7e22e6b49a748"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:ece4863171ba53f086a3bfd87f02ec3d6abc586f413babfc6cf4de4d84894620"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:4a76d7c47d959afe6c41c88005f3041f583a4b9a1783cf341887a3628a77baa0"}, + {file = "simplejson-3.20.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:e9b0523582a57d9ea74f83ecefdffe18b2b0a907df1a9cef06955883341930d8"}, + {file = "simplejson-3.20.2-cp36-cp36m-win32.whl", hash = "sha256:16366591c8e08a4ac76b81d76a3fc97bf2bcc234c9c097b48d32ea6bfe2be2fe"}, + {file = "simplejson-3.20.2-cp36-cp36m-win_amd64.whl", hash = "sha256:732cf4c4ac1a258b4e9334e1e40a38303689f432497d3caeb491428b7547e782"}, + {file = "simplejson-3.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6c3a98e21e5f098e4f982ef302ebb1e681ff16a5d530cfce36296bea58fe2396"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10cf9ca1363dc3711c72f4ec7c1caed2bbd9aaa29a8d9122e31106022dc175c6"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:106762f8aedf3fc3364649bfe8dc9a40bf5104f872a4d2d86bae001b1af30d30"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b21659898b7496322e99674739193f81052e588afa8b31b6a1c7733d8829b925"}, + {file = "simplejson-3.20.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78fa1db6a02bca88829f2b2057c76a1d2dc2fccb8c5ff1199e352f213e9ec719"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:156139d94b660448ec8a4ea89f77ec476597f752c2ff66432d3656704c66b40e"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:b2620ac40be04dff08854baf6f4df10272f67079f61ed1b6274c0e840f2e2ae1"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:9ccef5b5d3e3ac5d9da0a0ca1d2de8cf2b0fb56b06aa0ab79325fa4bcc5a1d60"}, + {file = "simplejson-3.20.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f526304c2cc9fd8b8d18afacb75bc171650f83a7097b2c92ad6a431b5d7c1b72"}, + {file = "simplejson-3.20.2-cp37-cp37m-win32.whl", hash = "sha256:e0f661105398121dd48d9987a2a8f7825b8297b3b2a7fe5b0d247370396119d5"}, + {file = "simplejson-3.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dab98625b3d6821e77ea59c4d0e71059f8063825a0885b50ed410e5c8bd5cb66"}, + {file = "simplejson-3.20.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b8205f113082e7d8f667d6cd37d019a7ee5ef30b48463f9de48e1853726c6127"}, + {file = "simplejson-3.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fc8da64929ef0ff16448b602394a76fd9968a39afff0692e5ab53669df1f047f"}, + {file = "simplejson-3.20.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfe704864b5fead4f21c8d448a89ee101c9b0fc92a5f40b674111da9272b3a90"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40ca7cbe7d2f423b97ed4e70989ef357f027a7e487606628c11b79667639dc84"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cec1868b237fe9fb2d466d6ce0c7b772e005aadeeda582d867f6f1ec9710cad"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:792debfba68d8dd61085ffb332d72b9f5b38269cda0c99f92c7a054382f55246"}, + {file = "simplejson-3.20.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e022b2c4c54cb4855e555f64aa3377e3e5ca912c372fa9e3edcc90ebbad93dce"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5de26f11d5aca575d3825dddc65f69fdcba18f6ca2b4db5cef16f41f969cef15"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e2162b2a43614727ec3df75baeda8881ab129824aa1b49410d4b6c64f55a45b4"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e11a1d6b2f7e72ca546bdb4e6374b237ebae9220e764051b867111df83acbd13"}, + {file = "simplejson-3.20.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:daf7cd18fe99eb427fa6ddb6b437cfde65125a96dc27b93a8969b6fe90a1dbea"}, + {file = "simplejson-3.20.2-cp38-cp38-win32.whl", hash = "sha256:da795ea5f440052f4f497b496010e2c4e05940d449ea7b5c417794ec1be55d01"}, + {file = "simplejson-3.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:6a4b5e7864f952fcce4244a70166797d7b8fd6069b4286d3e8403c14b88656b6"}, + {file = "simplejson-3.20.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b3bf76512ccb07d47944ebdca44c65b781612d38b9098566b4bb40f713fc4047"}, + {file = "simplejson-3.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:214e26acf2dfb9ff3314e65c4e168a6b125bced0e2d99a65ea7b0f169db1e562"}, + {file = "simplejson-3.20.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2fb1259ca9c385b0395bad59cdbf79535a5a84fb1988f339a49bfbc57455a35a"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34e028a2ba8553a208ded1da5fa8501833875078c4c00a50dffc33622057881"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b538f9d9e503b0dd43af60496780cb50755e4d8e5b34e5647b887675c1ae9fee"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab998e416ded6c58f549a22b6a8847e75a9e1ef98eb9fbb2863e1f9e61a4105b"}, + {file = "simplejson-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a8f1c307edf5fbf0c6db3396c5d3471409c4a40c7a2a466fbc762f20d46601a"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5a7bbac80bdb82a44303f5630baee140aee208e5a4618e8b9fde3fc400a42671"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5ef70ec8fe1569872e5a3e4720c1e1dcb823879a3c78bc02589eb88fab920b1f"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:cb11c09c99253a74c36925d461c86ea25f0140f3b98ff678322734ddc0f038d7"}, + {file = "simplejson-3.20.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:66f7c78c6ef776f8bd9afaad455e88b8197a51e95617bcc44b50dd974a7825ba"}, + {file = "simplejson-3.20.2-cp39-cp39-win32.whl", hash = "sha256:619ada86bfe3a5aa02b8222ca6bfc5aa3e1075c1fb5b3263d24ba579382df472"}, + {file = "simplejson-3.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:44a6235e09ca5cc41aa5870a952489c06aa4aee3361ae46daa947d8398e57502"}, + {file = "simplejson-3.20.2-py3-none-any.whl", hash = "sha256:3b6bb7fb96efd673eac2e4235200bfffdc2353ad12c54117e1e4e2fc485ac017"}, + {file = "simplejson-3.20.2.tar.gz", hash = "sha256:5fe7a6ce14d1c300d80d08695b7f7e633de6cd72c80644021874d985b3393649"}, +] [[package]] name = "six" @@ -3041,7 +3274,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -3053,7 +3285,6 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -3068,7 +3299,6 @@ version = "6.11.0" description = "Bump software releases" optional = false python-versions = ">=3.7,<4.0" -groups = ["dev"] files = [ {file = "tbump-6.11.0-py3-none-any.whl", hash = "sha256:6b181fe6f3ae84ce0b9af8cc2009a8bca41ded34e73f623a7413b9684f1b4526"}, {file = "tbump-6.11.0.tar.gz", hash = "sha256:385e710eedf0a8a6ff959cf1e9f3cfd17c873617132fc0ec5f629af0c355c870"}, @@ -3086,8 +3316,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version <= \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -3129,7 +3357,6 @@ version = "0.11.8" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, @@ -3141,8 +3368,6 @@ version = "1.0.0" description = "List processing tools and functional utilities" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "implementation_name == \"cpython\" or implementation_name == \"pypy\"" files = [ {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, @@ -3154,7 +3379,6 @@ version = "4.4.4" description = "Run-time type checker for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e"}, {file = "typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74"}, @@ -3169,7 +3393,6 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -3177,14 +3400,13 @@ files = [ [[package]] name = "typing-inspection" -version = "0.4.1" +version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ - {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, - {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, ] [package.dependencies] @@ -3196,7 +3418,6 @@ version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["main"] files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -3208,7 +3429,6 @@ version = "1.4.0" description = "ASCII transliterations of Unicode text" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021"}, {file = "Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23"}, @@ -3220,14 +3440,13 @@ version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -3238,7 +3457,6 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -3281,7 +3499,6 @@ version = "6.11.0" description = "web3.py" optional = false python-versions = ">=3.7.2" -groups = ["main"] files = [ {file = "web3-6.11.0-py3-none-any.whl", hash = "sha256:44e79da6a4765eacf137f2f388e37aa0c1e24a93bdfb462cffe9441d1be3d509"}, {file = "web3-6.11.0.tar.gz", hash = "sha256:050dea52ae73d787272e7ecba7249f096595938c90cce1a384c20375c6b0f720"}, @@ -3305,34 +3522,18 @@ typing-extensions = ">=4.0.1" websockets = ">=10.0.0" [package.extras] -dev = ["black (>=22.1.0)", "build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (==v0.9.1-b.1)", "flake8 (==3.8.3)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0) ; python_version < \"3.8\"", "ipfshttpclient (==0.8.0a2)", "isort (>=5.11.0)", "mypy (==1.4.1)", "py-geth (>=3.11.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)", "when-changed (>=0.3.0)"] +dev = ["black (>=22.1.0)", "build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (==v0.9.1-b.1)", "flake8 (==3.8.3)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "isort (>=5.11.0)", "mypy (==1.4.1)", "py-geth (>=3.11.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)", "when-changed (>=0.3.0)"] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] ipfs = ["ipfshttpclient (==0.8.0a2)"] linter = ["black (>=22.1.0)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==1.4.1)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)"] tester = ["eth-tester[py-evm] (==v0.9.1-b.1)", "py-geth (>=3.11.0)"] -[[package]] -name = "websocket-client" -version = "0.59.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main"] -files = [ - {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, - {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, -] - -[package.dependencies] -six = "*" - [[package]] name = "websockets" version = "15.0.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, @@ -3411,7 +3612,6 @@ version = "1.20.1" description = "Yet another URL library" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4"}, {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a"}, @@ -3525,6 +3725,6 @@ multidict = ">=4.0" propcache = ">=0.2.1" [metadata] -lock-version = "2.1" -python-versions = ">=3.10,<=3.12" -content-hash = "a866f9946e573fcaf033f95da79733a58681ca67bdefd6223939b9770514e697" +lock-version = "2.0" +python-versions = ">=3.11,<=3.13" +content-hash = "addc18864f5a0345bedc9e45149f90339b9daaaeceede2f91ae321ee7207933f" diff --git a/pyproject.toml b/pyproject.toml index 3fe52c88..13c2d9bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,10 +7,9 @@ readme = "README.md" packages = [{ include = "derive_client" }] [tool.poetry.dependencies] -python = ">=3.10,<=3.12" +python = ">=3.11,<=3.13" requests = "^2" web3 = { version = ">=6,<8" } -websocket-client = ">=0.32.0,<1" setuptools = ">=68.2.2,<80" rich-click = "^1.7.1" python-dotenv = ">=0.14.0,<2" @@ -21,6 +20,8 @@ pydantic = "^2.11.3" aiolimiter = "^1.2.1" returns = "^0.26.0" eth-typing = "<5" +py-vollib = "^1.0.1" +msgspec = "^0.19.0" [tool.poetry.scripts] drv = "derive_client.cli:cli" @@ -70,10 +71,10 @@ select = [ "W", # pycodestyle warnings "F", # pyflakes "I", # isort + "SIM", # flake8-simplify # "B", # flake8-bugbear # "UP", # pyupgrade # "C4", # flake8-comprehensions -# "SIM", # flake8-simplify # "PT", # flake8-pytest-style (if you use pytest) # "RUF", # Ruff-specific rules ] diff --git a/scripts/create_new_pk.py b/scripts/create_new_pk.py new file mode 100644 index 00000000..fd20aa5a --- /dev/null +++ b/scripts/create_new_pk.py @@ -0,0 +1,18 @@ +""" +Helpful script to create a new ethereum key pair. +""" + +from eth_account import Account + + +def main(): + """ + Create a new ethereum key pair and print it to the console. + """ + account = Account.create() + print(f"Address: {account.address}") + print(f"Private Key: {account.key.hex()}") + + +if __name__ == "__main__": + main() diff --git a/scripts/generate-models.py b/scripts/generate-models.py index 7e54e2d7..8be56f4d 100644 --- a/scripts/generate-models.py +++ b/scripts/generate-models.py @@ -1,3 +1,4 @@ +import ast import json import re from pathlib import Path @@ -8,6 +9,7 @@ from urllib3.util.retry import Retry TIMEOUT = 10 +CUSTOM_HEADER = "# ruff: noqa: E741" def make_session_with_retries( @@ -30,7 +32,7 @@ def make_session_with_retries( return session -def download_openapi_specs(base_url: str, dest_dir: Path) -> list[Path]: +def download_openapi_specs(openapi_specs_path: str, base_url: str, dest_dir: Path) -> list[Path]: dest_dir.mkdir(parents=True, exist_ok=True) index_url = f"{base_url}/openapi" @@ -57,7 +59,6 @@ def download_openapi_specs(base_url: str, dest_dir: Path) -> list[Path]: file_path.write_text(json.dumps(resp.json(), indent=2)) saved_files.append(file_path) print(f"Saved OpenAPI spec at: {file_path}") - return saved_files @@ -67,7 +68,7 @@ def generate_models(input_path: Path, output_path: Path): input_=input_path, input_file_type=InputFileType.OpenAPI, output=output_path, - output_model_type=DataModelType.DataclassesDataclass, + output_model_type=DataModelType.MsgspecStruct, target_python_version=PythonVersion.PY_311, reuse_model=True, use_subclass_enum=True, @@ -75,14 +76,98 @@ def generate_models(input_path: Path, output_path: Path): use_double_quotes=True, field_constraints=True, disable_timestamp=True, - custom_file_header="# ruff: noqa: E741" + custom_file_header=CUSTOM_HEADER, ) print(f"Models generated at: {output_path}") +def patch_pagination_to_optional(path: Path) -> None: + print("Patching models.py to make pagination optional") + code = path.read_text() + # Pydantic v2 and dataclasses + code = re.sub( + r"(\s)pagination:\s*PaginationInfoSchema(\s*(#.*)?$)", + r"\1pagination: PaginationInfoSchema | None = None\2", + code, + flags=re.MULTILINE, + ) + path.write_text(code) + + +def is_annassign(stmt: ast.stmt) -> bool: + return isinstance(stmt, ast.AnnAssign) and isinstance(stmt.target, ast.Name) + + +def field_name(stmt: ast.AnnAssign) -> str | None: + return stmt.target.id if isinstance(stmt.target, ast.Name) else None + + +def is_defaulted(stmt: ast.AnnAssign) -> bool: + # x: T = ... + return stmt.value is None + + +def reorder_fields(body: list[ast.stmt]) -> list[ast.stmt]: + fields: list[ast.AnnAssign] = [] + others: list[ast.stmt] = [] + + for s in body: + if is_annassign(s): + fields.append(s) # type: ignore[arg-type] + else: + others.append(s) + + if not fields: + return body + + non_defaults = [f for f in fields if not is_defaulted(f)] + defaults = [f for f in fields if is_defaulted(f)] + + reordered_fields = defaults + non_defaults + return reordered_fields + others + + +class OptionalRewriter(ast.NodeTransformer): + def visit_ClassDef(self, node: ast.ClassDef) -> ast.AST: + self.generic_visit(node) + if not is_struct_class(node): + return node + node.body = reorder_fields(node.body) + return node + + +def patch_code(src: str) -> str: + tree = ast.parse(src) + tree = OptionalRewriter().visit(tree) + ast.fix_missing_locations(tree) + return ast.unparse(tree) + + +def patch_file(path: Path) -> None: + code = path.read_text() + new_code = CUSTOM_HEADER + "\n" + patch_code(code) + if new_code != code: + path.write_text(new_code) + + +def is_struct_class(node: ast.ClassDef) -> bool: + for base in node.bases: + if ( + isinstance(base, ast.Name) + and base.id == "Struct" + or isinstance(base, ast.Attribute) + and base.attr == "Struct" + ): + return True + return False + + if __name__ == "__main__": base_url = "https://docs.derive.xyz" repo_root = Path(__file__).parent.parent input_path = Path("openapi-spec.json") output_path = repo_root / "derive_client" / "data" / "generated" / "models.py" generate_models(input_path=input_path, output_path=output_path) + patch_pagination_to_optional(output_path) + patch_file(output_path) + print("Done.") diff --git a/scripts/get_voliltility.py b/scripts/get_voliltility.py new file mode 100644 index 00000000..03ca18d4 --- /dev/null +++ b/scripts/get_voliltility.py @@ -0,0 +1,141 @@ +""" +Get the volatility of a BTC. +""" + +# curl -X GET "https://test.deribit.com/api/v2/public/get_volatility_index_data?currency=BTC&end_timestamp=1599376800000&resolution=60&start_timestamp=1599373800000" \ +# -H "Content-Type: application/json" + +import math +from datetime import datetime as date + +import py_vollib.black_scholes.greeks.numerical +import py_vollib.black_scholes_merton +import requests +from pydantic import BaseModel +from scipy.stats import norm + +from derive_client.data_types.enums import OptionType + + +def black_scholes_call(S, K, T, r, sigma): + """ + S: Current stock price + K: Strike price + T: Time to maturity (in years) + r: Risk-free interest rate (annual) + sigma: Volatility of the underlying stock (standard deviation) + """ + d1 = (math.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * math.sqrt(T)) + d2 = d1 - sigma * math.sqrt(T) + + call_price = S * norm.cdf(d1) - K * math.exp(-r * T) * norm.cdf(d2) + return call_price + + +def get_volatility( + currency: str = "BTC", start_timestamp: int = None, end_timestamp: int = None, resolution: int = "1D" +): + """Get the volatility of a currency.""" + + start_timestamp = start_timestamp or date.now().timestamp() * 1000 - 3600 * 1000 # 1 hour ago + end_timestamp = end_timestamp or date.now().timestamp() * 1000 # now + result = requests.get( + "https://test.deribit.com/api/v2/public/get_volatility_index_data", + params={ + "currency": currency, + "start_timestamp": int(start_timestamp), + "end_timestamp": int(end_timestamp), + "resolution": resolution, + }, + ) + breakpoint() + return result.json().get("result", {}).get("data", [])[-1][-1] + + +class BlackScholesData(BaseModel): + cost: float + delta: float + gamma: float + theta: float + + +class OptionDetails(BaseModel): + index: str + expiry: int + strike: float + option_type: OptionType + settlement_price: float | None = None + + +def get_black_scholes_data( + side: OptionType, + current_stock_price: float, + strike_price: float, + expiration_time: float, + sigma: float, + risk_free_rate: float = 0.02, +): + current_time = date.utcnow().timestamp() + t = (expiration_time - current_time) / (3600 * 24 * 365.25) # in years + cost = py_vollib.black_scholes.black_scholes( + side.lower(), current_stock_price, strike_price, t, risk_free_rate, sigma + ) + delta = py_vollib.black_scholes.greeks.numerical.delta( + side.lower(), + current_stock_price, + strike_price, + t, + risk_free_rate, + sigma, + ) + gamma = py_vollib.black_scholes.greeks.numerical.gamma( + side.lower(), + current_stock_price, + strike_price, + t, + risk_free_rate, + sigma, + ) + theta = py_vollib.black_scholes.greeks.numerical.theta( + side.lower(), + current_stock_price, + strike_price, + t, + risk_free_rate, + sigma, + ) + return BlackScholesData(cost=cost, delta=delta, gamma=gamma, theta=theta) + + +if __name__ == "__main__": + vol_data = get_volatility(currency="ETH") + print(f"Volatility data: {vol_data}") + + sigma = vol_data / 100 # Volatility of the underlying stock (standard deviation) + + option_details = { + "index": "ETH-USD", + "expiry": 1758700800, + "strike": "4200", + "option_type": "C", + "settlement_price": None, + } + + current_price = 4196 + pos_size = -3 + option = OptionDetails(**option_details) + option_greeks = get_black_scholes_data( + side=option.option_type, + current_stock_price=current_price, + strike_price=option.strike, + expiration_time=option.expiry, + sigma=sigma, + ) + + # convert from time_to_expiry in seconds to years + current_time = date.utcnow().timestamp() + + print(f" Position Delta: {option_greeks.delta * pos_size}") + print(f" Position Gamma: {option_greeks.gamma * pos_size}") + print(f" Position Theta: {option_greeks.theta * pos_size}") + print(f" Position Cost: {option_greeks.cost * pos_size}") diff --git a/tests/conftest.py b/tests/conftest.py index 995070d8..49b766d5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,10 +13,10 @@ from derive_client.exceptions import DeriveJSONRPCException from derive_client.utils import get_logger +OWNER_TEST_WALLET = "0xA419f70C696a4b449a4A24F92e955D91482d44e9" # SESSION_KEY_PRIVATE_KEY owns this TEST_WALLET = "0x8772185a1516f0d61fC1c2524926BfC69F95d698" # this SESSION_KEY_PRIVATE_KEY is not the owner of the wallet TEST_PRIVATE_KEY = "0x2ae8be44db8a590d20bffbe3b6872df9b569147d3bf6801a35a28281a4816bbd" -# TEST_WALLET = "0xA419f70C696a4b449a4A24F92e955D91482d44e9" # SESSION_KEY_PRIVATE_KEY owns this def freeze_time(derive_client): diff --git a/tests/test_main.py b/tests/test_main.py index 3dc82c2c..9662147d 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -257,10 +257,7 @@ def test_can_create_option_order(derive_client, currency, side): currency=currency, ) symbol, ticker = [f for f in tickers.items() if f[1]['is_active']][-1] - if side == OrderSide.BUY: - order_price = ticker['min_price'] - else: - order_price = ticker['max_price'] + order_price = ticker['min_price'] if side == OrderSide.BUY else ticker['max_price'] order = derive_client.create_order( amount=0.5, side=side, diff --git a/tests/test_rfq.py b/tests/test_rfq.py index 1921a8e9..9a472cc5 100644 --- a/tests/test_rfq.py +++ b/tests/test_rfq.py @@ -2,23 +2,19 @@ Implement tests for the RFQ class. """ +from typing import Literal + from pydantic import BaseModel from derive_client.data_types import OrderSide -from derive_client.data_types.enums import Currency, InstrumentType +from derive_client.data_types.enums import Currency, InstrumentType, Leg from derive_client.derive import DeriveClient -class Leg(BaseModel): - instrument_name: str - amount: float - direction: str - price: float | None = None - - class Rfq(BaseModel): subaccount_id: int legs: list[Leg] + global_direction: Literal["buy", "sell"] | None = None def model_dump(self, *args, **kwargs): kwargs.setdefault("exclude_none", True) @@ -92,12 +88,30 @@ def test_create_quote(derive_client: DeriveClient): for rfq_leg, quote_leg in zip(rfq["legs"], quote["legs"]): assert rfq_leg != quote_leg assert Leg(**rfq_leg, price=price) == Leg(**quote_leg) - return rfq + return quote def test_poll_quotes(derive_client: DeriveClient): - rfq = test_create_quote(derive_client) - derive_client.subaccount_id = derive_client.subaccount_ids[0] - quotes = derive_client.poll_quotes(rfq_id=rfq['rfq_id']) - polled_rfqs = quotes.get('quotes', []) - assert polled_rfqs, "Polled RFQs should not be empty" + + quote = test_create_quote(derive_client) + derive_client.subaccount_id = derive_client.subaccount_ids[0] # do the nasty + rfq_id = quote["rfq_id"] + quote_id = quote["quote_id"] + quotes = derive_client.poll_quotes(rfq_id=rfq_id, quote_id=quote_id) + quotes = quotes.get('quotes', []) + assert quotes, f"No quote matching RFQ id {rfq_id} and Quote id {quote_id} found" + return quotes + + +def test_execute_quote(derive_client: DeriveClient): + + quotes = test_poll_quotes(derive_client) + first_quote = quotes[0] + assert first_quote["status"] == "open" + + executed_quote = derive_client.execute_quote(first_quote) + + assert not executed_quote["subaccount_id"] == first_quote["subaccount_id"] + assert executed_quote["legs"] == first_quote["legs"] + assert executed_quote["status"] == "filled" + assert executed_quote["rfq_id"] == first_quote["rfq_id"]