diff --git a/.cursor/rules/architecture.mdc b/.cursor/rules/architecture.mdc
deleted file mode 100644
index 7d9f608..0000000
--- a/.cursor/rules/architecture.mdc
+++ /dev/null
@@ -1,140 +0,0 @@
----
-alwaysApply: true
----
-
-# Project Architecture Rules
-
-## Directory Structure
-
-### Package Organization
-Maintain clear separation of concerns:
-
-```
-src/
-├── __init__.py
-├── bot_runner.py # Main entry point
-├── config_loader.py # Configuration management
-├── core/ # Core blockchain functionality
-│ ├── client.py # Solana RPC client abstraction
-│ ├── wallet.py # Wallet operations
-│ └── priority_fee/ # Fee management
-├── platforms/ # Platform-specific implementations
-│ ├── pumpfun/ # pump.fun specific code
-│ └── letsbonk/ # letsbonk.fun specific code
-├── trading/ # Trading logic
-│ ├── base.py # Base trading classes
-│ ├── universal_trader.py # Platform-agnostic trader
-│ └── position.py # Position management
-├── monitoring/ # Event listening and monitoring
-│ ├── base_listener.py # Base listener interface
-│ └── universal_*_listener.py # Specific listeners
-├── interfaces/ # Abstract base classes
-└── utils/ # Utilities and helpers
- ├── logger.py # Logging utilities
- └── idl_manager.py # IDL management
-```
-
-### File Naming Conventions
-- Use snake_case for all Python files and directories
-- Prefix abstract base classes with "Base" or put in `interfaces/`
-- Use "Universal" prefix for platform-agnostic implementations
-- Group related functionality in subdirectories
-
-## Design Patterns
-
-### Platform Abstraction
-Implement platform-specific functionality using the factory pattern:
-
-```python
-# interfaces/core.py - Define abstract interfaces
-from abc import ABC, abstractmethod
-
-class AddressProvider(ABC):
- @abstractmethod
- def get_program_address(self) -> str:
- pass
-
-# platforms/pumpfun/address_provider.py - Concrete implementation
-class PumpFunAddressProvider(AddressProvider):
- def get_program_address(self) -> str:
- return "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"
-```
-
-### Universal Components
-Create platform-agnostic wrappers that delegate to platform-specific implementations:
-
-```python
-class UniversalTrader:
- def __init__(self, platform: Platform, **kwargs):
- self.platform = platform
- self.platform_trader = self._create_platform_trader()
-
- def _create_platform_trader(self):
- # Factory method to create platform-specific trader
- pass
-```
-
-### Configuration Management
-- Use YAML files for bot configurations in `bots/` directory
-- Support environment variable interpolation with `${VARIABLE}` syntax
-- Validate configurations before starting bots
-- Separate environment-specific settings in `.env` files
-
-## Module Dependencies
-
-### Import Rules
-- Core modules should not import from trading or monitoring
-- Platform-specific modules should only import from their own package and core/interfaces
-- Avoid circular imports between packages
-- Use dependency injection for cross-package dependencies
-
-### Dependency Layers (from low to high level)
-1. **utils/** - Utilities and helpers (no business logic dependencies)
-2. **interfaces/** - Abstract base classes and protocols
-3. **core/** - Blockchain and infrastructure (depends on utils, interfaces)
-4. **platforms/** - Platform implementations (depends on core, interfaces)
-5. **trading/** - Trading logic (depends on core, platforms, interfaces)
-6. **monitoring/** - Event listening (depends on core, platforms, interfaces)
-7. **bot_runner.py** - Main orchestrator (depends on all layers)
-
-## Async Architecture
-
-### Event Loop Management
-- Use uvloop for better performance
-- Set event loop policy at application startup
-- Use asyncio.create_task() for concurrent operations
-- Implement proper cleanup on shutdown
-
-### Connection Management
-- Use connection pooling for HTTP clients
-- Implement reconnection logic for WebSocket connections
-- Cache expensive resources (blockhash, account info)
-- Use async context managers for resource cleanup
-
-## Testing Strategy
-
-### Test Organization
-- Use `learning-examples/` for integration testing and validation
-- Test platform-specific components independently
-- Mock external dependencies (RPC calls, WebSocket connections)
-- Validate configurations with actual bot startup
-
-### Test Data
-- Use test networks for development
-- Never test with real funds or production keys
-- Create fixtures for common test scenarios
-- Document test account requirements
-
-## Performance Considerations
-
-### Caching Strategy
-- Cache recent blockhash in background task
-- Cache account information where appropriate
-- Use local caching for IDL data
-- Implement TTL for cached data
-
-### Resource Management
-- Limit concurrent operations based on RPC provider limits
-- Implement backoff strategies for failed requests
-- Use separate processes for production bot instances
-- Monitor memory usage in long-running processes
\ No newline at end of file
diff --git a/.cursor/rules/python-style.mdc b/.cursor/rules/python-style.mdc
deleted file mode 100644
index da49fa4..0000000
--- a/.cursor/rules/python-style.mdc
+++ /dev/null
@@ -1,150 +0,0 @@
----
-alwaysApply: true
----
-
-# Python Code Style Rules
-
-## Formatting Standards
-
-### Ruff Configuration Compliance
-- Use 88 character line length limit
-- Use 4 spaces for indentation (never tabs)
-- Use double quotes for strings consistently
-- Target Python 3.11+ features and syntax
-- Enable automatic import sorting and organization
-
-### Import Organization
-```python
-# Standard library imports first
-import asyncio
-import logging
-from pathlib import Path
-
-# Third-party imports second
-import aiohttp
-from solana.rpc.async_api import AsyncClient
-
-# Local imports last
-from config_loader import load_bot_config
-from utils.logger import get_logger
-```
-
-### Type Annotations
-- Add type hints to ALL public functions and methods
-- Use modern typing syntax (Python 3.9+ union syntax where applicable)
-- Include return type annotations
-- Use `from typing import Any` for complex types
-
-```python
-def process_transaction(tx_data: dict[str, Any]) -> bool:
- """Process transaction data and return success status."""
- pass
-
-async def fetch_data(endpoint: str) -> dict[str, Any] | None:
- """Fetch data from endpoint, return None on failure."""
- pass
-```
-
-## Documentation Standards
-
-### Docstring Format
-Use Google-style docstrings for all functions and classes:
-
-```python
-def calculate_slippage(amount: float, slippage_percent: float) -> float:
- """Calculate slippage amount for a trade.
-
- Args:
- amount: The trade amount in SOL
- slippage_percent: Slippage percentage (0.1 = 10%)
-
- Returns:
- The calculated slippage amount
-
- Raises:
- ValueError: If slippage_percent is negative
- """
- if slippage_percent < 0:
- raise ValueError("Slippage percentage cannot be negative")
- return amount * slippage_percent
-```
-
-## Error Handling
-
-### Comprehensive Exception Handling
-- Use try-catch blocks for all external operations (RPC calls, file I/O)
-- Log exceptions with context using `logging.exception()`
-- Provide meaningful error messages
-- Don't suppress exceptions without good reason
-
-```python
-try:
- result = await client.get_account_info(address)
- logger.info(f"Successfully fetched account info for {address}")
-except Exception as e:
- logger.exception(f"Failed to fetch account info for {address}: {e}")
- raise
-```
-
-## Logging Standards
-
-### Logger Usage
-- Use `get_logger(__name__)` pattern consistently
-- Import from `utils.logger`
-- Use appropriate log levels (DEBUG, INFO, WARNING, ERROR)
-- Include context in log messages
-
-```python
-from utils.logger import get_logger
-
-logger = get_logger(__name__)
-
-# Good logging examples
-logger.info(f"Starting bot '{bot_name}' with platform {platform.value}")
-logger.warning(f"Transaction failed, attempt {attempt}/{max_attempts}")
-logger.error(f"Platform {platform.value} is not supported")
-```
-
-## Security Rules
-
-### Sensitive Data
-- NEVER hardcode private keys, API tokens, or secrets
-- Use environment variables for all sensitive configuration
-- Don't log sensitive information
-- Validate all external inputs
-
-### Safe Practices
-```python
-# Good - using environment variables
-private_key = os.getenv("SOLANA_PRIVATE_KEY")
-if not private_key:
- raise ValueError("SOLANA_PRIVATE_KEY environment variable is required")
-
-# Bad - hardcoded secrets
-private_key = "your_secret_key_here" # NEVER DO THIS
-```
-
-## Code Quality
-
-### Linting Compliance
-Ensure code passes all enabled Ruff rules:
-- Security best practices (S)
-- Type annotations (ANN)
-- Exception handling (BLE, TRY)
-- Code complexity (C90)
-- Pylint conventions (PL)
-- No commented-out code (ERA)
-
-### Performance Considerations
-- Use async/await for I/O operations
-- Implement proper connection pooling for HTTP clients
-- Cache expensive computations when appropriate
-- Use uvloop for better async performance
-
-```python
-# Set uvloop policy at module level
-import asyncio
-import uvloop
-
-asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
-```
\ No newline at end of file
diff --git a/.cursor/rules/trading-bot.mdc b/.cursor/rules/trading-bot.mdc
deleted file mode 100644
index ec5e0c8..0000000
--- a/.cursor/rules/trading-bot.mdc
+++ /dev/null
@@ -1,248 +0,0 @@
----
-alwaysApply: true
----
-
-# Trading Bot Specific Rules
-
-## Bot Configuration Standards
-
-### YAML Configuration Structure
-Maintain consistent structure across all bot configuration files:
-
-```yaml
-# Bot identification
-name: "bot-sniper-1"
-platform: "pump_fun" # or "lets_bonk"
-enabled: true # Allow disabling without removing config
-separate_process: true # Run in separate process for isolation
-
-# Environment and connection
-env_file: ".env"
-rpc_endpoint: "${SOLANA_NODE_RPC_ENDPOINT}"
-wss_endpoint: "${SOLANA_NODE_WSS_ENDPOINT}"
-private_key: "${SOLANA_PRIVATE_KEY}"
-
-# Platform-specific configurations
-geyser: # For faster data streams
- endpoint: "${GEYSER_ENDPOINT}"
- api_token: "${GEYSER_API_TOKEN}"
- auth_type: "x-token"
-
-# Trading parameters
-trade:
- buy_amount: 0.0001 # SOL amount
- buy_slippage: 0.3 # 30%
- sell_slippage: 0.3
- exit_strategy: "time_based" # "tp_sl", "manual"
- extreme_fast_mode: true # Skip validations for speed
-```
-
-### Environment Variable Usage
-- Use `${VARIABLE_NAME}` syntax for environment interpolation
-- Never hardcode sensitive values in YAML files
-- Validate all required environment variables on startup
-- Provide clear error messages for missing variables
-
-## Trading Logic Rules
-
-### Transaction Handling
-- Always use priority fees for competitive transaction inclusion
-- Implement retry mechanisms with exponential backoff
-- Cache recent blockhash to avoid repeated RPC calls
-- Use compute unit limits to prevent transaction failures
-
-```python
-# Good transaction building pattern
-instructions = [
- set_compute_unit_limit(300_000),
- set_compute_unit_price(priority_fee),
- # ... trading instructions
-]
-```
-
-### Risk Management
-- Implement position size limits
-- Use slippage protection on all trades
-- Set maximum hold times to prevent stuck positions
-- Validate token data before trading
-
-```python
-# Risk validation example
-if token_age > self.max_token_age:
- logger.warning(f"Token {mint} too old ({token_age}s), skipping")
- return False
-
-if buy_amount > self.max_position_size:
- logger.error(f"Buy amount {buy_amount} exceeds max position size")
- return False
-```
-
-### Exit Strategies
-Implement multiple exit strategy types:
-
-1. **Time-based**: Hold for fixed duration
-2. **Take Profit/Stop Loss**: Price-based exits
-3. **Manual**: No automatic selling
-
-```python
-class ExitStrategy(Enum):
- TIME_BASED = "time_based"
- TP_SL = "tp_sl"
- MANUAL = "manual"
-```
-
-## Platform Integration Rules
-
-### Multi-Platform Support
-- Use platform enum for type safety
-- Implement platform-specific address providers
-- Abstract platform differences in universal components
-- Validate platform-listener combinations
-
-```python
-# Platform validation
-if not validate_platform_listener_combination(platform, listener_type):
- supported = get_supported_listeners_for_platform(platform)
- raise ConfigurationError(
- f"Listener '{listener_type}' not supported for {platform.value}. "
- f"Supported: {supported}"
- )
-```
-
-### Listener Types
-Support multiple data source types:
-- **geyser**: Fastest, requires special endpoint
-- **logs**: WebSocket log subscription
-- **blocks**: Block subscription (not all providers support)
-- **pumpportal**: Third-party aggregator
-
-## Performance Optimization
-
-### Speed vs Accuracy Tradeoffs
-- **Extreme Fast Mode**: Skip validations and price checks for speed
-- **Normal Mode**: Full validation and price checks
-- **Marry Mode**: Only buy, never sell (accumulation strategy)
-- **YOLO Mode**: Continuous trading without cooldowns
-
-### Caching Strategy
-```python
-# Cache expensive operations
-self._cached_blockhash: Hash | None = None
-self._blockhash_lock = asyncio.Lock()
-
-# Background blockhash updater
-async def start_blockhash_updater(self, interval: float = 5.0):
- while True:
- try:
- blockhash = await self.get_latest_blockhash()
- async with self._blockhash_lock:
- self._cached_blockhash = blockhash
- except Exception as e:
- logger.exception(f"Failed to update blockhash: {e}")
- await asyncio.sleep(interval)
-```
-
-## Monitoring and Logging
-
-### Log File Management
-- Create timestamped log files per bot instance
-- Format: `{bot_name}_{timestamp}.log`
-- Store in `logs/` directory
-- Implement log rotation for long-running bots
-
-### Trading Event Logging
-Log all significant events with context:
-
-```python
-# Good logging examples
-logger.info(f"New token detected: {mint} by {creator}")
-logger.info(f"Buy transaction submitted: {signature}")
-logger.warning(f"Transaction failed, attempt {attempt}/{max_attempts}")
-logger.error(f"Platform {platform.value} not supported")
-```
-
-### Performance Metrics
-Track key performance indicators:
-- Token detection latency
-- Transaction confirmation time
-- Success/failure rates
-- Slippage and fill rates
-
-## Security and Safety Rules
-
-### Private Key Management
-- Store private keys only in environment variables
-- Never log or expose private keys
-- Use separate wallets for testing vs production
-- Implement wallet balance checks before trading
-
-### Input Validation
-```python
-# Validate all external inputs
-def validate_mint_address(mint_str: str) -> bool:
- try:
- mint = Pubkey.from_string(mint_str)
- return len(str(mint)) == 44 # Valid Solana address length
- except Exception:
- return False
-```
-
-### Error Recovery
-- Implement graceful shutdown on critical errors
-- Provide cleanup mechanisms for stuck positions
-- Support manual intervention modes
-- Log all errors with sufficient context for debugging
-
-## Testing and Validation
-
-### Learning Examples Usage
-Use learning examples for:
-- Testing new features before integration
-- Validating platform-specific functionality
-- Performance benchmarking
-- Educational purposes for new developers
-
-```bash
-# Test platform connectivity
-uv run learning-examples/fetch_price.py
-
-# Validate bonding curve calculations
-uv run learning-examples/compute_associated_bonding_curve.py
-
-# Compare listener performance
-uv run learning-examples/listen-new-tokens/compare_listeners.py
-```
-
-### Configuration Testing
-- Validate YAML syntax and required fields
-- Test environment variable interpolation
-- Verify platform-listener compatibility
-- Check wallet connectivity and balance
-
-## Deployment Guidelines
-
-### Production Checklist
-1. Test configuration with learning examples
-2. Verify environment variables are set
-3. Check wallet has sufficient SOL for gas fees
-4. Enable separate processes for isolation
-5. Monitor logs for successful startup
-6. Implement monitoring and alerting
-
-### Multi-Bot Management
-- Use descriptive bot names in configurations
-- Separate log files per bot instance
-- Monitor resource usage across all bots
-- Implement centralized configuration management
-
-```python
-# Bot process management
-if cfg.get("separate_process", False):
- p = multiprocessing.Process(
- target=run_bot_process,
- args=(str(file),),
- name=f"bot-{bot_name}"
- )
- p.start()
- processes.append(p)
-```
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 70110c0..102ddd3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,9 @@ blockSubscribe-transactions/
.pylintrc
.ruff_cache
+# Per-developer agent settings; AGENTS.md/CLAUDE.md are the shared config
+.claude/settings.local.json
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
diff --git a/.kiro/steering/architecture.mdc b/.kiro/steering/architecture.mdc
deleted file mode 100644
index 9b3507b..0000000
--- a/.kiro/steering/architecture.mdc
+++ /dev/null
@@ -1,140 +0,0 @@
----
-inclusion: always
----
-
-# Project Architecture Rules
-
-## Directory Structure
-
-### Package Organization
-Maintain clear separation of concerns:
-
-```
-src/
-├── __init__.py
-├── bot_runner.py # Main entry point
-├── config_loader.py # Configuration management
-├── core/ # Core blockchain functionality
-│ ├── client.py # Solana RPC client abstraction
-│ ├── wallet.py # Wallet operations
-│ └── priority_fee/ # Fee management
-├── platforms/ # Platform-specific implementations
-│ ├── pumpfun/ # pump.fun specific code
-│ └── letsbonk/ # letsbonk.fun specific code
-├── trading/ # Trading logic
-│ ├── base.py # Base trading classes
-│ ├── universal_trader.py # Platform-agnostic trader
-│ └── position.py # Position management
-├── monitoring/ # Event listening and monitoring
-│ ├── base_listener.py # Base listener interface
-│ └── universal_*_listener.py # Specific listeners
-├── interfaces/ # Abstract base classes
-└── utils/ # Utilities and helpers
- ├── logger.py # Logging utilities
- └── idl_manager.py # IDL management
-```
-
-### File Naming Conventions
-- Use snake_case for all Python files and directories
-- Prefix abstract base classes with "Base" or put in `interfaces/`
-- Use "Universal" prefix for platform-agnostic implementations
-- Group related functionality in subdirectories
-
-## Design Patterns
-
-### Platform Abstraction
-Implement platform-specific functionality using the factory pattern:
-
-```python
-# interfaces/core.py - Define abstract interfaces
-from abc import ABC, abstractmethod
-
-class AddressProvider(ABC):
- @abstractmethod
- def get_program_address(self) -> str:
- pass
-
-# platforms/pumpfun/address_provider.py - Concrete implementation
-class PumpFunAddressProvider(AddressProvider):
- def get_program_address(self) -> str:
- return "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"
-```
-
-### Universal Components
-Create platform-agnostic wrappers that delegate to platform-specific implementations:
-
-```python
-class UniversalTrader:
- def __init__(self, platform: Platform, **kwargs):
- self.platform = platform
- self.platform_trader = self._create_platform_trader()
-
- def _create_platform_trader(self):
- # Factory method to create platform-specific trader
- pass
-```
-
-### Configuration Management
-- Use YAML files for bot configurations in `bots/` directory
-- Support environment variable interpolation with `${VARIABLE}` syntax
-- Validate configurations before starting bots
-- Separate environment-specific settings in `.env` files
-
-## Module Dependencies
-
-### Import Rules
-- Core modules should not import from trading or monitoring
-- Platform-specific modules should only import from their own package and core/interfaces
-- Avoid circular imports between packages
-- Use dependency injection for cross-package dependencies
-
-### Dependency Layers (from low to high level)
-1. **utils/** - Utilities and helpers (no business logic dependencies)
-2. **interfaces/** - Abstract base classes and protocols
-3. **core/** - Blockchain and infrastructure (depends on utils, interfaces)
-4. **platforms/** - Platform implementations (depends on core, interfaces)
-5. **trading/** - Trading logic (depends on core, platforms, interfaces)
-6. **monitoring/** - Event listening (depends on core, platforms, interfaces)
-7. **bot_runner.py** - Main orchestrator (depends on all layers)
-
-## Async Architecture
-
-### Event Loop Management
-- Use uvloop for better performance
-- Set event loop policy at application startup
-- Use asyncio.create_task() for concurrent operations
-- Implement proper cleanup on shutdown
-
-### Connection Management
-- Use connection pooling for HTTP clients
-- Implement reconnection logic for WebSocket connections
-- Cache expensive resources (blockhash, account info)
-- Use async context managers for resource cleanup
-
-## Testing Strategy
-
-### Test Organization
-- Use `learning-examples/` for integration testing and validation
-- Test platform-specific components independently
-- Mock external dependencies (RPC calls, WebSocket connections)
-- Validate configurations with actual bot startup
-
-### Test Data
-- Use test networks for development
-- Never test with real funds or production keys
-- Create fixtures for common test scenarios
-- Document test account requirements
-
-## Performance Considerations
-
-### Caching Strategy
-- Cache recent blockhash in background task
-- Cache account information where appropriate
-- Use local caching for IDL data
-- Implement TTL for cached data
-
-### Resource Management
-- Limit concurrent operations based on RPC provider limits
-- Implement backoff strategies for failed requests
-- Use separate processes for production bot instances
-- Monitor memory usage in long-running processes
\ No newline at end of file
diff --git a/.kiro/steering/python-style.mdc b/.kiro/steering/python-style.mdc
deleted file mode 100644
index d8b18d5..0000000
--- a/.kiro/steering/python-style.mdc
+++ /dev/null
@@ -1,150 +0,0 @@
----
-inclusion: always
----
-
-# Python Code Style Rules
-
-## Formatting Standards
-
-### Ruff Configuration Compliance
-- Use 88 character line length limit
-- Use 4 spaces for indentation (never tabs)
-- Use double quotes for strings consistently
-- Target Python 3.11+ features and syntax
-- Enable automatic import sorting and organization
-
-### Import Organization
-```python
-# Standard library imports first
-import asyncio
-import logging
-from pathlib import Path
-
-# Third-party imports second
-import aiohttp
-from solana.rpc.async_api import AsyncClient
-
-# Local imports last
-from config_loader import load_bot_config
-from utils.logger import get_logger
-```
-
-### Type Annotations
-- Add type hints to ALL public functions and methods
-- Use modern typing syntax (Python 3.9+ union syntax where applicable)
-- Include return type annotations
-- Use `from typing import Any` for complex types
-
-```python
-def process_transaction(tx_data: dict[str, Any]) -> bool:
- """Process transaction data and return success status."""
- pass
-
-async def fetch_data(endpoint: str) -> dict[str, Any] | None:
- """Fetch data from endpoint, return None on failure."""
- pass
-```
-
-## Documentation Standards
-
-### Docstring Format
-Use Google-style docstrings for all functions and classes:
-
-```python
-def calculate_slippage(amount: float, slippage_percent: float) -> float:
- """Calculate slippage amount for a trade.
-
- Args:
- amount: The trade amount in SOL
- slippage_percent: Slippage percentage (0.1 = 10%)
-
- Returns:
- The calculated slippage amount
-
- Raises:
- ValueError: If slippage_percent is negative
- """
- if slippage_percent < 0:
- raise ValueError("Slippage percentage cannot be negative")
- return amount * slippage_percent
-```
-
-## Error Handling
-
-### Comprehensive Exception Handling
-- Use try-catch blocks for all external operations (RPC calls, file I/O)
-- Log exceptions with context using `logging.exception()`
-- Provide meaningful error messages
-- Don't suppress exceptions without good reason
-
-```python
-try:
- result = await client.get_account_info(address)
- logger.info(f"Successfully fetched account info for {address}")
-except Exception as e:
- logger.exception(f"Failed to fetch account info for {address}: {e}")
- raise
-```
-
-## Logging Standards
-
-### Logger Usage
-- Use `get_logger(__name__)` pattern consistently
-- Import from `utils.logger`
-- Use appropriate log levels (DEBUG, INFO, WARNING, ERROR)
-- Include context in log messages
-
-```python
-from utils.logger import get_logger
-
-logger = get_logger(__name__)
-
-# Good logging examples
-logger.info(f"Starting bot '{bot_name}' with platform {platform.value}")
-logger.warning(f"Transaction failed, attempt {attempt}/{max_attempts}")
-logger.error(f"Platform {platform.value} is not supported")
-```
-
-## Security Rules
-
-### Sensitive Data
-- NEVER hardcode private keys, API tokens, or secrets
-- Use environment variables for all sensitive configuration
-- Don't log sensitive information
-- Validate all external inputs
-
-### Safe Practices
-```python
-# Good - using environment variables
-private_key = os.getenv("SOLANA_PRIVATE_KEY")
-if not private_key:
- raise ValueError("SOLANA_PRIVATE_KEY environment variable is required")
-
-# Bad - hardcoded secrets
-private_key = "your_secret_key_here" # NEVER DO THIS
-```
-
-## Code Quality
-
-### Linting Compliance
-Ensure code passes all enabled Ruff rules:
-- Security best practices (S)
-- Type annotations (ANN)
-- Exception handling (BLE, TRY)
-- Code complexity (C90)
-- Pylint conventions (PL)
-- No commented-out code (ERA)
-
-### Performance Considerations
-- Use async/await for I/O operations
-- Implement proper connection pooling for HTTP clients
-- Cache expensive computations when appropriate
-- Use uvloop for better async performance
-
-```python
-# Set uvloop policy at module level
-import asyncio
-import uvloop
-
-asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
-```
\ No newline at end of file
diff --git a/.kiro/steering/trading-bot.mdc b/.kiro/steering/trading-bot.mdc
deleted file mode 100644
index ebf0076..0000000
--- a/.kiro/steering/trading-bot.mdc
+++ /dev/null
@@ -1,248 +0,0 @@
----
-inclusion: always
----
-
-# Trading Bot Specific Rules
-
-## Bot Configuration Standards
-
-### YAML Configuration Structure
-Maintain consistent structure across all bot configuration files:
-
-```yaml
-# Bot identification
-name: "bot-sniper-1"
-platform: "pump_fun" # or "lets_bonk"
-enabled: true # Allow disabling without removing config
-separate_process: true # Run in separate process for isolation
-
-# Environment and connection
-env_file: ".env"
-rpc_endpoint: "${SOLANA_NODE_RPC_ENDPOINT}"
-wss_endpoint: "${SOLANA_NODE_WSS_ENDPOINT}"
-private_key: "${SOLANA_PRIVATE_KEY}"
-
-# Platform-specific configurations
-geyser: # For faster data streams
- endpoint: "${GEYSER_ENDPOINT}"
- api_token: "${GEYSER_API_TOKEN}"
- auth_type: "x-token"
-
-# Trading parameters
-trade:
- buy_amount: 0.0001 # SOL amount
- buy_slippage: 0.3 # 30%
- sell_slippage: 0.3
- exit_strategy: "time_based" # "tp_sl", "manual"
- extreme_fast_mode: true # Skip validations for speed
-```
-
-### Environment Variable Usage
-- Use `${VARIABLE_NAME}` syntax for environment interpolation
-- Never hardcode sensitive values in YAML files
-- Validate all required environment variables on startup
-- Provide clear error messages for missing variables
-
-## Trading Logic Rules
-
-### Transaction Handling
-- Always use priority fees for competitive transaction inclusion
-- Implement retry mechanisms with exponential backoff
-- Cache recent blockhash to avoid repeated RPC calls
-- Use compute unit limits to prevent transaction failures
-
-```python
-# Good transaction building pattern
-instructions = [
- set_compute_unit_limit(300_000),
- set_compute_unit_price(priority_fee),
- # ... trading instructions
-]
-```
-
-### Risk Management
-- Implement position size limits
-- Use slippage protection on all trades
-- Set maximum hold times to prevent stuck positions
-- Validate token data before trading
-
-```python
-# Risk validation example
-if token_age > self.max_token_age:
- logger.warning(f"Token {mint} too old ({token_age}s), skipping")
- return False
-
-if buy_amount > self.max_position_size:
- logger.error(f"Buy amount {buy_amount} exceeds max position size")
- return False
-```
-
-### Exit Strategies
-Implement multiple exit strategy types:
-
-1. **Time-based**: Hold for fixed duration
-2. **Take Profit/Stop Loss**: Price-based exits
-3. **Manual**: No automatic selling
-
-```python
-class ExitStrategy(Enum):
- TIME_BASED = "time_based"
- TP_SL = "tp_sl"
- MANUAL = "manual"
-```
-
-## Platform Integration Rules
-
-### Multi-Platform Support
-- Use platform enum for type safety
-- Implement platform-specific address providers
-- Abstract platform differences in universal components
-- Validate platform-listener combinations
-
-```python
-# Platform validation
-if not validate_platform_listener_combination(platform, listener_type):
- supported = get_supported_listeners_for_platform(platform)
- raise ConfigurationError(
- f"Listener '{listener_type}' not supported for {platform.value}. "
- f"Supported: {supported}"
- )
-```
-
-### Listener Types
-Support multiple data source types:
-- **geyser**: Fastest, requires special endpoint
-- **logs**: WebSocket log subscription
-- **blocks**: Block subscription (not all providers support)
-- **pumpportal**: Third-party aggregator
-
-## Performance Optimization
-
-### Speed vs Accuracy Tradeoffs
-- **Extreme Fast Mode**: Skip validations and price checks for speed
-- **Normal Mode**: Full validation and price checks
-- **Marry Mode**: Only buy, never sell (accumulation strategy)
-- **YOLO Mode**: Continuous trading without cooldowns
-
-### Caching Strategy
-```python
-# Cache expensive operations
-self._cached_blockhash: Hash | None = None
-self._blockhash_lock = asyncio.Lock()
-
-# Background blockhash updater
-async def start_blockhash_updater(self, interval: float = 5.0):
- while True:
- try:
- blockhash = await self.get_latest_blockhash()
- async with self._blockhash_lock:
- self._cached_blockhash = blockhash
- except Exception as e:
- logger.exception(f"Failed to update blockhash: {e}")
- await asyncio.sleep(interval)
-```
-
-## Monitoring and Logging
-
-### Log File Management
-- Create timestamped log files per bot instance
-- Format: `{bot_name}_{timestamp}.log`
-- Store in `logs/` directory
-- Implement log rotation for long-running bots
-
-### Trading Event Logging
-Log all significant events with context:
-
-```python
-# Good logging examples
-logger.info(f"New token detected: {mint} by {creator}")
-logger.info(f"Buy transaction submitted: {signature}")
-logger.warning(f"Transaction failed, attempt {attempt}/{max_attempts}")
-logger.error(f"Platform {platform.value} not supported")
-```
-
-### Performance Metrics
-Track key performance indicators:
-- Token detection latency
-- Transaction confirmation time
-- Success/failure rates
-- Slippage and fill rates
-
-## Security and Safety Rules
-
-### Private Key Management
-- Store private keys only in environment variables
-- Never log or expose private keys
-- Use separate wallets for testing vs production
-- Implement wallet balance checks before trading
-
-### Input Validation
-```python
-# Validate all external inputs
-def validate_mint_address(mint_str: str) -> bool:
- try:
- mint = Pubkey.from_string(mint_str)
- return len(str(mint)) == 44 # Valid Solana address length
- except Exception:
- return False
-```
-
-### Error Recovery
-- Implement graceful shutdown on critical errors
-- Provide cleanup mechanisms for stuck positions
-- Support manual intervention modes
-- Log all errors with sufficient context for debugging
-
-## Testing and Validation
-
-### Learning Examples Usage
-Use learning examples for:
-- Testing new features before integration
-- Validating platform-specific functionality
-- Performance benchmarking
-- Educational purposes for new developers
-
-```bash
-# Test platform connectivity
-uv run learning-examples/fetch_price.py
-
-# Validate bonding curve calculations
-uv run learning-examples/compute_associated_bonding_curve.py
-
-# Compare listener performance
-uv run learning-examples/listen-new-tokens/compare_listeners.py
-```
-
-### Configuration Testing
-- Validate YAML syntax and required fields
-- Test environment variable interpolation
-- Verify platform-listener compatibility
-- Check wallet connectivity and balance
-
-## Deployment Guidelines
-
-### Production Checklist
-1. Test configuration with learning examples
-2. Verify environment variables are set
-3. Check wallet has sufficient SOL for gas fees
-4. Enable separate processes for isolation
-5. Monitor logs for successful startup
-6. Implement monitoring and alerting
-
-### Multi-Bot Management
-- Use descriptive bot names in configurations
-- Separate log files per bot instance
-- Monitor resource usage across all bots
-- Implement centralized configuration management
-
-```python
-# Bot process management
-if cfg.get("separate_process", False):
- p = multiprocessing.Process(
- target=run_bot_process,
- args=(str(file),),
- name=f"bot-{bot_name}"
- )
- p.start()
- processes.append(p)
-```
\ No newline at end of file
diff --git a/.windsurf/rules/architecture.mdc b/.windsurf/rules/architecture.mdc
deleted file mode 100644
index 851b545..0000000
--- a/.windsurf/rules/architecture.mdc
+++ /dev/null
@@ -1,140 +0,0 @@
----
-trigger: always_on
----
-
-# Project Architecture Rules
-
-## Directory Structure
-
-### Package Organization
-Maintain clear separation of concerns:
-
-```
-src/
-├── __init__.py
-├── bot_runner.py # Main entry point
-├── config_loader.py # Configuration management
-├── core/ # Core blockchain functionality
-│ ├── client.py # Solana RPC client abstraction
-│ ├── wallet.py # Wallet operations
-│ └── priority_fee/ # Fee management
-├── platforms/ # Platform-specific implementations
-│ ├── pumpfun/ # pump.fun specific code
-│ └── letsbonk/ # letsbonk.fun specific code
-├── trading/ # Trading logic
-│ ├── base.py # Base trading classes
-│ ├── universal_trader.py # Platform-agnostic trader
-│ └── position.py # Position management
-├── monitoring/ # Event listening and monitoring
-│ ├── base_listener.py # Base listener interface
-│ └── universal_*_listener.py # Specific listeners
-├── interfaces/ # Abstract base classes
-└── utils/ # Utilities and helpers
- ├── logger.py # Logging utilities
- └── idl_manager.py # IDL management
-```
-
-### File Naming Conventions
-- Use snake_case for all Python files and directories
-- Prefix abstract base classes with "Base" or put in `interfaces/`
-- Use "Universal" prefix for platform-agnostic implementations
-- Group related functionality in subdirectories
-
-## Design Patterns
-
-### Platform Abstraction
-Implement platform-specific functionality using the factory pattern:
-
-```python
-# interfaces/core.py - Define abstract interfaces
-from abc import ABC, abstractmethod
-
-class AddressProvider(ABC):
- @abstractmethod
- def get_program_address(self) -> str:
- pass
-
-# platforms/pumpfun/address_provider.py - Concrete implementation
-class PumpFunAddressProvider(AddressProvider):
- def get_program_address(self) -> str:
- return "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"
-```
-
-### Universal Components
-Create platform-agnostic wrappers that delegate to platform-specific implementations:
-
-```python
-class UniversalTrader:
- def __init__(self, platform: Platform, **kwargs):
- self.platform = platform
- self.platform_trader = self._create_platform_trader()
-
- def _create_platform_trader(self):
- # Factory method to create platform-specific trader
- pass
-```
-
-### Configuration Management
-- Use YAML files for bot configurations in `bots/` directory
-- Support environment variable interpolation with `${VARIABLE}` syntax
-- Validate configurations before starting bots
-- Separate environment-specific settings in `.env` files
-
-## Module Dependencies
-
-### Import Rules
-- Core modules should not import from trading or monitoring
-- Platform-specific modules should only import from their own package and core/interfaces
-- Avoid circular imports between packages
-- Use dependency injection for cross-package dependencies
-
-### Dependency Layers (from low to high level)
-1. **utils/** - Utilities and helpers (no business logic dependencies)
-2. **interfaces/** - Abstract base classes and protocols
-3. **core/** - Blockchain and infrastructure (depends on utils, interfaces)
-4. **platforms/** - Platform implementations (depends on core, interfaces)
-5. **trading/** - Trading logic (depends on core, platforms, interfaces)
-6. **monitoring/** - Event listening (depends on core, platforms, interfaces)
-7. **bot_runner.py** - Main orchestrator (depends on all layers)
-
-## Async Architecture
-
-### Event Loop Management
-- Use uvloop for better performance
-- Set event loop policy at application startup
-- Use asyncio.create_task() for concurrent operations
-- Implement proper cleanup on shutdown
-
-### Connection Management
-- Use connection pooling for HTTP clients
-- Implement reconnection logic for WebSocket connections
-- Cache expensive resources (blockhash, account info)
-- Use async context managers for resource cleanup
-
-## Testing Strategy
-
-### Test Organization
-- Use `learning-examples/` for integration testing and validation
-- Test platform-specific components independently
-- Mock external dependencies (RPC calls, WebSocket connections)
-- Validate configurations with actual bot startup
-
-### Test Data
-- Use test networks for development
-- Never test with real funds or production keys
-- Create fixtures for common test scenarios
-- Document test account requirements
-
-## Performance Considerations
-
-### Caching Strategy
-- Cache recent blockhash in background task
-- Cache account information where appropriate
-- Use local caching for IDL data
-- Implement TTL for cached data
-
-### Resource Management
-- Limit concurrent operations based on RPC provider limits
-- Implement backoff strategies for failed requests
-- Use separate processes for production bot instances
-- Monitor memory usage in long-running processes
\ No newline at end of file
diff --git a/.windsurf/rules/python-style.mdc b/.windsurf/rules/python-style.mdc
deleted file mode 100644
index c3daf0e..0000000
--- a/.windsurf/rules/python-style.mdc
+++ /dev/null
@@ -1,150 +0,0 @@
----
-trigger: always_on
----
-
-# Python Code Style Rules
-
-## Formatting Standards
-
-### Ruff Configuration Compliance
-- Use 88 character line length limit
-- Use 4 spaces for indentation (never tabs)
-- Use double quotes for strings consistently
-- Target Python 3.11+ features and syntax
-- Enable automatic import sorting and organization
-
-### Import Organization
-```python
-# Standard library imports first
-import asyncio
-import logging
-from pathlib import Path
-
-# Third-party imports second
-import aiohttp
-from solana.rpc.async_api import AsyncClient
-
-# Local imports last
-from config_loader import load_bot_config
-from utils.logger import get_logger
-```
-
-### Type Annotations
-- Add type hints to ALL public functions and methods
-- Use modern typing syntax (Python 3.9+ union syntax where applicable)
-- Include return type annotations
-- Use `from typing import Any` for complex types
-
-```python
-def process_transaction(tx_data: dict[str, Any]) -> bool:
- """Process transaction data and return success status."""
- pass
-
-async def fetch_data(endpoint: str) -> dict[str, Any] | None:
- """Fetch data from endpoint, return None on failure."""
- pass
-```
-
-## Documentation Standards
-
-### Docstring Format
-Use Google-style docstrings for all functions and classes:
-
-```python
-def calculate_slippage(amount: float, slippage_percent: float) -> float:
- """Calculate slippage amount for a trade.
-
- Args:
- amount: The trade amount in SOL
- slippage_percent: Slippage percentage (0.1 = 10%)
-
- Returns:
- The calculated slippage amount
-
- Raises:
- ValueError: If slippage_percent is negative
- """
- if slippage_percent < 0:
- raise ValueError("Slippage percentage cannot be negative")
- return amount * slippage_percent
-```
-
-## Error Handling
-
-### Comprehensive Exception Handling
-- Use try-catch blocks for all external operations (RPC calls, file I/O)
-- Log exceptions with context using `logging.exception()`
-- Provide meaningful error messages
-- Don't suppress exceptions without good reason
-
-```python
-try:
- result = await client.get_account_info(address)
- logger.info(f"Successfully fetched account info for {address}")
-except Exception as e:
- logger.exception(f"Failed to fetch account info for {address}: {e}")
- raise
-```
-
-## Logging Standards
-
-### Logger Usage
-- Use `get_logger(__name__)` pattern consistently
-- Import from `utils.logger`
-- Use appropriate log levels (DEBUG, INFO, WARNING, ERROR)
-- Include context in log messages
-
-```python
-from utils.logger import get_logger
-
-logger = get_logger(__name__)
-
-# Good logging examples
-logger.info(f"Starting bot '{bot_name}' with platform {platform.value}")
-logger.warning(f"Transaction failed, attempt {attempt}/{max_attempts}")
-logger.error(f"Platform {platform.value} is not supported")
-```
-
-## Security Rules
-
-### Sensitive Data
-- NEVER hardcode private keys, API tokens, or secrets
-- Use environment variables for all sensitive configuration
-- Don't log sensitive information
-- Validate all external inputs
-
-### Safe Practices
-```python
-# Good - using environment variables
-private_key = os.getenv("SOLANA_PRIVATE_KEY")
-if not private_key:
- raise ValueError("SOLANA_PRIVATE_KEY environment variable is required")
-
-# Bad - hardcoded secrets
-private_key = "your_secret_key_here" # NEVER DO THIS
-```
-
-## Code Quality
-
-### Linting Compliance
-Ensure code passes all enabled Ruff rules:
-- Security best practices (S)
-- Type annotations (ANN)
-- Exception handling (BLE, TRY)
-- Code complexity (C90)
-- Pylint conventions (PL)
-- No commented-out code (ERA)
-
-### Performance Considerations
-- Use async/await for I/O operations
-- Implement proper connection pooling for HTTP clients
-- Cache expensive computations when appropriate
-- Use uvloop for better async performance
-
-```python
-# Set uvloop policy at module level
-import asyncio
-import uvloop
-
-asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
-```
\ No newline at end of file
diff --git a/.windsurf/rules/trading-bot.mdc b/.windsurf/rules/trading-bot.mdc
deleted file mode 100644
index e6e6469..0000000
--- a/.windsurf/rules/trading-bot.mdc
+++ /dev/null
@@ -1,248 +0,0 @@
----
-trigger: always_on
----
-
-# Trading Bot Specific Rules
-
-## Bot Configuration Standards
-
-### YAML Configuration Structure
-Maintain consistent structure across all bot configuration files:
-
-```yaml
-# Bot identification
-name: "bot-sniper-1"
-platform: "pump_fun" # or "lets_bonk"
-enabled: true # Allow disabling without removing config
-separate_process: true # Run in separate process for isolation
-
-# Environment and connection
-env_file: ".env"
-rpc_endpoint: "${SOLANA_NODE_RPC_ENDPOINT}"
-wss_endpoint: "${SOLANA_NODE_WSS_ENDPOINT}"
-private_key: "${SOLANA_PRIVATE_KEY}"
-
-# Platform-specific configurations
-geyser: # For faster data streams
- endpoint: "${GEYSER_ENDPOINT}"
- api_token: "${GEYSER_API_TOKEN}"
- auth_type: "x-token"
-
-# Trading parameters
-trade:
- buy_amount: 0.0001 # SOL amount
- buy_slippage: 0.3 # 30%
- sell_slippage: 0.3
- exit_strategy: "time_based" # "tp_sl", "manual"
- extreme_fast_mode: true # Skip validations for speed
-```
-
-### Environment Variable Usage
-- Use `${VARIABLE_NAME}` syntax for environment interpolation
-- Never hardcode sensitive values in YAML files
-- Validate all required environment variables on startup
-- Provide clear error messages for missing variables
-
-## Trading Logic Rules
-
-### Transaction Handling
-- Always use priority fees for competitive transaction inclusion
-- Implement retry mechanisms with exponential backoff
-- Cache recent blockhash to avoid repeated RPC calls
-- Use compute unit limits to prevent transaction failures
-
-```python
-# Good transaction building pattern
-instructions = [
- set_compute_unit_limit(300_000),
- set_compute_unit_price(priority_fee),
- # ... trading instructions
-]
-```
-
-### Risk Management
-- Implement position size limits
-- Use slippage protection on all trades
-- Set maximum hold times to prevent stuck positions
-- Validate token data before trading
-
-```python
-# Risk validation example
-if token_age > self.max_token_age:
- logger.warning(f"Token {mint} too old ({token_age}s), skipping")
- return False
-
-if buy_amount > self.max_position_size:
- logger.error(f"Buy amount {buy_amount} exceeds max position size")
- return False
-```
-
-### Exit Strategies
-Implement multiple exit strategy types:
-
-1. **Time-based**: Hold for fixed duration
-2. **Take Profit/Stop Loss**: Price-based exits
-3. **Manual**: No automatic selling
-
-```python
-class ExitStrategy(Enum):
- TIME_BASED = "time_based"
- TP_SL = "tp_sl"
- MANUAL = "manual"
-```
-
-## Platform Integration Rules
-
-### Multi-Platform Support
-- Use platform enum for type safety
-- Implement platform-specific address providers
-- Abstract platform differences in universal components
-- Validate platform-listener combinations
-
-```python
-# Platform validation
-if not validate_platform_listener_combination(platform, listener_type):
- supported = get_supported_listeners_for_platform(platform)
- raise ConfigurationError(
- f"Listener '{listener_type}' not supported for {platform.value}. "
- f"Supported: {supported}"
- )
-```
-
-### Listener Types
-Support multiple data source types:
-- **geyser**: Fastest, requires special endpoint
-- **logs**: WebSocket log subscription
-- **blocks**: Block subscription (not all providers support)
-- **pumpportal**: Third-party aggregator
-
-## Performance Optimization
-
-### Speed vs Accuracy Tradeoffs
-- **Extreme Fast Mode**: Skip validations and price checks for speed
-- **Normal Mode**: Full validation and price checks
-- **Marry Mode**: Only buy, never sell (accumulation strategy)
-- **YOLO Mode**: Continuous trading without cooldowns
-
-### Caching Strategy
-```python
-# Cache expensive operations
-self._cached_blockhash: Hash | None = None
-self._blockhash_lock = asyncio.Lock()
-
-# Background blockhash updater
-async def start_blockhash_updater(self, interval: float = 5.0):
- while True:
- try:
- blockhash = await self.get_latest_blockhash()
- async with self._blockhash_lock:
- self._cached_blockhash = blockhash
- except Exception as e:
- logger.exception(f"Failed to update blockhash: {e}")
- await asyncio.sleep(interval)
-```
-
-## Monitoring and Logging
-
-### Log File Management
-- Create timestamped log files per bot instance
-- Format: `{bot_name}_{timestamp}.log`
-- Store in `logs/` directory
-- Implement log rotation for long-running bots
-
-### Trading Event Logging
-Log all significant events with context:
-
-```python
-# Good logging examples
-logger.info(f"New token detected: {mint} by {creator}")
-logger.info(f"Buy transaction submitted: {signature}")
-logger.warning(f"Transaction failed, attempt {attempt}/{max_attempts}")
-logger.error(f"Platform {platform.value} not supported")
-```
-
-### Performance Metrics
-Track key performance indicators:
-- Token detection latency
-- Transaction confirmation time
-- Success/failure rates
-- Slippage and fill rates
-
-## Security and Safety Rules
-
-### Private Key Management
-- Store private keys only in environment variables
-- Never log or expose private keys
-- Use separate wallets for testing vs production
-- Implement wallet balance checks before trading
-
-### Input Validation
-```python
-# Validate all external inputs
-def validate_mint_address(mint_str: str) -> bool:
- try:
- mint = Pubkey.from_string(mint_str)
- return len(str(mint)) == 44 # Valid Solana address length
- except Exception:
- return False
-```
-
-### Error Recovery
-- Implement graceful shutdown on critical errors
-- Provide cleanup mechanisms for stuck positions
-- Support manual intervention modes
-- Log all errors with sufficient context for debugging
-
-## Testing and Validation
-
-### Learning Examples Usage
-Use learning examples for:
-- Testing new features before integration
-- Validating platform-specific functionality
-- Performance benchmarking
-- Educational purposes for new developers
-
-```bash
-# Test platform connectivity
-uv run learning-examples/fetch_price.py
-
-# Validate bonding curve calculations
-uv run learning-examples/compute_associated_bonding_curve.py
-
-# Compare listener performance
-uv run learning-examples/listen-new-tokens/compare_listeners.py
-```
-
-### Configuration Testing
-- Validate YAML syntax and required fields
-- Test environment variable interpolation
-- Verify platform-listener compatibility
-- Check wallet connectivity and balance
-
-## Deployment Guidelines
-
-### Production Checklist
-1. Test configuration with learning examples
-2. Verify environment variables are set
-3. Check wallet has sufficient SOL for gas fees
-4. Enable separate processes for isolation
-5. Monitor logs for successful startup
-6. Implement monitoring and alerting
-
-### Multi-Bot Management
-- Use descriptive bot names in configurations
-- Separate log files per bot instance
-- Monitor resource usage across all bots
-- Implement centralized configuration management
-
-```python
-# Bot process management
-if cfg.get("separate_process", False):
- p = multiprocessing.Process(
- target=run_bot_process,
- args=(str(file),),
- name=f"bot-{bot_name}"
- )
- p.start()
- processes.append(p)
-```
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
deleted file mode 100644
index 09fe08d..0000000
--- a/AGENTS.md
+++ /dev/null
@@ -1,114 +0,0 @@
-# AGENTS Guidelines for This Repository
-
-This repository contains a Solana trading bot for pump.fun and letsbonk.fun platforms. When working on the project interactively with an agent (e.g. the Codex CLI) please follow the guidelines below for safe development and testing.
-
-## 1. Use Learning Examples for Testing
-
-* **Always test with learning examples first** in `learning-examples/` before modifying the main bot.
-* **Do _not_ run the main bot with real funds** during agent development sessions.
-* **Test all changes** using manual buy/sell scripts with minimal amounts before production use.
-* **Use testnet** or paper trading when available to validate logic.
-
-## 2. Keep Dependencies in Sync
-
-If you add or update dependencies:
-
-1. Use `uv add ` to add new dependencies.
-2. The `uv.lock` file will be automatically updated.
-3. Restart any running bots after dependency changes.
-4. Verify compatibility with Python 3.9+ as specified in the project.
-
-## 3. Coding Conventions
-
-* Follow Ruff linting rules defined in `pyproject.toml`.
-* Use Google-style docstrings for functions and classes.
-* Include type hints for all public functions.
-* Use the centralized logger: `from src.utils.logger import get_logger`.
-* Keep line length to 88 characters (auto-formatted).
-* Use double quotes for strings.
-
-## 4. Code Quality Checks
-
-Before completing any task, run these quality checks:
-
-| Command | Purpose |
-| ----------------------- | ------------------------------------------ |
-| `ruff format` | Format code to project standards |
-| `ruff check` | Run linting checks |
-| `ruff check --fix` | Auto-fix linting issues where possible |
-
-## 5. Testing Workflow
-
-Test changes progressively:
-
-1. **Unit testing**: Use individual learning examples
- ```bash
- uv run learning-examples/fetch_price.py
- ```
-
-2. **Integration testing**: Test specific listeners
- ```bash
- uv run learning-examples/listen-new-tokens/listen_logsubscribe.py
- ```
-
-3. **Configuration testing**: Validate YAML configs before running
- ```bash
- # Check syntax and required fields manually
- ```
-
-4. **Dry run**: Use minimal amounts and conservative settings first
-
-## 6. Environment Configuration
-
-Never commit sensitive data:
-
-* Keep private keys in `.env` file (git-ignored).
-* Use separate `.env` files for development and production.
-* Required environment variables:
- ```env
- SOLANA_RPC_WEBSOCKET=wss://...
- SOLANA_RPC_HTTP=https://...
- PRIVATE_KEY=your_private_key_here
- ```
-
-## 7. Bot Configuration Best Practices
-
-* Edit YAML files in `bots/` directory for bot instances.
-* Start with conservative settings:
- - Low `buy_amount`
- - High `min_sol_balance`
- - Strict filters
-* Test one bot instance at a time during development.
-* Monitor logs in `logs/` directory for debugging.
-
-## 8. Platform-Specific Development
-
-When adding features:
-
-* Check platform compatibility (`pump_fun` vs `lets_bonk`).
-* Test with both platforms if changes affect core logic.
-* Update platform-specific implementations in `src/platforms/`.
-* Verify IDL files match the on-chain programs.
-
-## 9. Safety Reminders
-
-* **Never expose private keys** in code, logs, or commits.
-* **Test with minimal amounts** first.
-* **Verify transactions** on Solana explorer before scaling up.
-* **Monitor rate limits** of your RPC provider.
-* **Keep logs** for audit and debugging purposes.
-
-## 10. Useful Commands Recap
-
-| Command | Purpose |
-| -------------------------------------------------- | --------------------------------- |
-| `uv sync` | Install/update dependencies |
-| `source .venv/bin/activate` | Activate virtual environment |
-| `uv pip install -e .` | Install bot as editable package |
-| `pump_bot` | Run the main bot |
-| `uv run learning-examples/manual_buy.py` | Test manual buy |
-| `uv run learning-examples/manual_sell.py` | Test manual sell |
-
----
-
-Following these practices ensures safe development, prevents accidental trades, and maintains code quality. Always prioritize testing and security when working with trading bots.
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
new file mode 120000
index 0000000..681311e
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1 @@
+CLAUDE.md
\ No newline at end of file
diff --git a/CLAUDE.md b/CLAUDE.md
index 11e5271..60feb52 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,56 +1,77 @@
-# Pump Bot Development Guide
+# Agent guide
-This is a trading bot for pump.fun and letsbonk.fun platforms that snipes new tokens and implements various trading strategies.
+Solana trading bot for pump.fun and letsbonk.fun. Snipes newly created tokens and exits on a configured strategy. See [README.md](README.md) for setup and configuration; this file covers what an agent needs that the code doesn't make obvious.
-## Project Structure
+`AGENTS.md` is a symlink to this file, so Claude Code, Codex, Cursor, and Windsurf all read the same guide.
-- `src/` - Main source code
-- `learning-examples/` - Educational scripts and examples
-- `bots/` - Bot configuration files (YAML)
-- `logs/` - Log files from bot executions
-- `idl/` - Interface definition files for Solana programs
+## Ground rules
-## Bash Commands & Development
+- **Never run a bot with real funds** to test a change. Use `learning-examples/`, or the simulation scripts below, which move no funds.
+- **Never** touch `.env` or print its contents. `SOLANA_PRIVATE_KEY` is a live key.
+- Don't commit anything from `logs/`.
+- Test with a learning example before touching `src/`.
-### Setup Commands
-```bash
-# Install dependencies
-uv sync
+## Layout
-# Activate virtual environment (Unix/macOS)
-source .venv/bin/activate
-
-# Install as editable package
-uv pip install -e .
+```
+src/ bot source — this dir is the import root (see below)
+learning-examples/ standalone scripts; each runs on its own, no bot config
+bots/ one YAML per bot instance
+idl/ vendored Anchor IDLs
+logs/ {bot_name}_{timestamp}.log
```
-### Running the Bot
-```bash
-# Run as installed package
-pump_bot
+**Imports are rooted at `src/`, not at the repo.** `uv pip install -e .` puts
+`src/` itself on `sys.path`, so it is `from core.client import SolanaClient` and
+`from utils.logger import get_logger` — **not** `from src.core...`. Learning
+examples are deliberately self-contained: they import siblings like `pump_v2`
+and `tx_status` as top-level modules and mostly don't import from `src` at all.
+Don't "fix" an example by rewiring it to import the bot.
-# Run directly
-uv run src/bot_runner.py
+Dependency layers, low to high — don't introduce an upward import:
+
+`utils` → `interfaces` → `core` → `platforms` → `trading` / `monitoring` → `bot_runner`
+
+Platform differences are resolved through `interfaces/core.py` abstractions
+(`AddressProvider`, curve manager, event parser, instruction builder) and a
+registry in `platforms/__init__.py`. Listeners and the trader are
+platform-agnostic (`Universal*`); anything platform-shaped belongs under
+`platforms//`.
+
+## Commands
+
+```bash
+uv sync # install runtime deps + the dev group (ruff)
+uv pip install -e . # editable install (required for the imports above)
+pump_bot # run all enabled bots
+uv run src/bot_runner.py # same, without the console script
```
-### Learning Examples
+Lint and format **the files you touched**, not the whole tree:
+
```bash
-# Bonding curve status
-uv run learning-examples/bonding-curve-progress/get_bonding_curve_status.py TOKEN_ADDRESS
-
-# Listen to migrations
-uv run learning-examples/listen-migrations/listen_logsubscribe.py
-uv run learning-examples/listen-migrations/listen_blocksubscribe_old_raydium.py
-
-# Compute associated bonding curve
-uv run learning-examples/compute_associated_bonding_curve.py
-
-# Listen to new tokens
-uv run learning-examples/listen-new-tokens/listen_logsubscribe_abc.py
-uv run learning-examples/listen-new-tokens/compare_listeners.py
+uv run ruff check --fix && uv run ruff format
```
+A bare `uv run ruff check` reports ~2400 pre-existing errors across the repo.
+That is the known baseline, not something your change caused — don't try to fix
+it wholesale, and don't read it as a failing build. Just don't add new ones in
+the files you edit.
+
+Ruff config lives in `pyproject.toml`: line length 88, double quotes, target
+py311, `E501` ignored. Selected rule families include `ANN` (type annotations),
+`S` (security), `BLE`/`TRY` (exceptions), `C90`/`PL` (complexity), `ERA` (no
+commented-out code). Type-hint public functions, Google-style docstrings, and
+`get_logger(__name__)` for logging.
+
+Python 3.11+ (`requires-python = ">=3.11"`, matching ruff's target). Runtime
+deps are declared in `[project.dependencies]`; `ruff` and `grpcio-tools` live in
+`[dependency-groups] dev`, which `uv sync` installs by default. `grpcio-tools`
+is protoc — needed only to regenerate the `geyser_pb2` stubs from `proto/`, never
+at runtime.
+
### Verifying pump.fun v2 trade instructions
+
```bash
# Offline: cross-check buy_v2/sell_v2 account layouts, PDA/ATA derivations,
# instruction encoding and quote-asset config against idl/pump_fun_idl.json
@@ -63,11 +84,13 @@ uv run learning-examples/simulate_v2_trades.py
uv run learning-examples/simulate_bot_buy_path.py
uv run learning-examples/simulate_bot_buy_path.py --no-extreme-fast
```
+
Run all three after any pump.fun program upgrade. The simulations report
`unitsConsumed`; use it to retune `get_buy_compute_unit_limit` /
`get_sell_compute_unit_limit` in `platforms/pumpfun/instruction_builder.py`.
### Verifying transaction-status handling
+
```bash
# Offline: stub checks plus a scan that every example verifies meta.err
uv run learning-examples/verify_tx_status_checks.py
@@ -98,18 +121,6 @@ with `BuybackFeeRecipientMissing` (6062) printed as confirmed buys.
and `str()` on it is empty, so the caller logs a blank reason. A slow
`getAccountInfo` is enough to take down a whole listener run this way.
-### Code Quality
-```bash
-# Format code
-ruff format
-
-# Lint code
-ruff check
-
-# Fix linting issues
-ruff check --fix
-```
-
## Pump.fun protocol notes (gotchas)
The IDLs under `idl/` are vendored verbatim from `github.com/pump-fun/pump-public-docs`
@@ -138,7 +149,8 @@ The IDLs under `idl/` are vendored verbatim from `github.com/pump-fun/pump-publi
user's WSOL ATA, it would burn ~0.002 SOL of rent for nothing.
- Fee recipients: 24 total, in three sets of 8 (`NORMAL_FEE_RECIPIENTS`,
`RESERVED_FEE_RECIPIENTS` for mayhem coins, `BUYBACK_FEE_RECIPIENTS`). Every
- v2 buy/sell needs a `fee_recipient` **and** a `buyback_fee_recipient`.
+ v2 buy/sell needs a `fee_recipient` **and** a `buyback_fee_recipient`. The set
+ is randomized per tx, per pump.fun's guidance on spreading program throughput.
- `sharing_config` (PDA `["sharing-config", base_mint]`) lives under the **pump
fees program**, not the pump program. Easy to derive against the wrong program.
@@ -164,6 +176,8 @@ The IDLs under `idl/` are vendored verbatim from `github.com/pump-fun/pump-publi
reserves against a 148.455 SOL vault, so quoting off the raw vault balance
under-prices by ~10.6%. It is `i128`, not `u64` — reading 8 bytes happens to
work only while the high half is zero.
+- pump-amm has **no** `buy_v2`/`sell_v2`. The AMM instruction names are
+ unchanged; only the pool layout and quoting moved.
### Coin creation
@@ -189,99 +203,20 @@ The IDL under-reports these: `buy` is **18 accounts** on-chain (IDL lists 16) an
`sell` is **16 non-cashback / 17 cashback** (IDL lists 14). The extras are
`bonding-curve-v2` (PDA `["bonding-curve-v2", mint]`) followed by a buyback fee
recipient (mutable); the cashback sell path also inserts
-`user_volume_accumulator` before `bonding-curve-v2`. Prefer v2 — it is the
+`user_volume_accumulator` before `bonding-curve-v2`. On the PumpSwap side the
+legacy path needs `pool-v2` (PDA `["pool-v2", base_mint]` under pump-amm) —
+without it pump-amm throws `AnchorError 6023 (Overflow)` after the transfers
+complete, a misleading code for a missing account. Prefer v2 — it is the
interface pump.fun maintains.
-## Code Style & Conventions
+## Config notes
-### Python Style (Ruff Configuration)
-- **Line length**: 88 characters
-- **Indentation**: 4 spaces
-- **Target Python**: 3.11+
-- **Quote style**: Double quotes
-- **Import sorting**: Enabled
-
-### Linting Rules
-- Security best practices (S)
-- Type annotations (ANN)
-- Exception handling (BLE, TRY)
-- Code complexity (C90)
-- Pylint conventions (PL)
-- No commented-out code (ERA)
-
-### Code Organization
-- **Imports**: Standard library, third-party, local imports
-- **Docstrings**: Google-style for functions and classes
-- **Type hints**: Required for all public functions
-- **Logging**: Use `get_logger(__name__)` pattern
-- **Error handling**: Comprehensive try-catch with proper logging
-
-### File Structure Patterns
-- `__init__.py` files for all packages
-- Separate concerns: client, trading, monitoring, platforms
-- Abstract base classes in `interfaces/`
-- Platform-specific implementations in `platforms/`
-
-## Workflow & Development Practices
-
-### Configuration Management
-- Environment variables in `.env` file
-- Bot configurations in YAML files under `bots/`
-- Platform detection from config files
-- Validation of platform-listener combinations
-
-### Logging
-- Timestamped log files in `logs/` directory
-- Format: `{bot_name}_{timestamp}.log`
-- Different log levels for development vs production
-- Centralized logger utility in `utils/logger.py`
-
-### Trading Architecture
-- Universal trader pattern for platform abstraction
-- Platform-specific implementations (pumpfun, letsbonk)
-- Position tracking and management
-- Priority fee management (dynamic/fixed)
-
-### Monitoring Systems
-- Multiple listener types: logs, blocks, geyser, pumpportal
-- Universal listeners with platform abstraction
-- Event parsing and processing
-- Real-time data stream handling
-
-### Development Workflow
-1. Make changes to source code
-2. Run `ruff check --fix` for linting
-3. Run `ruff format` for formatting
-4. Test with learning examples (standalone scripts) before deploying bots
-5. Use separate processes for production bot instances
-
-### Bot Configuration
-- YAML-based configuration files
-- Environment variable interpolation
-- Platform-specific settings
-- Trading parameters (slippage, amounts, timeouts)
-- Filter configurations for token selection
-- Cleanup and account management settings
-
-### Testing Strategy
-- Learning examples serve as integration tests
-- Manual testing with learning scripts
-- Configuration validation before bot startup
-- Logging verification for debugging
-
-## Key Features
-
-- **Multi-platform support**: pump.fun and letsbonk.fun
-- **Multiple listening methods**: WebSocket logs, block subscription, Geyser
-- **Trading strategies**: Time-based, take profit/stop loss, manual
-- **Priority fee management**: Dynamic and fixed fee strategies
-- **Account cleanup**: Automated token account management
-- **Extreme fast mode**: Skip validation for faster execution
-
-## Security Considerations
-
-- Private keys stored in environment variables
-- No sensitive data in configuration files
-- Comprehensive input validation
-- Error handling to prevent crashes
-- Rate limiting and retry mechanisms
\ No newline at end of file
+- Bot YAML supports `${VAR}` interpolation from the file named by `env_file`.
+ Actual variable names are `SOLANA_NODE_RPC_ENDPOINT`,
+ `SOLANA_NODE_WSS_ENDPOINT`, `SOLANA_PRIVATE_KEY`, `GEYSER_*`.
+- `config_loader.py` validates the platform/listener pairing before startup:
+ pump.fun supports `logs`, `blocks`, `geyser`, `pumpportal`; letsbonk.fun
+ supports `blocks`, `geyser`, `pumpportal` — **not `logs`**. Adding a listener
+ means updating `PLATFORM_LISTENER_COMPATIBILITY` there too.
+- Bots with `separate_process: true` run in their own process. One log file per
+ bot instance.
diff --git a/README.md b/README.md
index da98d0d..a424318 100644
--- a/README.md
+++ b/README.md
@@ -12,276 +12,167 @@
• Start for free •
-The project allows you to create bots for trading on pump.fun and letsbonk.fun. Its core feature is to snipe new tokens. Besides that, learning examples contain a lot of useful scripts for different types of listeners (new tokens, migrations) and deep dive into calculations required for trading.
+A Solana trading bot for **pump.fun** and **letsbonk.fun**. Its core feature is sniping new tokens: it watches for token creation, buys, and exits on a strategy you configure. `learning-examples/` contains standalone scripts covering every piece of the flow — listeners, price math, manual buys and sells — useful on their own even if you never run the bot.
For the full walkthrough, see [Solana: Creating a trading and sniping pump.fun bot](https://docs.chainstack.com/docs/solana-creating-a-pumpfun-bot).
-For near-instantaneous transaction propagation, you can use the [Chainstack Solana Trader nodes](https://docs.chainstack.com/docs/trader-nodes).
+---
-For instant updates from the network, you can enable [Yellowstone gRPC Geyser plugin](https://docs.chainstack.com/docs/yellowstone-grpc-geyser-plugin) (Jito ShredStream enabled by default).
+**🚨 SCAM ALERT**: The Issues section is regularly targeted by scam bots that try to redirect you to an external site and drain your funds. A GitHub Action tags the common patterns, which is not 100% accurate. Deleted comments in issues are scam bots after your private keys — genuine outside devs are welcome and appreciated.
-The official maintainers are in the [MAINTAINERS.md](MAINTAINERS.md) file. Leave your feedback by opening **Issues**.
-
-> **Also by Chainstack** — if you prefer a terminal interface or want to give an AI agent trading capabilities:
-> - [**pumpfun-cli**](https://github.com/chainstacklabs/pumpfun-cli) — CLI for trading, launching, and managing tokens on pump.fun; buy, sell, wallet management, and smart routing between bonding curve and PumpSwap AMM.
-> - [**pumpclaw**](https://github.com/chainstacklabs/pumpclaw) — agent skill that equips AI assistants (OpenClaw, Claude Code, Cursor, Codex) with the ability to operate pumpfun-cli.
+**⚠️ NOT FOR PRODUCTION**: This code is for learning purposes only. We assume no responsibility for the code or its usage. Modify it for your needs and learn from it — the examples, issues, and PRs contain valuable insights.
---
-**🚨 SCAM ALERT**: Issues section is often targeted by scam bots willing to redirect you to an external resource and drain your funds. I have enabled a GitHub actions script to detect the common patterns and tag them, which obviously is not 100% accurate. This is also why you will see deleted comments in the issues—I only delete the scam bot comments targeting your private keys. Not everyone is a scammer though, sometimes there are helpful outside devs who comment and I absolutely appreciate it.
+## Getting started
-**⚠️ NOT FOR PRODUCTION**: This code is for learning purposes only. We assume no responsibility for the code or its usage. Modify for your needs and learn from it (examples, issues, and PRs contain valuable insights).
+### 1. Prerequisites
----
+Install [uv](https://github.com/astral-sh/uv), a fast Python package manager. The project needs **Python 3.11+**; `uv` uses an existing install if it's new enough, otherwise it fetches one for you.
-
-## 🚀 Getting started
-
-### Prerequisites
-- Install [uv](https://github.com/astral-sh/uv), a fast Python package manager.
-
-> If Python is already installed, `uv` will detect and use it automatically.
-
-### Installation
-
-#### 1️⃣ Clone the repository
-```bash
-git clone https://github.com/chainstacklabs/pump-fun-bot.git
-cd pump-fun-bot
-```
-
-#### 2️⃣ Set up a virtual environment
-```bash
-# Create virtual environment
-uv sync
-
-# Activate (Unix/macOS)
-source .venv/bin/activate
-
-# Activate (Windows)
-.venv\Scripts\activate
-```
-> Virtual environments help keep dependencies isolated and prevent conflicts.
-
-#### 3️⃣ Configure the bot
-```bash
-# Copy example config
-cp .env.example .env # Unix/macOS
-
-# Windows
-copy .env.example .env
-```
-Edit the `.env` file and add your **Solana RPC endpoints** and **private key**.
-
-Edit `.yaml` templates in the `bots/` directory. Each file is a separate instance of a trading bot. Examine its parameters and apply your preferred strategy.
-
-For example, to run the pump.fun bot, set `platform: "pump_fun"`; to run the bonk.fun bot, set `platform: "lets_bonk"`.
-
-#### 4️⃣ Install the bot as a package
-```bash
-uv pip install -e .
-```
-> **Why `-e` (editable mode)?** Lets you modify the code without reinstalling the package—useful for development!
-
-### Running the bot
+### 2. Clone and install
```bash
-# Option 1: run as installed package
-pump_bot
+git clone https://github.com/chainstacklabs/pumpfun-bonkfun-bot.git
+cd pumpfun-bonkfun-bot
-# Option 2: run directly
-uv run src/bot_runner.py
+uv sync # create .venv and install dependencies
+source .venv/bin/activate # Unix/macOS — Windows: .venv\Scripts\activate
+uv pip install -e . # install the bot as an editable package
```
-> **You're all set! 🎉**
+### 3. Set your credentials
----
+```bash
+cp .env.example .env
+```
-## Note on throughput & limits
+Fill in `.env`:
-Solana is an amazing piece of web3 architecture, but it's also very complex to maintain.
+| Variable | Purpose |
+|---|---|
+| `SOLANA_NODE_RPC_ENDPOINT` | HTTPS RPC endpoint |
+| `SOLANA_NODE_WSS_ENDPOINT` | WebSocket endpoint (for `logs` / `blocks` listeners) |
+| `SOLANA_PRIVATE_KEY` | Base58 private key of the trading wallet |
+| `GEYSER_ENDPOINT`, `GEYSER_API_TOKEN`, `GEYSER_AUTH_TYPE` | Only for the `geyser` listener |
-Chainstack is daily (literally, including weekends) working on optimizing our Solana infrastructure to make it the best in the industry.
+Public RPC nodes will not work for this workload — see [throughput](#throughput-and-rate-limits) below.
-That said, all node providers have their own setup recommendations & limits, like method availability, requests per second (RPS), free and paid plan specific limitations and so on.
+### 4. Configure a bot
-So please make sure you consult the docs of the node provider you are going to use for the bot here. And obviously the public RPC nodes won't work for the heavier use case scenarios like this bot.
+Each YAML file in `bots/` is one bot instance. They ship with commented defaults; start from the one matching the listener you want:
-For Chainstack, all of the details and limits you need to be aware of are consolidated here: [Throughput guidelines](https://docs.chainstack.com/docs/limits) <— we are _always_ keeping this piece up to date so you can rely on it.
+| File | Listener | Ships with |
+|---|---|---|
+| `bot-sniper-1-geyser.yaml` | `geyser` — fastest, needs a Geyser endpoint | `pump_fun` |
+| `bot-sniper-2-logs.yaml` | `logs` — `logsSubscribe`, supported everywhere | `pump_fun` |
+| `bot-sniper-3-blocks.yaml` | `blocks` — `blockSubscribe`, not supported by every provider | `pump_fun` |
+| `bot-sniper-4-pp.yaml` | `pumpportal` — third-party aggregator | `lets_bonk` |
-### Built-in RPC Rate Limiting
+Set `platform: "pump_fun"` or `platform: "lets_bonk"`. pump.fun supports all four listeners; letsbonk.fun supports `blocks`, `geyser`, and `pumpportal` but **not** `logs`. The bot validates the pairing at startup and refuses to run an invalid one.
-The bot now includes built-in RPC rate limiting to prevent hitting provider limits:
+Set `enabled: false` to keep a config around without running it. Every bot with `enabled: true` starts when you run the bot.
-- **Token bucket algorithm**: Smoothly controls request rate while allowing short bursts
-- **Configurable max RPS**: Set `max_rps` parameter in `SolanaClient` (defaults to 25 RPS)
-- **Automatic retry logic**: Handles 429 (Too Many Requests) errors with exponential backoff
-- **Shared session management**: Reuses connections for improved performance
+### 5. Run
-This helps ensure reliable operation within your node provider's rate limits without manual throttling.
+```bash
+pump_bot # as an installed package
+uv run src/bot_runner.py # or directly
+```
-## IDLs
+Logs land in `logs/{bot_name}_{timestamp}.log`.
-The IDLs under [`idl/`](idl/) are vendored from [pump-fun/pump-public-docs](https://github.com/pump-fun/pump-public-docs). To refresh, copy `pump.json`, `pump_amm.json`, `pump_fees.json` from that repo into `pump_fun_idl.json`, `pump_swap_idl.json`, `pump_fees.json` respectively, and reference the upstream commit hash in your commit message.
+## Configuration reference
-Currently vendored from upstream commit `9c82f61`.
+The YAML files are commented inline. The sections that matter most:
-> **The IDL under-reports the legacy instructions.** It omits two PDAs that the on-chain program requires on the pre-v2 path:
-> - `bonding-curve-v2` — required on every legacy BC `buy` (18 accounts) and `sell` (16/17 accounts). Seed: `["bonding-curve-v2", mint]` under the pump program.
-> - `pool-v2` — required on every PumpSwap `buy`/`sell`. Seed: `["pool-v2", base_mint]` under the pump-amm program. **Without it, pump-amm throws `AnchorError 6023 (Overflow)` after the trade transfers complete** — a misleading error code for a missing-account issue.
->
-> The `buy_v2` / `sell_v2` account lists *are* complete in the IDL — that's the point of the v2 interface. For anything else, cross-check against a recent successful on-chain tx (`getSignaturesForAddress` + `getTransaction`) before trusting the IDL.
+- **`trade`** — `buy_amount` (in SOL), slippage, `exit_strategy` (`time_based`, `tp_sl`, `manual`), and `extreme_fast_mode`, which skips the bonding-curve price check and buys a fixed token amount instead. Faster, less precise.
+- **`priority_fees`** — fixed or dynamic. Dynamic costs an extra RPC call, which slows the buy.
+- **`filters`** — `listener_type`, `max_token_age`, name/creator matching, `marry_mode` (buy only, never sell), `yolo_mode` (trade continuously).
+- **`retries`** — attempts and the wait windows around creation, buy, and the next token.
+- **`cleanup`** — when to close leftover token accounts: `disabled`, `on_fail`, `after_sell`, `post_session`.
+- **`node.max_rps`** — cap requests per second to match your provider's plan.
-## Quote assets: SOL and USDC (v2 trade instructions)
+### Non-SOL quote assets
-Pump.fun added support for quote assets other than SOL, with USDC first. The bonding curve carries a `quote_mint` field (`Pubkey::default()` for SOL-paired coins), and trading non-SOL-paired coins **requires** the newer `buy_v2` / `sell_v2` instructions — the legacy `buy` / `sell` cannot do it at all.
-
-The bot uses `buy_v2` (27 accounts) and `sell_v2` (26 accounts) for every pump.fun trade. Every account is mandatory and the order is identical for all coins, regardless of quote asset, mayhem mode, or cashback — no more conditional account lists.
-
-To trade a non-SOL quote asset, give it a spend amount. Amounts are in that mint's own whole units, so `usdc: 1.0` is one USDC and is **not** comparable to `buy_amount`:
+pump.fun supports quote assets other than SOL, USDC first. Amounts are in that mint's own whole units, so `usdc: 1.0` is one USDC and is **not** comparable to `buy_amount`:
```yaml
trade:
- buy_amount: 0.0001 # SOL-paired coins
+ buy_amount: 0.0001 # SOL-paired coins
quote_amounts:
- usdc: 1.0 # USDC-paired coins
+ usdc: 1.0 # USDC-paired coins
filters:
- allowed_quote_mints: ["sol", "usdc"] # omit to allow any configured quote
+ allowed_quote_mints: ["sol", "usdc"] # omit to allow any configured quote
```
-Keys accept the aliases `sol` / `wsol` / `usdc` or a raw base58 mint address. A coin whose quote mint has no configured amount is skipped with a log line rather than bought with a wrongly-scaled amount. SOL always falls back to `buy_amount`, so existing configs keep working untouched.
+Keys accept the aliases `sol` / `wsol` / `usdc` or a raw base58 mint. A coin whose quote mint has no configured amount is skipped with a log line rather than bought with a wrongly-scaled amount. SOL always falls back to `buy_amount`, so existing configs keep working untouched. Buying a USDC-paired coin needs USDC in the wallet plus a little SOL for fees and ATA rent.
-Buying a USDC-paired coin requires USDC in the wallet plus a little SOL for fees and ATA rent.
+## Learning examples
-Verify the v2 wiring after any program upgrade:
+Standalone scripts, runnable with `uv run `. No bot config needed — they read `.env` directly.
+
+| Path | What it covers |
+|---|---|
+| `listen-new-tokens/` | One listener per method (`logs`, `blocks`, `geyser`, `pumpportal`) plus `compare_listeners.py` to race them |
+| `listen-migrations/` | Detect a token graduating from the bonding curve to PumpSwap |
+| `bonding-curve-progress/` | Curve state, progress polling, and tokens close to graduating |
+| `pumpswap/` | Manual buy/sell against the PumpSwap AMM, and pool discovery |
+| `letsbonk-buy-sell/` | Manual exact-in / exact-out buys and sells on letsbonk.fun |
+| `copytrading/` | Watch another wallet's transactions |
+| `manual_buy.py`, `manual_sell.py`, `fetch_price.py` | The minimal pump.fun trade and price path |
+| `mint_and_buy_v2.py` | Create a coin and buy it in one go |
+| `decode_from_*.py`, `calculate_discriminator.py` | Decoding account data, transactions, and Anchor discriminators |
+| `cleanup_accounts.py` | Close leftover empty token accounts |
+
+Two examples double as verification scripts to run after any pump.fun program upgrade:
```bash
-uv run learning-examples/verify_v2_account_layout.py # offline: layouts, PDAs, encoding
+uv run learning-examples/verify_v2_account_layout.py # offline: account layouts, PDAs, encoding
uv run learning-examples/simulate_v2_trades.py # mainnet simulation, no funds moved
-uv run learning-examples/simulate_bot_buy_path.py # whole bot buy path, simulated
+uv run learning-examples/verify_tx_status_checks.py # offline: every example checks meta.err
```
-## PumpSwap: quote against effective reserves
+Related docs: [Listening to pump.fun migrations](https://docs.chainstack.com/docs/solana-listening-to-pumpfun-migrations-to-raydium) · [Sniping with only logsSubscribe](https://docs.chainstack.com/docs/solana-listening-to-pumpfun-token-mint-using-only-logssubscribe)
-The PumpSwap `Pool` account gained a trailing `virtual_quote_reserves` field (an **`i128`** at offset 245; fields end at 261, live accounts are 301 bytes). Price must be computed from **effective** quote reserves:
+## Throughput and rate limits
-```
-effective_quote_reserves = pool_quote_token_account.amount + Pool::virtual_quote_reserves
+Every node provider has its own limits — method availability, requests per second, plan-specific caps. Consult your provider's docs before running the bot, and don't expect public RPC nodes to hold up.
+
+For Chainstack, the numbers you need are in the [throughput guidelines](https://docs.chainstack.com/docs/limits), kept up to date.
+
+The bot rate-limits itself with a token bucket: `node.max_rps` in the YAML (25 by default) smooths the request rate while allowing short bursts, and 429s are retried with exponential backoff.
+
+For faster execution, Chainstack offers [Solana Trader nodes](https://docs.chainstack.com/docs/trader-nodes) for transaction propagation and the [Yellowstone gRPC Geyser plugin](https://docs.chainstack.com/docs/yellowstone-grpc-geyser-plugin) for streaming updates.
+
+## IDLs
+
+The IDLs under [`idl/`](idl/) are vendored from [pump-fun/pump-public-docs](https://github.com/pump-fun/pump-public-docs) — currently upstream commit `9c82f61`. To refresh, copy `pump.json`, `pump_amm.json`, and `pump_fees.json` into `pump_fun_idl.json`, `pump_swap_idl.json`, and `pump_fees.json`, and note the upstream commit in your commit message. Don't hand-edit them.
+
+The `buy_v2` / `sell_v2` account lists are complete in the IDL — that's the point of the v2 interface. The **legacy** `buy` / `sell` lists are not: the IDL omits PDAs the on-chain program requires. For anything outside v2, cross-check against a recent successful on-chain transaction before trusting the IDL.
+
+[CLAUDE.md](CLAUDE.md) documents the protocol gotchas in detail — account layouts, quote-mint handling, fee recipients, and what the IDL gets wrong.
+
+## Contributing
+
+Maintainers are listed in [MAINTAINERS.md](MAINTAINERS.md). Open an **Issue** for feedback or bugs.
+
+Lint and format the files you changed (`uv sync` installs `ruff` for you):
+
+```bash
+uv run ruff check --fix path/to/changed.py
+uv run ruff format path/to/changed.py
```
-> ⚠️ Upstream's release note says `virtual_quote_reserves` is 0 on every pool. **That is out of date.** Verified on mainnet: pool `6Bv1JM1deBPeEeovhoRajFtbMVDKQidC9mXYRQWfGoXz` holds 17.584505433 SOL of virtual reserves against a 148.455 SOL vault — quoting off the raw vault balance under-prices by **~10.6%**. Note it is `i128`, not `u64`; an 8-byte read only works while the high half happens to be zero.
+Running `ruff check` over the whole repo reports a large backlog of pre-existing
+errors — that's a known baseline, so scope it to your own files.
-`learning-examples/pumpswap/manual_buy_pumpswap.py` and `manual_sell_pumpswap.py` read and apply it. Note that pump-amm has **no** `buy_v2`/`sell_v2` — the AMM instruction names are unchanged; only the pool layout and quoting moved.
-
-## 2026-04-28 program upgrade
-
-Pump.fun shipped a breaking program upgrade on **2026-04-28 16:00 UTC** ([BREAKING_FEE_RECIPIENT.md](https://github.com/pump-fun/pump-public-docs/blob/main/docs/BREAKING_FEE_RECIPIENT.md)). This section describes the **legacy** instruction path, which the bot retains only as a fallback (`PumpFunInstructionBuilder(..., use_legacy_instructions=True)`) — see the quote-assets section above for the v2 path used by default:
-
-- BC `buy` ix is now **18 accounts** (was 17). Trailing account is one of 8 `BREAKING_FEE_RECIPIENTS` (mutable), AFTER `bonding-curve-v2`.
-- BC `sell` ix is now **16 accounts non-cashback / 17 cashback** (was 15/16). Same trailing fee recipient.
-- PumpSwap `buy`/`sell` get **+2 accounts** appended after `pool-v2`: a fee recipient (readonly) and its quote-mint ATA (mutable). Counts: buy = 26 non-cashback / 27 cashback; sell = 24 / 26. Cashback pools insert `user_volume_accumulator_quote_ata` (writable) BEFORE `pool-v2` on buys; sells insert both that ATA and `user_volume_accumulator` (both writable) BEFORE `pool-v2`. Detect cashback via pool data byte 244.
-
-The 8 fee recipients are randomized per tx in code (per pump.fun's recommendation to spread program-tx throughput).
-
-## Changelog
-
-Quick note on a couple on a few new scripts in `/learning-examples`:
-
-*(this is basically a changelog now)*
-
-Also, here's a quick doc: [Listening to pump.fun migrations to Raydium](https://docs.chainstack.com/docs/solana-listening-to-pumpfun-migrations-to-raydium)
-
-## Bonding curve state check
-
-`get_bonding_curve_status.py` — checks the state of the bonding curve associated with a token. When the bonding curve state is completed, the token is migrated to Raydium.
-
-To run:
-
-`uv run learning-examples/bonding-curve-progress/get_bonding_curve_status.py TOKEN_ADDRESS`
-
-## Listening to the Pump AMM migration
-
-When the bonding curve state completes, the liquidity and the token graduate to Pump AMM (PumpSwap).
-
-`listen_logsubscribe.py` — listens to the migration events of the tokens from bonding curves to AMM and prints the signature of the migration, the token address, and the liquidity pool address on Pump AMM.
-
-`listen_blocksubscribe_old_raydium.py` — listens to the migration events of the tokens from bonding curves to AMM and prints the signature of the migration, the token address, and the liquidity pool address on Pump AMM (previously, tokens migrated to Raydium).
-
-Note that it's using the [blockSubscribe]([url](https://docs.chainstack.com/reference/blocksubscribe-solana)) method that not all providers support, but Chainstack does and I (although obviously biased) found it pretty reliable.
-
-To run:
-
-`uv run learning-examples/listen-migrations/listen_logsubscribe.py`
-
-`uv run learning-examples/listen-migrations/listen_blocksubscribe_old_raydium.py`
-
-**The following two new additions are based on this question [associatedBondingCurve #26](https://github.com/chainstacklabs/pump-fun-bot/issues/26)**
-
-You can take the compute the associatedBondingCurve address following the [Solana docs PDA](https://solana.com/docs/core/pda) description logic. Take the following as input *as seed* (order seems to matter):
-
-- bondingCurve address
-- the Solana system token program address: `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`
-- the token mint address
-
-And compute against the Solana system associated token account program address: `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL`.
-
-The implications of this are kinda huge:
-* you can now use `logsSubscribe` to snipe the tokens and you are not limited to the `blockSubscribe` method
-* see which one is faster
-* not every provider supports `blockSubscribe` on lower tier plans or at all, but everyone supports `logsSubscribe`
-
-The following script showcase the implementation.
-
-## Compute associated bonding curve
-
-`compute_associated_bonding_curve.py` — computes the associated bonding curve for a given token.
-
-To run:
-
-`uv run learning-examples/compute_associated_bonding_curve.py` and then enter the token mint address.
-
-## Listen to new tokens
-
-`listen_logsubscribe_abc.py` — listens to new tokens and prints the signature, the token address, the user, the bonding curve address, and the associated bonding curve address using just the `logsSubscribe` method. Basically everything you need for sniping using just `logsSubscribe` (with some [limitations](https://github.com/chainstacklabs/pump-fun-bot/issues/87)) and no extra calls like doing `getTransaction` to get the missing data. It's just computed on the fly now.
-
-To run:
-
-`uv run learning-examples/listen-new-tokens/listen_logsubscribe_abc.py`
-
-So now you can run `compare_listeners.py` see which one is faster.
-
-`uv run learning-examples/listen-new-tokens/compare_listeners.py`
-
-Also here's a doc on this: [Solana: Listening to pump.fun token mint using only logsSubscribe](https://docs.chainstack.com/docs/solana-listening-to-pumpfun-token-mint-using-only-logssubscribe)
+Then test your change with a learning example rather than by running a bot with real funds.
---
-# Pump.fun bot development roadmap (March - April 2025, mostly completed)
+**Also by Chainstack** — if you prefer a terminal interface or want to give an AI agent trading capabilities:
-~~As of March 21, 2025, the bot from the **refactored/main-v2** branch is signficantly better over the **main** version, so the suggestion is to FAFO with v2.~~
-
-As of April 30, 2025, all changes from **refactored/main-v2** are merged into the **main** version.
-
-| Stage | Feature | Comments | Implementation status |
-|-------|---------|----------|---------------------|
-| **Stage 1: General updates & QoL** | Lib updates | Updating to the latest libraries | ✅ |
-| | Error handling | Improving error handling | ✅ |
-| | Configurable RPS | Ability to set RPS in the config to match your provider's and plan RPS (preferably [Chainstack](https://console.chainstack.com/) 🤩) | ✅ |
-| | Dynamic priority fees | Ability to set dynamic priority fees | ✅ |
-| | Review & optimize `json`, `jsonParsed`, `base64` | Improve speed and traffic for calls, not just `getBlock`. [Helpful overview](https://docs.chainstack.com/docs/solana-optimize-your-getblock-performance#json-jsonparsed-base58-base64).| ✅ |
-| **Stage 2: Bonding curve and migration management** | `logsSubscribe` integration | Integrate `logsSubscribe` instead of `blockSubscribe` for sniping minted tokens into the main bot | ✅ |
-| | Dual subscription methods | Keep both `logsSubscribe` & `blockSubscribe` in the main bot for flexibility and adapting to Solana node architecture changes | ✅ |
-| | Transaction retries | Do retries instead of cooldown and/or keep the cooldown | ✅ |
-| | Bonding curve status tracking | Checking a bonding curve status progress. Predict how soon a token will start the migration process | ✅ |
-| | Account closure script | Script to close the associated bonding curve account if the rest of the flow txs fails | ✅ |
-| | PumpSwap migration listening | pump_fun migrated to their own DEX — [PumpSwap](https://x.com/pumpdotfun/status/1902762309950292010), so we need to FAFO with that instead of Raydium (and attempt `logSubscribe` implementation) | ✅ |
-| **Stage 3: Trading experience** | Take profit/stop loss | Implement take profit, stop loss exit strategies | ✅ |
-| | Market cap-based selling | Sell when a specific market cap has been reached | Not started |
-| | Copy trading | Enable copy trading functionality | Not started |
-| | Token analysis script | Script for basic token analysis (market cap, creator investment, liquidity, token age) | Not started |
-| | Archive node integration | Use Solana archive nodes for historical analysis (accounts that consistently print tokens, average mint to raydium time) | Not started |
-| | Geyser implementation | Leverage Solana Geyser for real-time data stream processing | ✅ |
-| **Stage 4: Minting experience** | Token minting | Ability to mint tokens (based on user request - someone minted 18k tokens) | ✅ |
-
----
+- [**pumpfun-cli**](https://github.com/chainstacklabs/pumpfun-cli) — CLI for trading, launching, and managing tokens on pump.fun; buy, sell, wallet management, and smart routing between the bonding curve and PumpSwap AMM.
+- [**pumpclaw**](https://github.com/chainstacklabs/pumpclaw) — agent skill that equips AI assistants (OpenClaw, Claude Code, Cursor, Codex) with the ability to operate pumpfun-cli.
diff --git a/pyproject.toml b/pyproject.toml
index 49c7d33..e2c95cc 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,29 +3,28 @@ name = "pump_bot"
version = "2.0"
description = "Trade tokens on pump.fun"
readme = "README.md"
-requires-python = ">=3.9"
+requires-python = ">=3.11"
dependencies = [
"base58>=2.1.1",
- "borsh-construct>=0.1.0",
"construct>=2.10.67",
- "construct-typing>=0.5.2",
"solana==0.36.6",
"solders>=0.26.0",
"websockets>=15.0",
"python-dotenv>=1.2.1",
"aiohttp>=3.11.13",
"grpcio>=1.71.0",
- "grpcio-tools>=1.71.0",
"protobuf>=5.29.4",
"pyyaml>=6.0.2",
"uvloop>=0.21.0; sys_platform != 'win32'",
"winloop>=0.1.0; sys_platform == 'win32'",
]
-[project.optional-dependencies]
+[dependency-groups]
dev = [
- "ruff>=0.10.0"
+ "ruff>=0.10.0",
+ # protoc; only needed to regenerate the geyser_pb2 stubs from proto/
+ "grpcio-tools>=1.71.0",
]
[project.scripts]
diff --git a/uv.lock b/uv.lock
index 664103b..96ada4c 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,6 +1,6 @@
version = 1
revision = 3
-requires-python = ">=3.9"
+requires-python = ">=3.11"
[[package]]
name = "aiohappyeyeballs"
@@ -18,7 +18,6 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiohappyeyeballs" },
{ name = "aiosignal" },
- { name = "async-timeout", marker = "python_full_version < '3.11'" },
{ name = "attrs" },
{ name = "frozenlist" },
{ name = "multidict" },
@@ -27,23 +26,6 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/45/4a/064321452809dae953c1ed6e017504e72551a26b6f5708a5a80e4bf556ff/aiohttp-3.13.4.tar.gz", hash = "sha256:d97a6d09c66087890c2ab5d49069e1e570583f7ac0314ecf98294c1b6aaebd38", size = 7859748, upload-time = "2026-03-28T17:19:40.6Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/05/6817e0390eb47b0867cf8efdb535298191662192281bc3ca62a0cb7973eb/aiohttp-3.13.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6290fe12fe8cefa6ea3c1c5b969d32c010dfe191d4392ff9b599a3f473cbe722", size = 753094, upload-time = "2026-03-28T17:14:59.928Z" },
- { url = "https://files.pythonhosted.org/packages/b4/c1/e5b7f25f6dd1ab57da92aa9d226b2c8b56f223dd20475d3ddfddaba86ab8/aiohttp-3.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7520d92c0e8fbbe63f36f20a5762db349ff574ad38ad7bc7732558a650439845", size = 505213, upload-time = "2026-03-28T17:15:01.989Z" },
- { url = "https://files.pythonhosted.org/packages/b4/e5/8f42033c7ce98b54dfd3791f03e60231cfe4a2db4471b5fc188df2b8a6ad/aiohttp-3.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2710ae1e1b81d0f187883b6e9d66cecf8794b50e91aa1e73fc78bfb5503b5d9", size = 498580, upload-time = "2026-03-28T17:15:03.879Z" },
- { url = "https://files.pythonhosted.org/packages/8c/a4/bbc989f5362066b81930da1a66084a859a971d03faab799dc59a3ce3a220/aiohttp-3.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:717d17347567ded1e273aa09918650dfd6fd06f461549204570c7973537d4123", size = 1692718, upload-time = "2026-03-28T17:15:05.541Z" },
- { url = "https://files.pythonhosted.org/packages/1c/72/3775116969931f151be116689d2ae6ddafff2ec2887d8f9b4e7043f32e74/aiohttp-3.13.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:383880f7b8de5ac208fa829c7038d08e66377283b2de9e791b71e06e803153c2", size = 1660714, upload-time = "2026-03-28T17:15:08.23Z" },
- { url = "https://files.pythonhosted.org/packages/a1/e8/d2f1a2da2743e32fe348ebf8a4c59caad14a92f5f18af616fd33381275e1/aiohttp-3.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1867087e2c1963db1216aedf001efe3b129835ed2b05d97d058176a6d08b5726", size = 1744152, upload-time = "2026-03-28T17:15:10.828Z" },
- { url = "https://files.pythonhosted.org/packages/4c/a6/575886f417ac3c08e462f2ca237cc49f436bd992ca3f7ff95b7dd9c44205/aiohttp-3.13.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6234bf416a38d687c3ab7f79934d7fb2a42117a5b9813aca07de0a5398489023", size = 1836278, upload-time = "2026-03-28T17:15:12.537Z" },
- { url = "https://files.pythonhosted.org/packages/4a/4c/0051d4550fb9e8b5ca4e0fe1ccd58652340915180c5164999e6741bf2083/aiohttp-3.13.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdd3393130bf6588962441ffd5bde1d3ea2d63a64afa7119b3f3ba349cebbe7", size = 1687953, upload-time = "2026-03-28T17:15:14.248Z" },
- { url = "https://files.pythonhosted.org/packages/c9/54/841e87b8c51c2adc01a3ceb9919dc45c7899fe4c21deb70aada734ea5a38/aiohttp-3.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d0dbc6c76befa76865373d6aa303e480bb8c3486e7763530f7f6e527b471118", size = 1572484, upload-time = "2026-03-28T17:15:15.911Z" },
- { url = "https://files.pythonhosted.org/packages/da/f1/21cbf5f7fa1e267af6301f886cab9b314f085e4d0097668d189d165cd7da/aiohttp-3.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10fb7b53262cf4144a083c9db0d2b4d22823d6708270a9970c4627b248c6064c", size = 1662851, upload-time = "2026-03-28T17:15:17.822Z" },
- { url = "https://files.pythonhosted.org/packages/40/15/bcad6b68d7bef27ae7443288215767263c7753ede164267cf6cf63c94a87/aiohttp-3.13.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:eb10ce8c03850e77f4d9518961c227be569e12f71525a7e90d17bca04299921d", size = 1671984, upload-time = "2026-03-28T17:15:19.561Z" },
- { url = "https://files.pythonhosted.org/packages/ff/fa/ab316931afc7a73c7f493bb1b30fbd61e28ec2d3ea50353336e76293e8ec/aiohttp-3.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7c65738ac5ae32b8feef699a4ed0dc91a0c8618b347781b7461458bbcaaac7eb", size = 1713880, upload-time = "2026-03-28T17:15:21.589Z" },
- { url = "https://files.pythonhosted.org/packages/1c/45/314e8e64c7f328174964b6db511dd5e9e60c9121ab5457bc2c908b7d03a4/aiohttp-3.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6b335919ffbaf98df8ff3c74f7a6decb8775882632952fd1810a017e38f15aee", size = 1560315, upload-time = "2026-03-28T17:15:23.66Z" },
- { url = "https://files.pythonhosted.org/packages/18/e7/93d5fa06fe00219a81466577dacae9e3732f3b4f767b12b2e2cc8c35c970/aiohttp-3.13.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ec75fc18cb9f4aca51c2cbace20cf6716e36850f44189644d2d69a875d5e0532", size = 1735115, upload-time = "2026-03-28T17:15:25.77Z" },
- { url = "https://files.pythonhosted.org/packages/19/9f/f64b95392ddd4e204fd9ab7cd33dd18d14ac9e4b86866f1f6a69b7cda83d/aiohttp-3.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:463fa18a95c5a635d2b8c09babe240f9d7dbf2a2010a6c0b35d8c4dff2a0e819", size = 1673916, upload-time = "2026-03-28T17:15:27.526Z" },
- { url = "https://files.pythonhosted.org/packages/52/c1/bb33be79fd285c69f32e5b074b299cae8847f748950149c3965c1b3b3adf/aiohttp-3.13.4-cp310-cp310-win32.whl", hash = "sha256:13168f5645d9045522c6cef818f54295376257ed8d02513a37c2ef3046fc7a97", size = 440277, upload-time = "2026-03-28T17:15:29.173Z" },
- { url = "https://files.pythonhosted.org/packages/23/f9/7cf1688da4dd0885f914ee40bc8e1dce776df98fe6518766de975a570538/aiohttp-3.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:a7058af1f53209fdf07745579ced525d38d481650a989b7aa4a3b484b901cdab", size = 463015, upload-time = "2026-03-28T17:15:30.802Z" },
{ url = "https://files.pythonhosted.org/packages/d4/7e/cb94129302d78c46662b47f9897d642fd0b33bdfef4b73b20c6ced35aa4c/aiohttp-3.13.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8ea0c64d1bcbf201b285c2246c51a0c035ba3bbd306640007bc5844a3b4658c1", size = 760027, upload-time = "2026-03-28T17:15:33.022Z" },
{ url = "https://files.pythonhosted.org/packages/5e/cd/2db3c9397c3bd24216b203dd739945b04f8b87bb036c640da7ddb63c75ef/aiohttp-3.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f742e1fa45c0ed522b00ede565e18f97e4cf8d1883a712ac42d0339dfb0cce7", size = 508325, upload-time = "2026-03-28T17:15:34.714Z" },
{ url = "https://files.pythonhosted.org/packages/36/a3/d28b2722ec13107f2e37a86b8a169897308bab6a3b9e071ecead9d67bd9b/aiohttp-3.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dcfb50ee25b3b7a1222a9123be1f9f89e56e67636b561441f0b304e25aaef8f", size = 502402, upload-time = "2026-03-28T17:15:36.409Z" },
@@ -129,23 +111,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/1a/e6/1b3566e103eca6da5be4ae6713e112a053725c584e96574caf117568ffef/aiohttp-3.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cb19177205d93b881f3f89e6081593676043a6828f59c78c17a0fd6c1fbed2ba", size = 1782635, upload-time = "2026-03-28T17:18:43.073Z" },
{ url = "https://files.pythonhosted.org/packages/37/58/1b11c71904b8d079eb0c39fe664180dd1e14bebe5608e235d8bfbadc8929/aiohttp-3.13.4-cp314-cp314t-win32.whl", hash = "sha256:c606aa5656dab6552e52ca368e43869c916338346bfaf6304e15c58fb113ea30", size = 472537, upload-time = "2026-03-28T17:18:46.286Z" },
{ url = "https://files.pythonhosted.org/packages/bc/8f/87c56a1a1977d7dddea5b31e12189665a140fdb48a71e9038ff90bb564ec/aiohttp-3.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:014dcc10ec8ab8db681f0d68e939d1e9286a5aa2b993cbbdb0db130853e02144", size = 506381, upload-time = "2026-03-28T17:18:48.74Z" },
- { url = "https://files.pythonhosted.org/packages/0a/f9/17e8a70abe874ec694395119338fde2f13ee1903bd14f3fd5b310b77a1ea/aiohttp-3.13.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b3f00bb9403728b08eb3951e982ca0a409c7a871d709684623daeab79465b181", size = 755716, upload-time = "2026-03-28T17:18:51.918Z" },
- { url = "https://files.pythonhosted.org/packages/27/b3/fdb36e59b9fb37297b1651248d3d84e61faa49af2faabc1e243d3f75585f/aiohttp-3.13.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb15595eb52870f84248d7cc97013a76f52ab02ff74d394be093b1d9b8b82bc0", size = 506500, upload-time = "2026-03-28T17:18:54.755Z" },
- { url = "https://files.pythonhosted.org/packages/cf/fb/dacf759c43cfb5fa32568bd369f054eeb23906ab23f4e3663e01e04c7988/aiohttp-3.13.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:907ad36b6a65cff7d88d7aca0f77c650546ba850a4f92c92ecb83590d4613249", size = 499881, upload-time = "2026-03-28T17:18:57.302Z" },
- { url = "https://files.pythonhosted.org/packages/52/cd/7824ee57dde8ca7f62e7fbc247ebe1aa3b5495d3598f0c516f06de1ef7ab/aiohttp-3.13.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5539ec0d6a3a5c6799b661b7e79166ad1b7ae71ccb59a92fcb6b4ef89295bc94", size = 1681734, upload-time = "2026-03-28T17:19:00.057Z" },
- { url = "https://files.pythonhosted.org/packages/7a/40/6f4ca61736a16deed2d2762a8dbeaaa48ad292974489be2a2f32f62a4e0b/aiohttp-3.13.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3b4e07d8803a70dd886b5f38588e5b49f894995ca8e132b06c31a2583ae2ef6e", size = 1653787, upload-time = "2026-03-28T17:19:03.026Z" },
- { url = "https://files.pythonhosted.org/packages/89/80/3793f0a1148a42190f6824ce9a0af79910cd3df8dfc58fa784234a7d9e41/aiohttp-3.13.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ce7320a945aac4bf0bb8901600e4f9409eb602f25ce3ef4d275b48f6d704a862", size = 1737964, upload-time = "2026-03-28T17:19:05.77Z" },
- { url = "https://files.pythonhosted.org/packages/15/fd/e41981d0f9e0dccfb8f2580d4e64e6c59d293b9b0815849950cc499fe53a/aiohttp-3.13.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:26ed03f7d3d6453634729e2c7600d7255d65e879559c5a48fe1bb78355cde74b", size = 1832226, upload-time = "2026-03-28T17:19:08.809Z" },
- { url = "https://files.pythonhosted.org/packages/fa/69/e6b566c638b37bfa14b98c2c429fcdba3b097a990acc9845fcc779ce39cc/aiohttp-3.13.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3f733916e85506b8000dddc071c6b82f8c68f56c99adb328d6550017db062d", size = 1681476, upload-time = "2026-03-28T17:19:11.502Z" },
- { url = "https://files.pythonhosted.org/packages/7d/8c/f1b7f03e745fa6281dd949673297c7ac54d7cc54d2e58beb5135ac5c6204/aiohttp-3.13.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3d525648fe7c8b4977e460c18098f9f81d7991d72edfdc2f13cf96068f279bc", size = 1573061, upload-time = "2026-03-28T17:19:14.437Z" },
- { url = "https://files.pythonhosted.org/packages/bc/56/e7e972f1bed922297d72cc1d27bae6b2e28fdc2d6a895320e396a93c0f8a/aiohttp-3.13.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4e2e68085730a03704beb2cff035fa8648f62c9f93758d7e6d70add7f7bb5b3b", size = 1653248, upload-time = "2026-03-28T17:19:17.432Z" },
- { url = "https://files.pythonhosted.org/packages/cf/98/3d63d2f2e06808911e103d6d47c400548cf26a23dd3275de594339ff8e96/aiohttp-3.13.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:797613182ffaaca0b9ad5f3b3d3ce5d21242c768f75e66c750b8292bd97c9de3", size = 1666599, upload-time = "2026-03-28T17:19:20.17Z" },
- { url = "https://files.pythonhosted.org/packages/da/c8/31e487fb16d37c89cc6ee190a424b218471750ac48a227e042e200a17687/aiohttp-3.13.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2d15e7e4f1099d9e4d863eaf77a8eee5dcb002b7d7188061b0fbee37f845899e", size = 1709919, upload-time = "2026-03-28T17:19:22.872Z" },
- { url = "https://files.pythonhosted.org/packages/c1/86/3b742bd9204b7deb4f61e6723b1f42a8211ccc60dfddb3e52a6cd4329d46/aiohttp-3.13.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:19f60011ad60e40a01d242238bb335399e3a4d8df958c63cbb835add8d5c3b5a", size = 1560523, upload-time = "2026-03-28T17:19:25.879Z" },
- { url = "https://files.pythonhosted.org/packages/72/63/6b80cef343a0527690588808d02aad7604cc4e23eaab207179e77dd607be/aiohttp-3.13.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c344c47e85678e410b064fc2ace14db86bb69db7ed5520c234bf13aed603ec30", size = 1731336, upload-time = "2026-03-28T17:19:29.02Z" },
- { url = "https://files.pythonhosted.org/packages/d4/3c/9b39bc9609cac87e19b3394b7ed4bbab3787b434b14e012b9e16be64e9d5/aiohttp-3.13.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d904084985ca66459e93797e5e05985c048a9c0633655331144c089943e53d12", size = 1667646, upload-time = "2026-03-28T17:19:31.797Z" },
- { url = "https://files.pythonhosted.org/packages/21/72/3fb0ea857c891de89f6914f737f7423b7fa4dd1f46d8ce621eb07595ff4c/aiohttp-3.13.4-cp39-cp39-win32.whl", hash = "sha256:1746338dc2a33cf706cd7446575d13d451f28f9860bebc908c7632b22e71ae3f", size = 441019, upload-time = "2026-03-28T17:19:34.79Z" },
- { url = "https://files.pythonhosted.org/packages/b1/61/8a7191782a31ae3c7f7cee2cd2e37b3ee5849666767db116d449cfe20b88/aiohttp-3.13.4-cp39-cp39-win_amd64.whl", hash = "sha256:a5444dce2e6fba0a1dc2d58d026e674f25f21de178c6f844342629bcef019f2f", size = 464025, upload-time = "2026-03-28T17:19:37.362Z" },
]
[[package]]
@@ -166,7 +131,6 @@ name = "anyio"
version = "4.9.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
{ name = "idna" },
{ name = "sniffio" },
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
@@ -176,15 +140,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" },
]
-[[package]]
-name = "async-timeout"
-version = "5.0.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" },
-]
-
[[package]]
name = "attrs"
version = "25.3.0"
@@ -203,19 +158,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/4a/45/ec96b29162a402fc4c1c5512d114d7b3787b9d1c2ec241d9568b4816ee23/base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2", size = 5621, upload-time = "2021-10-30T22:12:16.658Z" },
]
-[[package]]
-name = "borsh-construct"
-version = "0.1.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "construct-typing" },
- { name = "sumtypes" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/8e/0c/8062d8d795e7b9518923bfba453f883e2cbf80c5b05de699e4424a523a71/borsh-construct-0.1.0.tar.gz", hash = "sha256:c916758ceba70085d8f456a1cc26991b88cb64233d347767766473b651b37263", size = 5808, upload-time = "2021-10-20T11:16:49.095Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/21/1d/52c0741626a17eb1a2f554e27dc2883f9bb98bb7b2392f9cbd1f39c36fea/borsh_construct-0.1.0-py3-none-any.whl", hash = "sha256:f584c791e2a03f8fc36e6c13011a27bcaf028c9c54ba89cd70f485a7d1c687ed", size = 6386, upload-time = "2021-10-20T11:16:47.84Z" },
-]
-
[[package]]
name = "certifi"
version = "2025.7.14"
@@ -243,41 +185,12 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/3e/c5/d68c7b7e5e2875d199b49f86f9fda2b18a58ff0a835f608cb664bbc3a53e/construct_typing-0.5.6-py3-none-any.whl", hash = "sha256:39c948329e880564e33521cba497b21b07967c465b9c9037d6334e2cffa1ced9", size = 24098, upload-time = "2023-05-09T11:05:48.66Z" },
]
-[[package]]
-name = "exceptiongroup"
-version = "1.3.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.13'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" },
-]
-
[[package]]
name = "frozenlist"
version = "1.7.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/79/b1/b64018016eeb087db503b038296fd782586432b9c077fc5c7839e9cb6ef6/frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", size = 45078, upload-time = "2025-06-09T23:02:35.538Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/af/36/0da0a49409f6b47cc2d060dc8c9040b897b5902a8a4e37d9bc1deb11f680/frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a", size = 81304, upload-time = "2025-06-09T22:59:46.226Z" },
- { url = "https://files.pythonhosted.org/packages/77/f0/77c11d13d39513b298e267b22eb6cb559c103d56f155aa9a49097221f0b6/frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61", size = 47735, upload-time = "2025-06-09T22:59:48.133Z" },
- { url = "https://files.pythonhosted.org/packages/37/12/9d07fa18971a44150593de56b2f2947c46604819976784bcf6ea0d5db43b/frozenlist-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d", size = 46775, upload-time = "2025-06-09T22:59:49.564Z" },
- { url = "https://files.pythonhosted.org/packages/70/34/f73539227e06288fcd1f8a76853e755b2b48bca6747e99e283111c18bcd4/frozenlist-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e", size = 224644, upload-time = "2025-06-09T22:59:51.35Z" },
- { url = "https://files.pythonhosted.org/packages/fb/68/c1d9c2f4a6e438e14613bad0f2973567586610cc22dcb1e1241da71de9d3/frozenlist-1.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9", size = 222125, upload-time = "2025-06-09T22:59:52.884Z" },
- { url = "https://files.pythonhosted.org/packages/b9/d0/98e8f9a515228d708344d7c6986752be3e3192d1795f748c24bcf154ad99/frozenlist-1.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c", size = 233455, upload-time = "2025-06-09T22:59:54.74Z" },
- { url = "https://files.pythonhosted.org/packages/79/df/8a11bcec5600557f40338407d3e5bea80376ed1c01a6c0910fcfdc4b8993/frozenlist-1.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981", size = 227339, upload-time = "2025-06-09T22:59:56.187Z" },
- { url = "https://files.pythonhosted.org/packages/50/82/41cb97d9c9a5ff94438c63cc343eb7980dac4187eb625a51bdfdb7707314/frozenlist-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615", size = 212969, upload-time = "2025-06-09T22:59:57.604Z" },
- { url = "https://files.pythonhosted.org/packages/13/47/f9179ee5ee4f55629e4f28c660b3fdf2775c8bfde8f9c53f2de2d93f52a9/frozenlist-1.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50", size = 222862, upload-time = "2025-06-09T22:59:59.498Z" },
- { url = "https://files.pythonhosted.org/packages/1a/52/df81e41ec6b953902c8b7e3a83bee48b195cb0e5ec2eabae5d8330c78038/frozenlist-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa", size = 222492, upload-time = "2025-06-09T23:00:01.026Z" },
- { url = "https://files.pythonhosted.org/packages/84/17/30d6ea87fa95a9408245a948604b82c1a4b8b3e153cea596421a2aef2754/frozenlist-1.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577", size = 238250, upload-time = "2025-06-09T23:00:03.401Z" },
- { url = "https://files.pythonhosted.org/packages/8f/00/ecbeb51669e3c3df76cf2ddd66ae3e48345ec213a55e3887d216eb4fbab3/frozenlist-1.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59", size = 218720, upload-time = "2025-06-09T23:00:05.282Z" },
- { url = "https://files.pythonhosted.org/packages/1a/c0/c224ce0e0eb31cc57f67742071bb470ba8246623c1823a7530be0e76164c/frozenlist-1.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e", size = 232585, upload-time = "2025-06-09T23:00:07.962Z" },
- { url = "https://files.pythonhosted.org/packages/55/3c/34cb694abf532f31f365106deebdeac9e45c19304d83cf7d51ebbb4ca4d1/frozenlist-1.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd", size = 234248, upload-time = "2025-06-09T23:00:09.428Z" },
- { url = "https://files.pythonhosted.org/packages/98/c0/2052d8b6cecda2e70bd81299e3512fa332abb6dcd2969b9c80dfcdddbf75/frozenlist-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718", size = 221621, upload-time = "2025-06-09T23:00:11.32Z" },
- { url = "https://files.pythonhosted.org/packages/c5/bf/7dcebae315436903b1d98ffb791a09d674c88480c158aa171958a3ac07f0/frozenlist-1.7.0-cp310-cp310-win32.whl", hash = "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e", size = 39578, upload-time = "2025-06-09T23:00:13.526Z" },
- { url = "https://files.pythonhosted.org/packages/8f/5f/f69818f017fa9a3d24d1ae39763e29b7f60a59e46d5f91b9c6b21622f4cd/frozenlist-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464", size = 43830, upload-time = "2025-06-09T23:00:14.98Z" },
{ url = "https://files.pythonhosted.org/packages/34/7e/803dde33760128acd393a27eb002f2020ddb8d99d30a44bfbaab31c5f08a/frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", size = 82251, upload-time = "2025-06-09T23:00:16.279Z" },
{ url = "https://files.pythonhosted.org/packages/75/a9/9c2c5760b6ba45eae11334db454c189d43d34a4c0b489feb2175e5e64277/frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", size = 48183, upload-time = "2025-06-09T23:00:17.698Z" },
{ url = "https://files.pythonhosted.org/packages/47/be/4038e2d869f8a2da165f35a6befb9158c259819be22eeaf9c9a8f6a87771/frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", size = 47107, upload-time = "2025-06-09T23:00:18.952Z" },
@@ -346,23 +259,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/40/37/5f9f3c3fd7f7746082ec67bcdc204db72dad081f4f83a503d33220a92973/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", size = 282620, upload-time = "2025-06-09T23:02:00.493Z" },
{ url = "https://files.pythonhosted.org/packages/0b/31/8fbc5af2d183bff20f21aa743b4088eac4445d2bb1cdece449ae80e4e2d1/frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", size = 43059, upload-time = "2025-06-09T23:02:02.072Z" },
{ url = "https://files.pythonhosted.org/packages/bb/ed/41956f52105b8dbc26e457c5705340c67c8cc2b79f394b79bffc09d0e938/frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", size = 47516, upload-time = "2025-06-09T23:02:03.779Z" },
- { url = "https://files.pythonhosted.org/packages/dd/b1/ee59496f51cd244039330015d60f13ce5a54a0f2bd8d79e4a4a375ab7469/frozenlist-1.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630", size = 82434, upload-time = "2025-06-09T23:02:05.195Z" },
- { url = "https://files.pythonhosted.org/packages/75/e1/d518391ce36a6279b3fa5bc14327dde80bcb646bb50d059c6ca0756b8d05/frozenlist-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71", size = 48232, upload-time = "2025-06-09T23:02:07.728Z" },
- { url = "https://files.pythonhosted.org/packages/b7/8d/a0d04f28b6e821a9685c22e67b5fb798a5a7b68752f104bfbc2dccf080c4/frozenlist-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44", size = 47186, upload-time = "2025-06-09T23:02:09.243Z" },
- { url = "https://files.pythonhosted.org/packages/93/3a/a5334c0535c8b7c78eeabda1579179e44fe3d644e07118e59a2276dedaf1/frozenlist-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878", size = 226617, upload-time = "2025-06-09T23:02:10.949Z" },
- { url = "https://files.pythonhosted.org/packages/0a/67/8258d971f519dc3f278c55069a775096cda6610a267b53f6248152b72b2f/frozenlist-1.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb", size = 224179, upload-time = "2025-06-09T23:02:12.603Z" },
- { url = "https://files.pythonhosted.org/packages/fc/89/8225905bf889b97c6d935dd3aeb45668461e59d415cb019619383a8a7c3b/frozenlist-1.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6", size = 235783, upload-time = "2025-06-09T23:02:14.678Z" },
- { url = "https://files.pythonhosted.org/packages/54/6e/ef52375aa93d4bc510d061df06205fa6dcfd94cd631dd22956b09128f0d4/frozenlist-1.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35", size = 229210, upload-time = "2025-06-09T23:02:16.313Z" },
- { url = "https://files.pythonhosted.org/packages/ee/55/62c87d1a6547bfbcd645df10432c129100c5bd0fd92a384de6e3378b07c1/frozenlist-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87", size = 215994, upload-time = "2025-06-09T23:02:17.9Z" },
- { url = "https://files.pythonhosted.org/packages/45/d2/263fea1f658b8ad648c7d94d18a87bca7e8c67bd6a1bbf5445b1bd5b158c/frozenlist-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677", size = 225122, upload-time = "2025-06-09T23:02:19.479Z" },
- { url = "https://files.pythonhosted.org/packages/7b/22/7145e35d12fb368d92124f679bea87309495e2e9ddf14c6533990cb69218/frozenlist-1.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938", size = 224019, upload-time = "2025-06-09T23:02:20.969Z" },
- { url = "https://files.pythonhosted.org/packages/44/1e/7dae8c54301beb87bcafc6144b9a103bfd2c8f38078c7902984c9a0c4e5b/frozenlist-1.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2", size = 239925, upload-time = "2025-06-09T23:02:22.466Z" },
- { url = "https://files.pythonhosted.org/packages/4b/1e/99c93e54aa382e949a98976a73b9b20c3aae6d9d893f31bbe4991f64e3a8/frozenlist-1.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319", size = 220881, upload-time = "2025-06-09T23:02:24.521Z" },
- { url = "https://files.pythonhosted.org/packages/5e/9c/ca5105fa7fb5abdfa8837581be790447ae051da75d32f25c8f81082ffc45/frozenlist-1.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890", size = 234046, upload-time = "2025-06-09T23:02:26.206Z" },
- { url = "https://files.pythonhosted.org/packages/8d/4d/e99014756093b4ddbb67fb8f0df11fe7a415760d69ace98e2ac6d5d43402/frozenlist-1.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd", size = 235756, upload-time = "2025-06-09T23:02:27.79Z" },
- { url = "https://files.pythonhosted.org/packages/8b/72/a19a40bcdaa28a51add2aaa3a1a294ec357f36f27bd836a012e070c5e8a5/frozenlist-1.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb", size = 222894, upload-time = "2025-06-09T23:02:29.848Z" },
- { url = "https://files.pythonhosted.org/packages/08/49/0042469993e023a758af81db68c76907cd29e847d772334d4d201cbe9a42/frozenlist-1.7.0-cp39-cp39-win32.whl", hash = "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e", size = 39848, upload-time = "2025-06-09T23:02:31.413Z" },
- { url = "https://files.pythonhosted.org/packages/5a/45/827d86ee475c877f5f766fbc23fb6acb6fada9e52f1c9720e2ba3eae32da/frozenlist-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63", size = 44102, upload-time = "2025-06-09T23:02:32.808Z" },
{ url = "https://files.pythonhosted.org/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", size = 13106, upload-time = "2025-06-09T23:02:34.204Z" },
]
@@ -372,16 +268,6 @@ version = "1.73.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/79/e8/b43b851537da2e2f03fa8be1aef207e5cbfb1a2e014fbb6b40d24c177cd3/grpcio-1.73.1.tar.gz", hash = "sha256:7fce2cd1c0c1116cf3850564ebfc3264fba75d3c74a7414373f1238ea365ef87", size = 12730355, upload-time = "2025-06-26T01:53:24.622Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/8f/51/a5748ab2773d893d099b92653039672f7e26dd35741020972b84d604066f/grpcio-1.73.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:2d70f4ddd0a823436c2624640570ed6097e40935c9194482475fe8e3d9754d55", size = 5365087, upload-time = "2025-06-26T01:51:44.541Z" },
- { url = "https://files.pythonhosted.org/packages/ae/12/c5ee1a5dfe93dbc2eaa42a219e2bf887250b52e2e2ee5c036c4695f2769c/grpcio-1.73.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:3841a8a5a66830261ab6a3c2a3dc539ed84e4ab019165f77b3eeb9f0ba621f26", size = 10608921, upload-time = "2025-06-26T01:51:48.111Z" },
- { url = "https://files.pythonhosted.org/packages/c4/6d/b0c6a8120f02b7d15c5accda6bfc43bc92be70ada3af3ba6d8e077c00374/grpcio-1.73.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:628c30f8e77e0258ab788750ec92059fc3d6628590fb4b7cea8c102503623ed7", size = 5803221, upload-time = "2025-06-26T01:51:50.486Z" },
- { url = "https://files.pythonhosted.org/packages/a6/7a/3c886d9f1c1e416ae81f7f9c7d1995ae72cd64712d29dab74a6bafacb2d2/grpcio-1.73.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67a0468256c9db6d5ecb1fde4bf409d016f42cef649323f0a08a72f352d1358b", size = 6444603, upload-time = "2025-06-26T01:51:52.203Z" },
- { url = "https://files.pythonhosted.org/packages/42/07/f143a2ff534982c9caa1febcad1c1073cdec732f6ac7545d85555a900a7e/grpcio-1.73.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b84d65bbdebd5926eb5c53b0b9ec3b3f83408a30e4c20c373c5337b4219ec5", size = 6040969, upload-time = "2025-06-26T01:51:55.028Z" },
- { url = "https://files.pythonhosted.org/packages/fb/0f/523131b7c9196d0718e7b2dac0310eb307b4117bdbfef62382e760f7e8bb/grpcio-1.73.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c54796ca22b8349cc594d18b01099e39f2b7ffb586ad83217655781a350ce4da", size = 6132201, upload-time = "2025-06-26T01:51:56.867Z" },
- { url = "https://files.pythonhosted.org/packages/ad/18/010a055410eef1d3a7a1e477ec9d93b091ac664ad93e9c5f56d6cc04bdee/grpcio-1.73.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:75fc8e543962ece2f7ecd32ada2d44c0c8570ae73ec92869f9af8b944863116d", size = 6774718, upload-time = "2025-06-26T01:51:58.338Z" },
- { url = "https://files.pythonhosted.org/packages/16/11/452bfc1ab39d8ee748837ab8ee56beeae0290861052948785c2c445fb44b/grpcio-1.73.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6a6037891cd2b1dd1406b388660522e1565ed340b1fea2955b0234bdd941a862", size = 6304362, upload-time = "2025-06-26T01:51:59.802Z" },
- { url = "https://files.pythonhosted.org/packages/1e/1c/c75ceee626465721e5cb040cf4b271eff817aa97388948660884cb7adffa/grpcio-1.73.1-cp310-cp310-win32.whl", hash = "sha256:cce7265b9617168c2d08ae570fcc2af4eaf72e84f8c710ca657cc546115263af", size = 3679036, upload-time = "2025-06-26T01:52:01.817Z" },
- { url = "https://files.pythonhosted.org/packages/62/2e/42cb31b6cbd671a7b3dbd97ef33f59088cf60e3cf2141368282e26fafe79/grpcio-1.73.1-cp310-cp310-win_amd64.whl", hash = "sha256:6a2b372e65fad38842050943f42ce8fee00c6f2e8ea4f7754ba7478d26a356ee", size = 4340208, upload-time = "2025-06-26T01:52:03.674Z" },
{ url = "https://files.pythonhosted.org/packages/e4/41/921565815e871d84043e73e2c0e748f0318dab6fa9be872cd042778f14a9/grpcio-1.73.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:ba2cea9f7ae4bc21f42015f0ec98f69ae4179848ad744b210e7685112fa507a1", size = 5363853, upload-time = "2025-06-26T01:52:05.5Z" },
{ url = "https://files.pythonhosted.org/packages/b0/cc/9c51109c71d068e4d474becf5f5d43c9d63038cec1b74112978000fa72f4/grpcio-1.73.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d74c3f4f37b79e746271aa6cdb3a1d7e4432aea38735542b23adcabaaee0c097", size = 10621476, upload-time = "2025-06-26T01:52:07.211Z" },
{ url = "https://files.pythonhosted.org/packages/8f/d3/33d738a06f6dbd4943f4d377468f8299941a7c8c6ac8a385e4cef4dd3c93/grpcio-1.73.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5b9b1805a7d61c9e90541cbe8dfe0a593dfc8c5c3a43fe623701b6a01b01d710", size = 5807903, upload-time = "2025-06-26T01:52:09.466Z" },
@@ -412,16 +298,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/1f/29/efbd4ac837c23bc48e34bbaf32bd429f0dc9ad7f80721cdb4622144c118c/grpcio-1.73.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:686231cdd03a8a8055f798b2b54b19428cdf18fa1549bee92249b43607c42668", size = 6287288, upload-time = "2025-06-26T01:52:57.33Z" },
{ url = "https://files.pythonhosted.org/packages/d8/61/c6045d2ce16624bbe18b5d169c1a5ce4d6c3a47bc9d0e5c4fa6a50ed1239/grpcio-1.73.1-cp313-cp313-win32.whl", hash = "sha256:89018866a096e2ce21e05eabed1567479713ebe57b1db7cbb0f1e3b896793ba4", size = 3668151, upload-time = "2025-06-26T01:52:59.405Z" },
{ url = "https://files.pythonhosted.org/packages/c2/d7/77ac689216daee10de318db5aa1b88d159432dc76a130948a56b3aa671a2/grpcio-1.73.1-cp313-cp313-win_amd64.whl", hash = "sha256:4a68f8c9966b94dff693670a5cf2b54888a48a5011c5d9ce2295a1a1465ee84f", size = 4335747, upload-time = "2025-06-26T01:53:01.233Z" },
- { url = "https://files.pythonhosted.org/packages/58/c7/f552f0e79e7f585ff8c35b703342bd70a93a46fdf6d8b6574f33d39acb74/grpcio-1.73.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:b4adc97d2d7f5c660a5498bda978ebb866066ad10097265a5da0511323ae9f50", size = 5363972, upload-time = "2025-06-26T01:53:03.185Z" },
- { url = "https://files.pythonhosted.org/packages/2c/63/226989531ea73030775ef87ac6c01460384f7c6ea7423e93383674e60a81/grpcio-1.73.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:c45a28a0cfb6ddcc7dc50a29de44ecac53d115c3388b2782404218db51cb2df3", size = 10614120, upload-time = "2025-06-26T01:53:05.643Z" },
- { url = "https://files.pythonhosted.org/packages/45/63/12027d4a09b613efa481447f5d12a52804d77287325bbfeed39d72cf29da/grpcio-1.73.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:10af9f2ab98a39f5b6c1896c6fc2036744b5b41d12739d48bed4c3e15b6cf900", size = 5804172, upload-time = "2025-06-26T01:53:07.828Z" },
- { url = "https://files.pythonhosted.org/packages/09/c5/a158c4fa26c0f203966664f37e52175c0c262772a8c39b78812b2e39a9e8/grpcio-1.73.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45cf17dcce5ebdb7b4fe9e86cb338fa99d7d1bb71defc78228e1ddf8d0de8cbb", size = 6445602, upload-time = "2025-06-26T01:53:09.657Z" },
- { url = "https://files.pythonhosted.org/packages/cb/e2/d6fb85964d52d30baace1a6b2fe1be7941882239ae1f1cda2aaa80827ccd/grpcio-1.73.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c502c2e950fc7e8bf05c047e8a14522ef7babac59abbfde6dbf46b7a0d9c71e", size = 6041413, upload-time = "2025-06-26T01:53:11.591Z" },
- { url = "https://files.pythonhosted.org/packages/da/a6/8d06b3de85486ac71a49a656d7ff546974f3a5449ecb6178fd62a3251cdb/grpcio-1.73.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6abfc0f9153dc4924536f40336f88bd4fe7bd7494f028675e2e04291b8c2c62a", size = 6133190, upload-time = "2025-06-26T01:53:13.888Z" },
- { url = "https://files.pythonhosted.org/packages/5d/80/73f86bc940fd570f2486673424277bfdef8b0046309fd693856d31f1c1df/grpcio-1.73.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ed451a0e39c8e51eb1612b78686839efd1a920666d1666c1adfdb4fd51680c0f", size = 6775225, upload-time = "2025-06-26T01:53:15.718Z" },
- { url = "https://files.pythonhosted.org/packages/23/c5/722cfa1b6b5f747a2066291eb8ba3acbcd25f02ce9dc9088eafb7f92eb6d/grpcio-1.73.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:07f08705a5505c9b5b0cbcbabafb96462b5a15b7236bbf6bbcc6b0b91e1cbd7e", size = 6305332, upload-time = "2025-06-26T01:53:18.363Z" },
- { url = "https://files.pythonhosted.org/packages/a9/d8/8ecdccf7759249a6d124c624e2b5a26176d44e91be78975c9aabbe81159b/grpcio-1.73.1-cp39-cp39-win32.whl", hash = "sha256:ad5c958cc3d98bb9d71714dc69f1c13aaf2f4b53e29d4cc3f1501ef2e4d129b2", size = 3680535, upload-time = "2025-06-26T01:53:20.266Z" },
- { url = "https://files.pythonhosted.org/packages/2c/d9/e7369ba582129094ecedb16f60e3cd250cd0fb0ea28adbdcf98002b4f80a/grpcio-1.73.1-cp39-cp39-win_amd64.whl", hash = "sha256:42f0660bce31b745eb9d23f094a332d31f210dcadd0fc8e5be7e4c62a87ce86b", size = 4342138, upload-time = "2025-06-26T01:53:22.095Z" },
]
[[package]]
@@ -435,16 +311,6 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/63/b6/b185a351b4b00df88a1c7558eb3bcc05a4f53c36071b84d4f8a4db53f105/grpcio_tools-1.73.1.tar.gz", hash = "sha256:6e06adec3b0870f5947953b0ef8dbdf2cebcdff61fb1fe08120cc7483c7978aa", size = 5429529, upload-time = "2025-06-26T01:56:15.729Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/59/d0/d7a03e9fb4b339cb262f67990c6991e6234c8e83ee31a0078f8445198cde/grpcio_tools-1.73.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:0731b21a7f3988a9f8c244ffe3940a0579e5b5f2a99d08448459e0b49350d47a", size = 2542290, upload-time = "2025-06-26T01:54:44.178Z" },
- { url = "https://files.pythonhosted.org/packages/d2/b2/98cabcde4d3e4cee157e052cd56cd4cc5d5d03355a427a53852ed3c4d4f8/grpcio_tools-1.73.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:15e47b19b70ce6100e9843570e16b0561045c37b5e9d390f1cb54292c99b51b6", size = 5831370, upload-time = "2025-06-26T01:54:47.925Z" },
- { url = "https://files.pythonhosted.org/packages/ec/2f/f77c892692ba731169a1c9d917cafc74ae03304363b7071730f7bdf94e7f/grpcio_tools-1.73.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:fbe6cd3e863928b5c127d4956c60e44101f495ddcb69738290db6ef497ce505c", size = 2521359, upload-time = "2025-06-26T01:54:49.773Z" },
- { url = "https://files.pythonhosted.org/packages/d4/02/b24ae40aa80e3229ede4db54c54a87febab4ab3b48170255cc506fffbe99/grpcio_tools-1.73.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71c35a6b4d125bec877daefaf7dedb566d37ed4e903a45b74e491683e006afa4", size = 2918142, upload-time = "2025-06-26T01:54:51.496Z" },
- { url = "https://files.pythonhosted.org/packages/6b/6c/df662223f2bd579db79ada0afaf2c75ef975e524e89abac176f8e8336606/grpcio_tools-1.73.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9486235da85a80accaeaab5829c09e19b70ee96ff100d3f7b342ec9344d96134", size = 2655785, upload-time = "2025-06-26T01:54:52.807Z" },
- { url = "https://files.pythonhosted.org/packages/06/e2/cd4c72dfd070aa6cb91e4e7374211b565167402ffcedb26b0d2ec94d7b65/grpcio_tools-1.73.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:86dfd562a9ebb74849aca345237cf87c2732067e410752ff809b8bfdf7aa5f49", size = 3054109, upload-time = "2025-06-26T01:54:54.138Z" },
- { url = "https://files.pythonhosted.org/packages/68/10/dce9ccea77fce910b83c938fe7c1ee54d34c25a46d2efc839bfddadf4dc2/grpcio_tools-1.73.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bde8101bc7a60de6297916a468bf7900be6e2c0f9965a1a6591aa06bd02e2df3", size = 3514278, upload-time = "2025-06-26T01:54:55.539Z" },
- { url = "https://files.pythonhosted.org/packages/a1/d8/a02ccd5200aedfba3f5a51bf3613970395a00d8004bef4670d000984f86a/grpcio_tools-1.73.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b41e2417003b34bf672aa4ec5a48e22d9fc28f7de5f25d9a01fb1e3dcc86af6a", size = 3115712, upload-time = "2025-06-26T01:54:56.977Z" },
- { url = "https://files.pythonhosted.org/packages/e1/2d/57e7a60e69d6d6a58ae14f6340c458e1c2eea2957cd198f0173e7d422231/grpcio_tools-1.73.1-cp310-cp310-win32.whl", hash = "sha256:bb05d02ca7d603260555cc0bbec616b116f741561d5b5c78a65bc3fae5982d5e", size = 980531, upload-time = "2025-06-26T01:54:58.632Z" },
- { url = "https://files.pythonhosted.org/packages/bd/58/bcd331cae812362e8ef3952d7aaec8ac20d233e2c7efbbb506019b914b16/grpcio_tools-1.73.1-cp310-cp310-win_amd64.whl", hash = "sha256:5f0cd287545c9430e3e395181ee11ca9b7bef4c41b1c28afa9174ea5a868dcda", size = 1151936, upload-time = "2025-06-26T01:55:00.024Z" },
{ url = "https://files.pythonhosted.org/packages/e0/f0/a1f752fa7a2d62f43ee261238dcaf01661448d443ac7293e2e7462705ae4/grpcio_tools-1.73.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:2bc4a46177df43853b070a4b6b6106d9829a639bc8b9516a005a879d3e5da0f9", size = 2542096, upload-time = "2025-06-26T01:55:01.509Z" },
{ url = "https://files.pythonhosted.org/packages/c6/14/1dd296e8774bc4b0601e7e63d9c87acfe31a93ece8340426d0edfcbd8a2b/grpcio_tools-1.73.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:448b38ec72ed62c932d48e49e0facbb51e8045065dabf3bb63149810971a51e7", size = 5832008, upload-time = "2025-06-26T01:55:03.548Z" },
{ url = "https://files.pythonhosted.org/packages/61/03/27b9807aa49ad433f722acead06d1eff9703089b55fc39b6534e1d82f02c/grpcio_tools-1.73.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:249be7616b323b8af72a02bd218bfbba388010e6ccb471c57d42e49b620686f7", size = 2521397, upload-time = "2025-06-26T01:55:05.433Z" },
@@ -475,16 +341,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ff/bd/15070d40da6ef3152cbc91dbfbf90f21ab4691def8d248dddb76fbcaf1d6/grpcio_tools-1.73.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9a0eb7d88c9f1992afb3021e45721971e49d612b03fa5d38cce6e4369509f32c", size = 3115931, upload-time = "2025-06-26T01:55:50.805Z" },
{ url = "https://files.pythonhosted.org/packages/35/a5/c255c8ee74e98f6a33ecea07ec1f4b4e7ec4338ecdd795d8891e0513177f/grpcio_tools-1.73.1-cp313-cp313-win32.whl", hash = "sha256:34480c6964d16b7fa0012b9fc574efa9e2f71c80f8bc9da0887c300abb7130f3", size = 980321, upload-time = "2025-06-26T01:55:52.615Z" },
{ url = "https://files.pythonhosted.org/packages/14/7b/9c2b57eec340269e81d5113125b29213ef4dd1138cadc4d4d30b2506ebc2/grpcio_tools-1.73.1-cp313-cp313-win_amd64.whl", hash = "sha256:2b005373ad23dc0f25d8d6ec6d219fc3a6831b8d0f487be8f9bb2315307ba1c1", size = 1151842, upload-time = "2025-06-26T01:55:54.261Z" },
- { url = "https://files.pythonhosted.org/packages/bd/41/f9ce2a3b36f91369a07ac1ec1753c8182f8919bfc440860c2f0c1a6db47e/grpcio_tools-1.73.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:c094d9337aecf88eb20573ddc65337579e064298f94553c808757a2621f38631", size = 2542571, upload-time = "2025-06-26T01:55:55.946Z" },
- { url = "https://files.pythonhosted.org/packages/bc/3a/426492465d6ef0bfd837f1524e064eab8bbf8762dc8d479e40b364ce225e/grpcio_tools-1.73.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:82345bd956dd401fa4bc3a3285fb67a574c977226ccc610e4d384787bf0294f1", size = 5832579, upload-time = "2025-06-26T01:55:58.379Z" },
- { url = "https://files.pythonhosted.org/packages/9b/58/a05ab708b9ae8b3f930745ba20d3567cc50bfe66eacf2ce2c313c5a8b78c/grpcio_tools-1.73.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ca9650acc6ec4acdfe77afd0f4a6a1ff1db80519b080a8680b3c56bd67011c93", size = 2521911, upload-time = "2025-06-26T01:56:00.036Z" },
- { url = "https://files.pythonhosted.org/packages/e1/96/3fd0f64a90f4fb1532cba7408377388b4b4cdfd7b0d66294e7e2b2da0e02/grpcio_tools-1.73.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffa2d4b6cfeeeebf6d54671927772f5655f0a2a01b1ca17ad70dde79e6e25f9", size = 2918685, upload-time = "2025-06-26T01:56:01.802Z" },
- { url = "https://files.pythonhosted.org/packages/a6/a4/36c635f042dd0e83d8c8cb658fa67f7481eebc6a139f0314b0e9e2ee4c0a/grpcio_tools-1.73.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfc097eb3ff676d2cb4c071a20f8afee118bb5c3206d37f1318b58dee8c133f", size = 2656175, upload-time = "2025-06-26T01:56:03.56Z" },
- { url = "https://files.pythonhosted.org/packages/61/a2/da2346da5fb446d8eb3de4b42a106713ee65cae843ec57ee26edf717784f/grpcio_tools-1.73.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f4f135277713a07888f3b47fa4f364e7c512a7c9aede4d431feb10c735564ef", size = 3054609, upload-time = "2025-06-26T01:56:06.344Z" },
- { url = "https://files.pythonhosted.org/packages/cb/aa/4af7b66ce43c0463c737f6a65ba02ef6588d48bc1c1a0bcf324b7cf6c413/grpcio_tools-1.73.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c3feb2fc36cd8f009e34a5d82a8f81b00a25e177f1faa7a8809bd1b56382afe", size = 3514636, upload-time = "2025-06-26T01:56:08.125Z" },
- { url = "https://files.pythonhosted.org/packages/21/60/b724d79edd6a5beab3583abfdfde9c50a6e65623c86457a737f566c441bb/grpcio_tools-1.73.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:91da6ddcf05ab350432b21e96e4991b170d785bddb791a75f4e6dbb5eacbd9e6", size = 3116542, upload-time = "2025-06-26T01:56:10.046Z" },
- { url = "https://files.pythonhosted.org/packages/2c/e2/0c27129c4e064ca1da52188cb2c93a9935c964e3d11aba3505be11a1b5ea/grpcio_tools-1.73.1-cp39-cp39-win32.whl", hash = "sha256:1828327b2b3ac8863dc0f90d8df0164f28c6b3b033bafe4a37d71d667723d34c", size = 980881, upload-time = "2025-06-26T01:56:11.939Z" },
- { url = "https://files.pythonhosted.org/packages/48/d9/079e84442d70ee1c797c5468abb8533de26503fe66b9e647e52666f46b94/grpcio_tools-1.73.1-cp39-cp39-win_amd64.whl", hash = "sha256:14276b21d47974e59519de53572ad03aded2eccaf07a8cfb07dc9eb5c98f0d88", size = 1152413, upload-time = "2025-06-26T01:56:13.689Z" },
]
[[package]]
@@ -546,29 +402,8 @@ wheels = [
name = "multidict"
version = "6.6.3"
source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
-]
sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006, upload-time = "2025-06-30T15:53:46.929Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/0b/67/414933982bce2efce7cbcb3169eaaf901e0f25baec69432b4874dfb1f297/multidict-6.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2be5b7b35271f7fff1397204ba6708365e3d773579fe2a30625e16c4b4ce817", size = 77017, upload-time = "2025-06-30T15:50:58.931Z" },
- { url = "https://files.pythonhosted.org/packages/8a/fe/d8a3ee1fad37dc2ef4f75488b0d9d4f25bf204aad8306cbab63d97bff64a/multidict-6.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12f4581d2930840295c461764b9a65732ec01250b46c6b2c510d7ee68872b140", size = 44897, upload-time = "2025-06-30T15:51:00.999Z" },
- { url = "https://files.pythonhosted.org/packages/1f/e0/265d89af8c98240265d82b8cbcf35897f83b76cd59ee3ab3879050fd8c45/multidict-6.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dd7793bab517e706c9ed9d7310b06c8672fd0aeee5781bfad612f56b8e0f7d14", size = 44574, upload-time = "2025-06-30T15:51:02.449Z" },
- { url = "https://files.pythonhosted.org/packages/e6/05/6b759379f7e8e04ccc97cfb2a5dcc5cdbd44a97f072b2272dc51281e6a40/multidict-6.6.3-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:72d8815f2cd3cf3df0f83cac3f3ef801d908b2d90409ae28102e0553af85545a", size = 225729, upload-time = "2025-06-30T15:51:03.794Z" },
- { url = "https://files.pythonhosted.org/packages/4e/f5/8d5a15488edd9a91fa4aad97228d785df208ed6298580883aa3d9def1959/multidict-6.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:531e331a2ee53543ab32b16334e2deb26f4e6b9b28e41f8e0c87e99a6c8e2d69", size = 242515, upload-time = "2025-06-30T15:51:05.002Z" },
- { url = "https://files.pythonhosted.org/packages/6e/b5/a8f317d47d0ac5bb746d6d8325885c8967c2a8ce0bb57be5399e3642cccb/multidict-6.6.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42ca5aa9329a63be8dc49040f63817d1ac980e02eeddba763a9ae5b4027b9c9c", size = 222224, upload-time = "2025-06-30T15:51:06.148Z" },
- { url = "https://files.pythonhosted.org/packages/76/88/18b2a0d5e80515fa22716556061189c2853ecf2aa2133081ebbe85ebea38/multidict-6.6.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:208b9b9757060b9faa6f11ab4bc52846e4f3c2fb8b14d5680c8aac80af3dc751", size = 253124, upload-time = "2025-06-30T15:51:07.375Z" },
- { url = "https://files.pythonhosted.org/packages/62/bf/ebfcfd6b55a1b05ef16d0775ae34c0fe15e8dab570d69ca9941073b969e7/multidict-6.6.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:acf6b97bd0884891af6a8b43d0f586ab2fcf8e717cbd47ab4bdddc09e20652d8", size = 251529, upload-time = "2025-06-30T15:51:08.691Z" },
- { url = "https://files.pythonhosted.org/packages/44/11/780615a98fd3775fc309d0234d563941af69ade2df0bb82c91dda6ddaea1/multidict-6.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:68e9e12ed00e2089725669bdc88602b0b6f8d23c0c95e52b95f0bc69f7fe9b55", size = 241627, upload-time = "2025-06-30T15:51:10.605Z" },
- { url = "https://files.pythonhosted.org/packages/28/3d/35f33045e21034b388686213752cabc3a1b9d03e20969e6fa8f1b1d82db1/multidict-6.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05db2f66c9addb10cfa226e1acb363450fab2ff8a6df73c622fefe2f5af6d4e7", size = 239351, upload-time = "2025-06-30T15:51:12.18Z" },
- { url = "https://files.pythonhosted.org/packages/6e/cc/ff84c03b95b430015d2166d9aae775a3985d757b94f6635010d0038d9241/multidict-6.6.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0db58da8eafb514db832a1b44f8fa7906fdd102f7d982025f816a93ba45e3dcb", size = 233429, upload-time = "2025-06-30T15:51:13.533Z" },
- { url = "https://files.pythonhosted.org/packages/2e/f0/8cd49a0b37bdea673a4b793c2093f2f4ba8e7c9d6d7c9bd672fd6d38cd11/multidict-6.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14117a41c8fdb3ee19c743b1c027da0736fdb79584d61a766da53d399b71176c", size = 243094, upload-time = "2025-06-30T15:51:14.815Z" },
- { url = "https://files.pythonhosted.org/packages/96/19/5d9a0cfdafe65d82b616a45ae950975820289069f885328e8185e64283c2/multidict-6.6.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:877443eaaabcd0b74ff32ebeed6f6176c71850feb7d6a1d2db65945256ea535c", size = 248957, upload-time = "2025-06-30T15:51:16.076Z" },
- { url = "https://files.pythonhosted.org/packages/e6/dc/c90066151da87d1e489f147b9b4327927241e65f1876702fafec6729c014/multidict-6.6.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:70b72e749a4f6e7ed8fb334fa8d8496384840319512746a5f42fa0aec79f4d61", size = 243590, upload-time = "2025-06-30T15:51:17.413Z" },
- { url = "https://files.pythonhosted.org/packages/ec/39/458afb0cccbb0ee9164365273be3e039efddcfcb94ef35924b7dbdb05db0/multidict-6.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43571f785b86afd02b3855c5ac8e86ec921b760298d6f82ff2a61daf5a35330b", size = 237487, upload-time = "2025-06-30T15:51:19.039Z" },
- { url = "https://files.pythonhosted.org/packages/35/38/0016adac3990426610a081787011177e661875546b434f50a26319dc8372/multidict-6.6.3-cp310-cp310-win32.whl", hash = "sha256:20c5a0c3c13a15fd5ea86c42311859f970070e4e24de5a550e99d7c271d76318", size = 41390, upload-time = "2025-06-30T15:51:20.362Z" },
- { url = "https://files.pythonhosted.org/packages/f3/d2/17897a8f3f2c5363d969b4c635aa40375fe1f09168dc09a7826780bfb2a4/multidict-6.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab0a34a007704c625e25a9116c6770b4d3617a071c8a7c30cd338dfbadfe6485", size = 45954, upload-time = "2025-06-30T15:51:21.383Z" },
- { url = "https://files.pythonhosted.org/packages/2d/5f/d4a717c1e457fe44072e33fa400d2b93eb0f2819c4d669381f925b7cba1f/multidict-6.6.3-cp310-cp310-win_arm64.whl", hash = "sha256:769841d70ca8bdd140a715746199fc6473414bd02efd678d75681d2d6a8986c5", size = 42981, upload-time = "2025-06-30T15:51:22.809Z" },
{ url = "https://files.pythonhosted.org/packages/08/f0/1a39863ced51f639c81a5463fbfa9eb4df59c20d1a8769ab9ef4ca57ae04/multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c", size = 76445, upload-time = "2025-06-30T15:51:24.01Z" },
{ url = "https://files.pythonhosted.org/packages/c9/0e/a7cfa451c7b0365cd844e90b41e21fab32edaa1e42fc0c9f68461ce44ed7/multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df", size = 44610, upload-time = "2025-06-30T15:51:25.158Z" },
{ url = "https://files.pythonhosted.org/packages/c6/bb/a14a4efc5ee748cc1904b0748be278c31b9295ce5f4d2ef66526f410b94d/multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d", size = 44267, upload-time = "2025-06-30T15:51:26.326Z" },
@@ -641,24 +476,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/22/d6/fdb3d0670819f2228f3f7d9af613d5e652c15d170c83e5f1c94fbc55a25b/multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e", size = 47812, upload-time = "2025-06-30T15:53:09.263Z" },
{ url = "https://files.pythonhosted.org/packages/b6/d6/a9d2c808f2c489ad199723197419207ecbfbc1776f6e155e1ecea9c883aa/multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d", size = 53011, upload-time = "2025-06-30T15:53:11.038Z" },
{ url = "https://files.pythonhosted.org/packages/f2/40/b68001cba8188dd267590a111f9661b6256debc327137667e832bf5d66e8/multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb", size = 45254, upload-time = "2025-06-30T15:53:12.421Z" },
- { url = "https://files.pythonhosted.org/packages/d2/64/ba29bd6dfc895e592b2f20f92378e692ac306cf25dd0be2f8e0a0f898edb/multidict-6.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c8161b5a7778d3137ea2ee7ae8a08cce0010de3b00ac671c5ebddeaa17cefd22", size = 76959, upload-time = "2025-06-30T15:53:13.827Z" },
- { url = "https://files.pythonhosted.org/packages/ca/cd/872ae4c134257dacebff59834983c1615d6ec863b6e3d360f3203aad8400/multidict-6.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1328201ee930f069961ae707d59c6627ac92e351ed5b92397cf534d1336ce557", size = 44864, upload-time = "2025-06-30T15:53:15.658Z" },
- { url = "https://files.pythonhosted.org/packages/15/35/d417d8f62f2886784b76df60522d608aba39dfc83dd53b230ca71f2d4c53/multidict-6.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b1db4d2093d6b235de76932febf9d50766cf49a5692277b2c28a501c9637f616", size = 44540, upload-time = "2025-06-30T15:53:17.208Z" },
- { url = "https://files.pythonhosted.org/packages/85/59/25cddf781f12cddb2386baa29744a3fdd160eb705539b48065f0cffd86d5/multidict-6.6.3-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53becb01dd8ebd19d1724bebe369cfa87e4e7f29abbbe5c14c98ce4c383e16cd", size = 224075, upload-time = "2025-06-30T15:53:18.705Z" },
- { url = "https://files.pythonhosted.org/packages/c4/21/4055b6a527954c572498a8068c26bd3b75f2b959080e17e12104b592273c/multidict-6.6.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41bb9d1d4c303886e2d85bade86e59885112a7f4277af5ad47ab919a2251f306", size = 240535, upload-time = "2025-06-30T15:53:20.359Z" },
- { url = "https://files.pythonhosted.org/packages/58/98/17f1f80bdba0b2fef49cf4ba59cebf8a81797f745f547abb5c9a4039df62/multidict-6.6.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:775b464d31dac90f23192af9c291dc9f423101857e33e9ebf0020a10bfcf4144", size = 219361, upload-time = "2025-06-30T15:53:22.371Z" },
- { url = "https://files.pythonhosted.org/packages/f8/0e/a5e595fdd0820069f0c29911d5dc9dc3a75ec755ae733ce59a4e6962ae42/multidict-6.6.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d04d01f0a913202205a598246cf77826fe3baa5a63e9f6ccf1ab0601cf56eca0", size = 251207, upload-time = "2025-06-30T15:53:24.307Z" },
- { url = "https://files.pythonhosted.org/packages/66/9e/0f51e4cffea2daf24c137feabc9ec848ce50f8379c9badcbac00b41ab55e/multidict-6.6.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d25594d3b38a2e6cabfdcafef339f754ca6e81fbbdb6650ad773ea9775af35ab", size = 249749, upload-time = "2025-06-30T15:53:26.056Z" },
- { url = "https://files.pythonhosted.org/packages/49/a0/a7cfc13c9a71ceb8c1c55457820733af9ce01e121139271f7b13e30c29d2/multidict-6.6.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35712f1748d409e0707b165bf49f9f17f9e28ae85470c41615778f8d4f7d9609", size = 239202, upload-time = "2025-06-30T15:53:28.096Z" },
- { url = "https://files.pythonhosted.org/packages/c7/50/7ae0d1149ac71cab6e20bb7faf2a1868435974994595dadfdb7377f7140f/multidict-6.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1c8082e5814b662de8589d6a06c17e77940d5539080cbab9fe6794b5241b76d9", size = 237269, upload-time = "2025-06-30T15:53:30.124Z" },
- { url = "https://files.pythonhosted.org/packages/b4/ac/2d0bf836c9c63a57360d57b773359043b371115e1c78ff648993bf19abd0/multidict-6.6.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:61af8a4b771f1d4d000b3168c12c3120ccf7284502a94aa58c68a81f5afac090", size = 232961, upload-time = "2025-06-30T15:53:31.766Z" },
- { url = "https://files.pythonhosted.org/packages/85/e1/68a65f069df298615591e70e48bfd379c27d4ecb252117c18bf52eebc237/multidict-6.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:448e4a9afccbf297577f2eaa586f07067441e7b63c8362a3540ba5a38dc0f14a", size = 240863, upload-time = "2025-06-30T15:53:33.488Z" },
- { url = "https://files.pythonhosted.org/packages/ae/ab/702f1baca649f88ea1dc6259fc2aa4509f4ad160ba48c8e61fbdb4a5a365/multidict-6.6.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:233ad16999afc2bbd3e534ad8dbe685ef8ee49a37dbc2cdc9514e57b6d589ced", size = 246800, upload-time = "2025-06-30T15:53:35.21Z" },
- { url = "https://files.pythonhosted.org/packages/5e/0b/726e690bfbf887985a8710ef2f25f1d6dd184a35bd3b36429814f810a2fc/multidict-6.6.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:bb933c891cd4da6bdcc9733d048e994e22e1883287ff7540c2a0f3b117605092", size = 242034, upload-time = "2025-06-30T15:53:36.913Z" },
- { url = "https://files.pythonhosted.org/packages/73/bb/839486b27bcbcc2e0d875fb9d4012b4b6aa99639137343106aa7210e047a/multidict-6.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:37b09ca60998e87734699e88c2363abfd457ed18cfbf88e4009a4e83788e63ed", size = 235377, upload-time = "2025-06-30T15:53:38.618Z" },
- { url = "https://files.pythonhosted.org/packages/e3/46/574d75ab7b9ae8690fe27e89f5fcd0121633112b438edfb9ed2be8be096b/multidict-6.6.3-cp39-cp39-win32.whl", hash = "sha256:f54cb79d26d0cd420637d184af38f0668558f3c4bbe22ab7ad830e67249f2e0b", size = 41420, upload-time = "2025-06-30T15:53:40.309Z" },
- { url = "https://files.pythonhosted.org/packages/78/c3/8b3bc755508b777868349f4bfa844d3d31832f075ee800a3d6f1807338c5/multidict-6.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:295adc9c0551e5d5214b45cf29ca23dbc28c2d197a9c30d51aed9e037cb7c578", size = 46124, upload-time = "2025-06-30T15:53:41.984Z" },
- { url = "https://files.pythonhosted.org/packages/b2/30/5a66e7e4550e80975faee5b5dd9e9bd09194d2fd8f62363119b9e46e204b/multidict-6.6.3-cp39-cp39-win_arm64.whl", hash = "sha256:15332783596f227db50fb261c2c251a58ac3873c457f3a550a95d5c0aa3c770d", size = 42973, upload-time = "2025-06-30T15:53:43.505Z" },
{ url = "https://files.pythonhosted.org/packages/d8/30/9aec301e9772b098c1f5c0ca0279237c9766d94b97802e9888010c64b0ed/multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", size = 12313, upload-time = "2025-06-30T15:53:45.437Z" },
]
@@ -668,22 +485,6 @@ version = "0.3.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", size = 44139, upload-time = "2025-06-09T22:56:06.081Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ab/14/510deed325e262afeb8b360043c5d7c960da7d3ecd6d6f9496c9c56dc7f4/propcache-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770", size = 73178, upload-time = "2025-06-09T22:53:40.126Z" },
- { url = "https://files.pythonhosted.org/packages/cd/4e/ad52a7925ff01c1325653a730c7ec3175a23f948f08626a534133427dcff/propcache-0.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3", size = 43133, upload-time = "2025-06-09T22:53:41.965Z" },
- { url = "https://files.pythonhosted.org/packages/63/7c/e9399ba5da7780871db4eac178e9c2e204c23dd3e7d32df202092a1ed400/propcache-0.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3", size = 43039, upload-time = "2025-06-09T22:53:43.268Z" },
- { url = "https://files.pythonhosted.org/packages/22/e1/58da211eb8fdc6fc854002387d38f415a6ca5f5c67c1315b204a5d3e9d7a/propcache-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e", size = 201903, upload-time = "2025-06-09T22:53:44.872Z" },
- { url = "https://files.pythonhosted.org/packages/c4/0a/550ea0f52aac455cb90111c8bab995208443e46d925e51e2f6ebdf869525/propcache-0.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220", size = 213362, upload-time = "2025-06-09T22:53:46.707Z" },
- { url = "https://files.pythonhosted.org/packages/5a/af/9893b7d878deda9bb69fcf54600b247fba7317761b7db11fede6e0f28bd0/propcache-0.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb", size = 210525, upload-time = "2025-06-09T22:53:48.547Z" },
- { url = "https://files.pythonhosted.org/packages/7c/bb/38fd08b278ca85cde36d848091ad2b45954bc5f15cce494bb300b9285831/propcache-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614", size = 198283, upload-time = "2025-06-09T22:53:50.067Z" },
- { url = "https://files.pythonhosted.org/packages/78/8c/9fe55bd01d362bafb413dfe508c48753111a1e269737fa143ba85693592c/propcache-0.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50", size = 191872, upload-time = "2025-06-09T22:53:51.438Z" },
- { url = "https://files.pythonhosted.org/packages/54/14/4701c33852937a22584e08abb531d654c8bcf7948a8f87ad0a4822394147/propcache-0.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339", size = 199452, upload-time = "2025-06-09T22:53:53.229Z" },
- { url = "https://files.pythonhosted.org/packages/16/44/447f2253d859602095356007657ee535e0093215ea0b3d1d6a41d16e5201/propcache-0.3.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0", size = 191567, upload-time = "2025-06-09T22:53:54.541Z" },
- { url = "https://files.pythonhosted.org/packages/f2/b3/e4756258749bb2d3b46defcff606a2f47410bab82be5824a67e84015b267/propcache-0.3.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2", size = 193015, upload-time = "2025-06-09T22:53:56.44Z" },
- { url = "https://files.pythonhosted.org/packages/1e/df/e6d3c7574233164b6330b9fd697beeac402afd367280e6dc377bb99b43d9/propcache-0.3.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7", size = 204660, upload-time = "2025-06-09T22:53:57.839Z" },
- { url = "https://files.pythonhosted.org/packages/b2/53/e4d31dd5170b4a0e2e6b730f2385a96410633b4833dc25fe5dffd1f73294/propcache-0.3.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b", size = 206105, upload-time = "2025-06-09T22:53:59.638Z" },
- { url = "https://files.pythonhosted.org/packages/7f/fe/74d54cf9fbe2a20ff786e5f7afcfde446588f0cf15fb2daacfbc267b866c/propcache-0.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c", size = 196980, upload-time = "2025-06-09T22:54:01.071Z" },
- { url = "https://files.pythonhosted.org/packages/22/ec/c469c9d59dada8a7679625e0440b544fe72e99311a4679c279562051f6fc/propcache-0.3.2-cp310-cp310-win32.whl", hash = "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70", size = 37679, upload-time = "2025-06-09T22:54:03.003Z" },
- { url = "https://files.pythonhosted.org/packages/38/35/07a471371ac89d418f8d0b699c75ea6dca2041fbda360823de21f6a9ce0a/propcache-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9", size = 41459, upload-time = "2025-06-09T22:54:04.134Z" },
{ url = "https://files.pythonhosted.org/packages/80/8d/e8b436717ab9c2cfc23b116d2c297305aa4cd8339172a456d61ebf5669b8/propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", size = 74207, upload-time = "2025-06-09T22:54:05.399Z" },
{ url = "https://files.pythonhosted.org/packages/d6/29/1e34000e9766d112171764b9fa3226fa0153ab565d0c242c70e9945318a7/propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", size = 43648, upload-time = "2025-06-09T22:54:08.023Z" },
{ url = "https://files.pythonhosted.org/packages/46/92/1ad5af0df781e76988897da39b5f086c2bf0f028b7f9bd1f409bb05b6874/propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", size = 43496, upload-time = "2025-06-09T22:54:09.228Z" },
@@ -748,22 +549,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/35/91/9cb56efbb428b006bb85db28591e40b7736847b8331d43fe335acf95f6c8/propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", size = 265778, upload-time = "2025-06-09T22:55:36.45Z" },
{ url = "https://files.pythonhosted.org/packages/9a/4c/b0fe775a2bdd01e176b14b574be679d84fc83958335790f7c9a686c1f468/propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", size = 41175, upload-time = "2025-06-09T22:55:38.436Z" },
{ url = "https://files.pythonhosted.org/packages/a4/ff/47f08595e3d9b5e149c150f88d9714574f1a7cbd89fe2817158a952674bf/propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", size = 44857, upload-time = "2025-06-09T22:55:39.687Z" },
- { url = "https://files.pythonhosted.org/packages/6c/39/8ea9bcfaaff16fd0b0fc901ee522e24c9ec44b4ca0229cfffb8066a06959/propcache-0.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5", size = 74678, upload-time = "2025-06-09T22:55:41.227Z" },
- { url = "https://files.pythonhosted.org/packages/d3/85/cab84c86966e1d354cf90cdc4ba52f32f99a5bca92a1529d666d957d7686/propcache-0.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4", size = 43829, upload-time = "2025-06-09T22:55:42.417Z" },
- { url = "https://files.pythonhosted.org/packages/23/f7/9cb719749152d8b26d63801b3220ce2d3931312b2744d2b3a088b0ee9947/propcache-0.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2", size = 43729, upload-time = "2025-06-09T22:55:43.651Z" },
- { url = "https://files.pythonhosted.org/packages/a2/a2/0b2b5a210ff311260002a315f6f9531b65a36064dfb804655432b2f7d3e3/propcache-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d", size = 204483, upload-time = "2025-06-09T22:55:45.327Z" },
- { url = "https://files.pythonhosted.org/packages/3f/e0/7aff5de0c535f783b0c8be5bdb750c305c1961d69fbb136939926e155d98/propcache-0.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec", size = 217425, upload-time = "2025-06-09T22:55:46.729Z" },
- { url = "https://files.pythonhosted.org/packages/92/1d/65fa889eb3b2a7d6e4ed3c2b568a9cb8817547a1450b572de7bf24872800/propcache-0.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701", size = 214723, upload-time = "2025-06-09T22:55:48.342Z" },
- { url = "https://files.pythonhosted.org/packages/9a/e2/eecf6989870988dfd731de408a6fa366e853d361a06c2133b5878ce821ad/propcache-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef", size = 200166, upload-time = "2025-06-09T22:55:49.775Z" },
- { url = "https://files.pythonhosted.org/packages/12/06/c32be4950967f18f77489268488c7cdc78cbfc65a8ba8101b15e526b83dc/propcache-0.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1", size = 194004, upload-time = "2025-06-09T22:55:51.335Z" },
- { url = "https://files.pythonhosted.org/packages/46/6c/17b521a6b3b7cbe277a4064ff0aa9129dd8c89f425a5a9b6b4dd51cc3ff4/propcache-0.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886", size = 203075, upload-time = "2025-06-09T22:55:52.681Z" },
- { url = "https://files.pythonhosted.org/packages/62/cb/3bdba2b736b3e45bc0e40f4370f745b3e711d439ffbffe3ae416393eece9/propcache-0.3.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b", size = 195407, upload-time = "2025-06-09T22:55:54.048Z" },
- { url = "https://files.pythonhosted.org/packages/29/bd/760c5c6a60a4a2c55a421bc34a25ba3919d49dee411ddb9d1493bb51d46e/propcache-0.3.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb", size = 196045, upload-time = "2025-06-09T22:55:55.485Z" },
- { url = "https://files.pythonhosted.org/packages/76/58/ced2757a46f55b8c84358d6ab8de4faf57cba831c51e823654da7144b13a/propcache-0.3.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea", size = 208432, upload-time = "2025-06-09T22:55:56.884Z" },
- { url = "https://files.pythonhosted.org/packages/bb/ec/d98ea8d5a4d8fe0e372033f5254eddf3254344c0c5dc6c49ab84349e4733/propcache-0.3.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb", size = 210100, upload-time = "2025-06-09T22:55:58.498Z" },
- { url = "https://files.pythonhosted.org/packages/56/84/b6d8a7ecf3f62d7dd09d9d10bbf89fad6837970ef868b35b5ffa0d24d9de/propcache-0.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe", size = 200712, upload-time = "2025-06-09T22:55:59.906Z" },
- { url = "https://files.pythonhosted.org/packages/bf/32/889f4903ddfe4a9dc61da71ee58b763758cf2d608fe1decede06e6467f8d/propcache-0.3.2-cp39-cp39-win32.whl", hash = "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1", size = 38187, upload-time = "2025-06-09T22:56:01.212Z" },
- { url = "https://files.pythonhosted.org/packages/67/74/d666795fb9ba1dc139d30de64f3b6fd1ff9c9d3d96ccfdb992cd715ce5d2/propcache-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9", size = 42025, upload-time = "2025-06-09T22:56:02.875Z" },
{ url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663, upload-time = "2025-06-09T22:56:04.484Z" },
]
@@ -779,8 +564,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" },
{ url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" },
{ url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" },
- { url = "https://files.pythonhosted.org/packages/08/60/84d5f6dcda9165e4d6a56ac8433c9f40a8906bf2966150b8a0cfde097d78/protobuf-6.33.5-cp39-cp39-win32.whl", hash = "sha256:a3157e62729aafb8df6da2c03aa5c0937c7266c626ce11a278b6eb7963c4e37c", size = 425892, upload-time = "2026-01-29T21:51:30.382Z" },
- { url = "https://files.pythonhosted.org/packages/68/19/33d7dc2dc84439587fa1e21e1c0026c01ad2af0a62f58fd54002a7546307/protobuf-6.33.5-cp39-cp39-win_amd64.whl", hash = "sha256:8f04fa32763dcdb4973d537d6b54e615cc61108c7cb38fe59310c3192d29510a", size = 437137, upload-time = "2026-01-29T21:51:31.456Z" },
{ url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" },
]
@@ -791,11 +574,8 @@ source = { editable = "." }
dependencies = [
{ name = "aiohttp" },
{ name = "base58" },
- { name = "borsh-construct" },
{ name = "construct" },
- { name = "construct-typing" },
{ name = "grpcio" },
- { name = "grpcio-tools" },
{ name = "protobuf" },
{ name = "python-dotenv" },
{ name = "pyyaml" },
@@ -806,8 +586,9 @@ dependencies = [
{ name = "winloop", marker = "sys_platform == 'win32'" },
]
-[package.optional-dependencies]
+[package.dev-dependencies]
dev = [
+ { name = "grpcio-tools" },
{ name = "ruff" },
]
@@ -815,22 +596,23 @@ dev = [
requires-dist = [
{ name = "aiohttp", specifier = ">=3.11.13" },
{ name = "base58", specifier = ">=2.1.1" },
- { name = "borsh-construct", specifier = ">=0.1.0" },
{ name = "construct", specifier = ">=2.10.67" },
- { name = "construct-typing", specifier = ">=0.5.2" },
{ name = "grpcio", specifier = ">=1.71.0" },
- { name = "grpcio-tools", specifier = ">=1.71.0" },
{ name = "protobuf", specifier = ">=5.29.4" },
{ name = "python-dotenv", specifier = ">=1.2.1" },
{ name = "pyyaml", specifier = ">=6.0.2" },
- { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.10.0" },
{ name = "solana", specifier = "==0.36.6" },
{ name = "solders", specifier = ">=0.26.0" },
{ name = "uvloop", marker = "sys_platform != 'win32'", specifier = ">=0.21.0" },
{ name = "websockets", specifier = ">=15.0" },
{ name = "winloop", marker = "sys_platform == 'win32'", specifier = ">=0.1.0" },
]
-provides-extras = ["dev"]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "grpcio-tools", specifier = ">=1.71.0" },
+ { name = "ruff", specifier = ">=0.10.0" },
+]
[[package]]
name = "python-dotenv"
@@ -847,15 +629,6 @@ version = "6.0.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload-time = "2024-08-06T20:31:40.178Z" },
- { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload-time = "2024-08-06T20:31:42.173Z" },
- { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload-time = "2024-08-06T20:31:44.263Z" },
- { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload-time = "2024-08-06T20:31:50.199Z" },
- { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload-time = "2024-08-06T20:31:52.292Z" },
- { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload-time = "2024-08-06T20:31:53.836Z" },
- { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload-time = "2024-08-06T20:31:55.565Z" },
- { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload-time = "2024-08-06T20:31:56.914Z" },
- { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload-time = "2024-08-06T20:31:58.304Z" },
{ url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" },
{ url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" },
{ url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" },
@@ -883,15 +656,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
{ url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
- { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777, upload-time = "2024-08-06T20:33:25.896Z" },
- { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318, upload-time = "2024-08-06T20:33:27.212Z" },
- { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891, upload-time = "2024-08-06T20:33:28.974Z" },
- { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614, upload-time = "2024-08-06T20:33:34.157Z" },
- { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360, upload-time = "2024-08-06T20:33:35.84Z" },
- { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006, upload-time = "2024-08-06T20:33:37.501Z" },
- { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577, upload-time = "2024-08-06T20:33:39.389Z" },
- { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593, upload-time = "2024-08-06T20:33:46.63Z" },
- { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312, upload-time = "2024-08-06T20:33:49.073Z" },
]
[[package]]
@@ -973,18 +737,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/23/e8/dc992f677762ea2de44b7768120d95887ef39fab10d6f29fb53e6a9882c1/solders-0.26.0-cp37-abi3-win_amd64.whl", hash = "sha256:5466616610170aab08c627ae01724e425bcf90085bc574da682e9f3bd954900b", size = 5480492, upload-time = "2025-02-18T19:23:53.285Z" },
]
-[[package]]
-name = "sumtypes"
-version = "0.1a6"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "attrs" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/3a/aa/1aa52ae948166291cf615687a733151d4567645beac7e51b7bae3fd88ad4/sumtypes-0.1a6.tar.gz", hash = "sha256:1a6ff095e06a1885f340ddab803e0f38e3f9bed81f9090164ca9682e04e96b43", size = 5272, upload-time = "2021-11-30T14:18:43.172Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5a/29/4ef1ff91dad16f8396bab999a09011d4939951f47b9729b3f73cc1f74756/sumtypes-0.1a6-py2.py3-none-any.whl", hash = "sha256:3e9d71322dd927d25d935072f8be7daec655ea292fd392359a5bb2c1e53dfdc3", size = 5817, upload-time = "2021-11-30T14:18:41.447Z" },
-]
-
[[package]]
name = "typing-extensions"
version = "4.14.1"
@@ -1000,12 +752,6 @@ version = "0.21.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3d/76/44a55515e8c9505aa1420aebacf4dd82552e5e15691654894e90d0bd051a/uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f", size = 1442019, upload-time = "2024-10-14T23:37:20.068Z" },
- { url = "https://files.pythonhosted.org/packages/35/5a/62d5800358a78cc25c8a6c72ef8b10851bdb8cca22e14d9c74167b7f86da/uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d", size = 801898, upload-time = "2024-10-14T23:37:22.663Z" },
- { url = "https://files.pythonhosted.org/packages/f3/96/63695e0ebd7da6c741ccd4489b5947394435e198a1382349c17b1146bb97/uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26", size = 3827735, upload-time = "2024-10-14T23:37:25.129Z" },
- { url = "https://files.pythonhosted.org/packages/61/e0/f0f8ec84979068ffae132c58c79af1de9cceeb664076beea86d941af1a30/uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb", size = 3825126, upload-time = "2024-10-14T23:37:27.59Z" },
- { url = "https://files.pythonhosted.org/packages/bf/fe/5e94a977d058a54a19df95f12f7161ab6e323ad49f4dabc28822eb2df7ea/uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f", size = 3705789, upload-time = "2024-10-14T23:37:29.385Z" },
- { url = "https://files.pythonhosted.org/packages/26/dd/c7179618e46092a77e036650c1f056041a028a35c4d76945089fcfc38af8/uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c", size = 3800523, upload-time = "2024-10-14T23:37:32.048Z" },
{ url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" },
{ url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" },
{ url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" },
@@ -1024,12 +770,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" },
{ url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" },
{ url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" },
- { url = "https://files.pythonhosted.org/packages/3c/a4/646a9d0edff7cde25fc1734695d3dfcee0501140dd0e723e4df3f0a50acb/uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b", size = 1439646, upload-time = "2024-10-14T23:38:24.656Z" },
- { url = "https://files.pythonhosted.org/packages/01/2e/e128c66106af9728f86ebfeeb52af27ecd3cb09336f3e2f3e06053707a15/uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2", size = 800931, upload-time = "2024-10-14T23:38:26.087Z" },
- { url = "https://files.pythonhosted.org/packages/2d/1a/9fbc2b1543d0df11f7aed1632f64bdf5ecc4053cf98cdc9edb91a65494f9/uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0", size = 3829660, upload-time = "2024-10-14T23:38:27.905Z" },
- { url = "https://files.pythonhosted.org/packages/b8/c0/392e235e4100ae3b95b5c6dac77f82b529d2760942b1e7e0981e5d8e895d/uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75", size = 3827185, upload-time = "2024-10-14T23:38:29.458Z" },
- { url = "https://files.pythonhosted.org/packages/e1/24/a5da6aba58f99aed5255eca87d58d1760853e8302d390820cc29058408e3/uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd", size = 3705833, upload-time = "2024-10-14T23:38:31.155Z" },
- { url = "https://files.pythonhosted.org/packages/1a/5c/6ba221bb60f1e6474474102e17e38612ec7a06dc320e22b687ab563d877f/uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff", size = 3804696, upload-time = "2024-10-14T23:38:33.633Z" },
]
[[package]]
@@ -1038,17 +778,6 @@ version = "15.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/2e/7a/8bc4d15af7ff30f7ba34f9a172063bfcee9f5001d7cef04bee800a658f33/websockets-15.0.tar.gz", hash = "sha256:ca36151289a15b39d8d683fd8b7abbe26fc50be311066c5f8dcf3cb8cee107ab", size = 175574, upload-time = "2025-02-16T11:06:55.664Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3d/f1/b20cc4c1ff84911c791f36fa511a78203836bb4d603f56290de08c067437/websockets-15.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5e6ee18a53dd5743e6155b8ff7e8e477c25b29b440f87f65be8165275c87fef0", size = 174701, upload-time = "2025-02-16T11:04:51.753Z" },
- { url = "https://files.pythonhosted.org/packages/f9/e8/4de59ee85ec86052ca574f4e5327ef948e4f77757d3c9c1503f5a0e9c039/websockets-15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ee06405ea2e67366a661ed313e14cf2a86e84142a3462852eb96348f7219cee3", size = 172358, upload-time = "2025-02-16T11:04:54.456Z" },
- { url = "https://files.pythonhosted.org/packages/2f/ea/b0f95815cdc83d61b1a895858671c6af38a76c23f3ea5d91e2ba11bbedc7/websockets-15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8711682a629bbcaf492f5e0af72d378e976ea1d127a2d47584fa1c2c080b436b", size = 172610, upload-time = "2025-02-16T11:04:56.753Z" },
- { url = "https://files.pythonhosted.org/packages/09/ed/c5d8f1f296f475c00611a40eff6a952248785efb125f91a0b29575f36ba6/websockets-15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94c4a9b01eede952442c088d415861b0cf2053cbd696b863f6d5022d4e4e2453", size = 181579, upload-time = "2025-02-16T11:04:59.042Z" },
- { url = "https://files.pythonhosted.org/packages/b7/fc/2444b5ae792d92179f20cec53475bcc25d1d7f00a2be9947de9837ef230a/websockets-15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45535fead66e873f411c1d3cf0d3e175e66f4dd83c4f59d707d5b3e4c56541c4", size = 180588, upload-time = "2025-02-16T11:05:01.278Z" },
- { url = "https://files.pythonhosted.org/packages/ff/b5/0945a31562d351cff26d76a2ae9a4ba4536e698aa059a4262afd793b2a1d/websockets-15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e389efe46ccb25a1f93d08c7a74e8123a2517f7b7458f043bd7529d1a63ffeb", size = 180902, upload-time = "2025-02-16T11:05:02.772Z" },
- { url = "https://files.pythonhosted.org/packages/b6/7c/e9d844b87754bc83b294cc1c695cbc6c5d42e329b85d2bf2d7bb9554d09c/websockets-15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:67a04754d121ea5ca39ddedc3f77071651fb5b0bc6b973c71c515415b44ed9c5", size = 181282, upload-time = "2025-02-16T11:05:04.097Z" },
- { url = "https://files.pythonhosted.org/packages/9e/6c/6a5d3272f494fa2fb4806b896ecb312bd6c72bab632df4ace19946c079dc/websockets-15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bd66b4865c8b853b8cca7379afb692fc7f52cf898786537dfb5e5e2d64f0a47f", size = 180694, upload-time = "2025-02-16T11:05:05.428Z" },
- { url = "https://files.pythonhosted.org/packages/b2/32/1fb4b62c2ec2c9844d4ddaa4021d993552c7c493a0acdcec95551679d501/websockets-15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a4cc73a6ae0a6751b76e69cece9d0311f054da9b22df6a12f2c53111735657c8", size = 180631, upload-time = "2025-02-16T11:05:07.645Z" },
- { url = "https://files.pythonhosted.org/packages/e4/9b/5ef1ddb8857ce894217bdd9572ad98c1cef20d8f9f0f43823b782b7ded6b/websockets-15.0-cp310-cp310-win32.whl", hash = "sha256:89da58e4005e153b03fe8b8794330e3f6a9774ee9e1c3bd5bc52eb098c3b0c4f", size = 175664, upload-time = "2025-02-16T11:05:09.992Z" },
- { url = "https://files.pythonhosted.org/packages/29/63/c320572ccf813ed2bc3058a0e0291ee95eb258dc5e6b3446ca45dc1af0fd/websockets-15.0-cp310-cp310-win_amd64.whl", hash = "sha256:4ff380aabd7a74a42a760ee76c68826a8f417ceb6ea415bd574a035a111fd133", size = 176109, upload-time = "2025-02-16T11:05:11.39Z" },
{ url = "https://files.pythonhosted.org/packages/ee/16/81a7403c8c0a33383de647e89c07824ea6a654e3877d6ff402cbae298cb8/websockets-15.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dd24c4d256558429aeeb8d6c24ebad4e982ac52c50bc3670ae8646c181263965", size = 174702, upload-time = "2025-02-16T11:05:14.163Z" },
{ url = "https://files.pythonhosted.org/packages/ef/40/4629202386a3bf1195db9fe41baeb1d6dfd8d72e651d9592d81dae7fdc7c/websockets-15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f83eca8cbfd168e424dfa3b3b5c955d6c281e8fc09feb9d870886ff8d03683c7", size = 172359, upload-time = "2025-02-16T11:05:15.613Z" },
{ url = "https://files.pythonhosted.org/packages/7b/33/dfb650e822bc7912d8c542c452497867af91dec81e7b5bf96aca5b419d58/websockets-15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4095a1f2093002c2208becf6f9a178b336b7572512ee0a1179731acb7788e8ad", size = 172604, upload-time = "2025-02-16T11:05:17.855Z" },
@@ -1082,29 +811,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9a/a7/c91c47103f1cd941b576bbc452601e9e01f67d5c9be3e0a9abe726491ab5/websockets-15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:86bfb52a9cfbcc09aba2b71388b0a20ea5c52b6517c0b2e316222435a8cdab72", size = 181466, upload-time = "2025-02-16T11:06:08.927Z" },
{ url = "https://files.pythonhosted.org/packages/16/32/a4ca6e3d56c24aac46b0cf5c03b841379f6409d07fc2044b244f90f54105/websockets-15.0-cp313-cp313-win32.whl", hash = "sha256:26ba70fed190708551c19a360f9d7eca8e8c0f615d19a574292b7229e0ae324c", size = 175673, upload-time = "2025-02-16T11:06:11.188Z" },
{ url = "https://files.pythonhosted.org/packages/c0/31/25a417a23e985b61ffa5544f9facfe4a118cb64d664c886f1244a8baeca5/websockets-15.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae721bcc8e69846af00b7a77a220614d9b2ec57d25017a6bbde3a99473e41ce8", size = 176115, upload-time = "2025-02-16T11:06:12.602Z" },
- { url = "https://files.pythonhosted.org/packages/d6/fc/070a2ac3741d1ed169a947841a8dfbff2b9a935a039b147906cc8d37d9ab/websockets-15.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c348abc5924caa02a62896300e32ea80a81521f91d6db2e853e6b1994017c9f6", size = 174697, upload-time = "2025-02-16T11:06:15.488Z" },
- { url = "https://files.pythonhosted.org/packages/67/d0/26cec8c4c3915aadb369f65f06292e3afe6f72547bed653d41ce4ea8667f/websockets-15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5294fcb410ed0a45d5d1cdedc4e51a60aab5b2b3193999028ea94afc2f554b05", size = 172357, upload-time = "2025-02-16T11:06:16.861Z" },
- { url = "https://files.pythonhosted.org/packages/61/52/15305c5d2871c57a3aa0f238a67db003a4221745a8d1dca30ebab1e2e1d7/websockets-15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c24ba103ecf45861e2e1f933d40b2d93f5d52d8228870c3e7bf1299cd1cb8ff1", size = 172603, upload-time = "2025-02-16T11:06:18.216Z" },
- { url = "https://files.pythonhosted.org/packages/1c/81/118d80d2da2556ff53989c9b05eea8fdd4e7a850ae56bbd1d53de1dfa2fd/websockets-15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc8821a03bcfb36e4e4705316f6b66af28450357af8a575dc8f4b09bf02a3dee", size = 181363, upload-time = "2025-02-16T11:06:19.671Z" },
- { url = "https://files.pythonhosted.org/packages/d1/8a/9ac84781b2a54843d454e28750a4bbade1cf4d2807420b4cb1595123456d/websockets-15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc5ae23ada6515f31604f700009e2df90b091b67d463a8401c1d8a37f76c1d7", size = 180365, upload-time = "2025-02-16T11:06:21.198Z" },
- { url = "https://files.pythonhosted.org/packages/5d/1f/9b4847c427329cd74d71486e985f7f08a9327c6cbf4098ba848bae5527c3/websockets-15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ac67b542505186b3bbdaffbc303292e1ee9c8729e5d5df243c1f20f4bb9057e", size = 180666, upload-time = "2025-02-16T11:06:22.525Z" },
- { url = "https://files.pythonhosted.org/packages/a4/76/96b259169545eeee5cb48efb746bb88cc853da42d0caff67a6cd7ff4234f/websockets-15.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c86dc2068f1c5ca2065aca34f257bbf4f78caf566eb230f692ad347da191f0a1", size = 181064, upload-time = "2025-02-16T11:06:23.954Z" },
- { url = "https://files.pythonhosted.org/packages/a0/5d/975b5ab63fb333482ca7e8ae69af8fdefd1b14b070f0ade71f16aac9bc37/websockets-15.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:30cff3ef329682b6182c01c568f551481774c476722020b8f7d0daacbed07a17", size = 180465, upload-time = "2025-02-16T11:06:25.428Z" },
- { url = "https://files.pythonhosted.org/packages/65/bf/2ba968e665b0a8f77e86fafb9a5b47232edea8ce31b87e7e814a54a433d7/websockets-15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:98dcf978d4c6048965d1762abd534c9d53bae981a035bfe486690ba11f49bbbb", size = 180434, upload-time = "2025-02-16T11:06:26.81Z" },
- { url = "https://files.pythonhosted.org/packages/b6/06/385c1a8943dc3a706bf6dce4ecba1ddc189c3aa8f43f8e6f6cd1443cf38f/websockets-15.0-cp39-cp39-win32.whl", hash = "sha256:37d66646f929ae7c22c79bc73ec4074d6db45e6384500ee3e0d476daf55482a9", size = 175660, upload-time = "2025-02-16T11:06:28.231Z" },
- { url = "https://files.pythonhosted.org/packages/26/1d/0bea814271dc414d6b560e9679b60b5b1594fd823f15cea0e00e755be410/websockets-15.0-cp39-cp39-win_amd64.whl", hash = "sha256:24d5333a9b2343330f0f4eb88546e2c32a7f5c280f8dd7d3cc079beb0901781b", size = 176121, upload-time = "2025-02-16T11:06:30.439Z" },
- { url = "https://files.pythonhosted.org/packages/42/52/359467c7ca12721a04520da9ba9fc29da2cd176c30992f6f81fa881bb3e5/websockets-15.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b499caef4bca9cbd0bd23cd3386f5113ee7378094a3cb613a2fa543260fe9506", size = 172384, upload-time = "2025-02-16T11:06:32.691Z" },
- { url = "https://files.pythonhosted.org/packages/7c/ff/36fd8a45fac404d8f109e03ca06328f49847d71c0c048414c76bb2db91c4/websockets-15.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:17f2854c6bd9ee008c4b270f7010fe2da6c16eac5724a175e75010aacd905b31", size = 172616, upload-time = "2025-02-16T11:06:35.006Z" },
- { url = "https://files.pythonhosted.org/packages/b1/a8/65496a87984815e2837835d5ac3c9f81ea82031036877e8f80953c59dbd9/websockets-15.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89f72524033abbfde880ad338fd3c2c16e31ae232323ebdfbc745cbb1b3dcc03", size = 173871, upload-time = "2025-02-16T11:06:36.444Z" },
- { url = "https://files.pythonhosted.org/packages/23/89/9441e1e0818d46fe22d78b3e5c8fe2316516211330e138231c90dce5559e/websockets-15.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1657a9eecb29d7838e3b415458cc494e6d1b194f7ac73a34aa55c6fb6c72d1f3", size = 173477, upload-time = "2025-02-16T11:06:37.822Z" },
- { url = "https://files.pythonhosted.org/packages/2f/1b/80460b3ac9795ef7bbaa074c603d64e009dbb2ceb11008416efab0dcc811/websockets-15.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e413352a921f5ad5d66f9e2869b977e88d5103fc528b6deb8423028a2befd842", size = 173425, upload-time = "2025-02-16T11:06:39.341Z" },
- { url = "https://files.pythonhosted.org/packages/56/d1/8da7e733ed266f342e8c544c3b8338449de9b860d85d9a0bfd4fe1857d6e/websockets-15.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8561c48b0090993e3b2a54db480cab1d23eb2c5735067213bb90f402806339f5", size = 176160, upload-time = "2025-02-16T11:06:40.739Z" },
- { url = "https://files.pythonhosted.org/packages/ad/10/c1d3f25fd5130f29023a26591afdeed8f687c8f10acb6425fca8090f34a9/websockets-15.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:190bc6ef8690cd88232a038d1b15714c258f79653abad62f7048249b09438af3", size = 172381, upload-time = "2025-02-16T11:06:43.119Z" },
- { url = "https://files.pythonhosted.org/packages/ed/4c/058e9c1f8ec05c1707dfbf2562e02415e36b96f82d2c4b4fb15344c7da10/websockets-15.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:327adab7671f3726b0ba69be9e865bba23b37a605b585e65895c428f6e47e766", size = 172612, upload-time = "2025-02-16T11:06:45.395Z" },
- { url = "https://files.pythonhosted.org/packages/9e/47/f9c5e24efb72f89c66b06b3d9a54270c3d8ee6175c00f62683b78c8d9fba/websockets-15.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd8ef197c87afe0a9009f7a28b5dc613bfc585d329f80b7af404e766aa9e8c7", size = 173864, upload-time = "2025-02-16T11:06:46.73Z" },
- { url = "https://files.pythonhosted.org/packages/b3/e8/697a8f451a22478d2474d4c807b5a938351a3daf9033523688d05e126f1c/websockets-15.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789c43bf4a10cd067c24c321238e800b8b2716c863ddb2294d2fed886fa5a689", size = 173472, upload-time = "2025-02-16T11:06:48.244Z" },
- { url = "https://files.pythonhosted.org/packages/64/dc/e8b5dfd15cf2467e6dcdcf8766ce11bf639a3ec9b9a2ce599462f5d0d33a/websockets-15.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7394c0b7d460569c9285fa089a429f58465db930012566c03046f9e3ab0ed181", size = 173422, upload-time = "2025-02-16T11:06:50.471Z" },
- { url = "https://files.pythonhosted.org/packages/60/84/ea2385f71664ca0990fc72df19842a47bd3cca88af63037fe548741e2b6f/websockets-15.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ea4f210422b912ebe58ef0ad33088bc8e5c5ff9655a8822500690abc3b1232d", size = 176154, upload-time = "2025-02-16T11:06:52.038Z" },
{ url = "https://files.pythonhosted.org/packages/e8/b2/31eec524b53f01cd8343f10a8e429730c52c1849941d1f530f8253b6d934/websockets-15.0-py3-none-any.whl", hash = "sha256:51ffd53c53c4442415b613497a34ba0aa7b99ac07f1e4a62db5dcd640ae6c3c3", size = 169023, upload-time = "2025-02-16T11:06:53.32Z" },
]
@@ -1114,9 +820,6 @@ version = "0.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8d/eb/d6058bed9170c365f88a87aa433e6e08458a405a7b91f9c7e6dd6c10039e/winloop-0.5.0.tar.gz", hash = "sha256:4b3b6737172e144e87ecbf123474e54ddf750084d42f04e476bcd746fd138ff5", size = 2602624, upload-time = "2026-01-20T23:45:43.703Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/09/e8/fcee3e037349750491460d7635cdefe6aaaeedb78352a9040d1eaf90eb2f/winloop-0.5.0-cp310-cp310-win32.whl", hash = "sha256:f07e82f52771d00abe9193bf5ac54dd0108ba43d9fe89d6804be7da3e7e988ac", size = 553593, upload-time = "2026-01-20T23:45:16.327Z" },
- { url = "https://files.pythonhosted.org/packages/6a/a5/43286d981ac98bf76f78128a69149b35e336d2b3a59b433fddc8d10ff601/winloop-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94f561d1efe38bccb077d9f693f8d399fac68a6fcc1554ebff8ef4051defa9c4", size = 670084, upload-time = "2026-01-20T23:45:17.688Z" },
- { url = "https://files.pythonhosted.org/packages/ed/a5/c75220a6ce35225a2f6277813700ef85332759fcd104d4c78db367f79035/winloop-0.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfcc45327a99f9a37b09bf2798d5d0f48eda5afc4174410a725b32574593fc60", size = 554169, upload-time = "2026-01-20T23:45:19.334Z" },
{ url = "https://files.pythonhosted.org/packages/7d/aa/d2da3765be0565252e296540a20b892f2a26978f20a83a7a85c2ab575a09/winloop-0.5.0-cp311-cp311-win32.whl", hash = "sha256:4c55f78bd54b1678c685b623487f6f5f70a5e544775488cfd31c7c3c3a6796f2", size = 552180, upload-time = "2026-01-20T23:45:20.349Z" },
{ url = "https://files.pythonhosted.org/packages/5d/3c/fe55fff0a846922cd571566c6a0a8a1601a19ac85aee30cdd8823fad1e11/winloop-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:1ea0aa74c5c67258d5c47e00a345e0789198265a0b2d254c54f8584be1b19db6", size = 678148, upload-time = "2026-01-20T23:45:21.837Z" },
{ url = "https://files.pythonhosted.org/packages/85/f2/1db45bdeec81f1254e00fc3ec2ca3132d55b74ac1d34283c94ac75af5be6/winloop-0.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:859d2e62c7170539a094ebe69ecc210070ddd548e360970c3defcf0876a72624", size = 555532, upload-time = "2026-01-20T23:45:23.068Z" },
@@ -1132,9 +835,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d6/3e/340cf1785a9dbe1c346c88f73bdbf358b2e85043501fd2bc2aa6c48c4ab7/winloop-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:b71b429b67133e7ff51590f48c107243537afe5243ca7a20ccd5165f41d40855", size = 673064, upload-time = "2026-01-20T23:45:35.869Z" },
{ url = "https://files.pythonhosted.org/packages/a3/1c/4226c77f7ad39da224d09f5a11e8e1a2eb720c93ba908b41ce94f143dd20/winloop-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:49b079b4e510f666535f290b5f8a08db780f34c160589000a8feafd81bab1b88", size = 837061, upload-time = "2026-01-20T23:45:37.444Z" },
{ url = "https://files.pythonhosted.org/packages/ea/2e/dfe68657a9638f87a4078f9b31c9ed50abb89b261a6accc03572570db2d7/winloop-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1d0fc16799bb15d5648955bc6bb1fdd4d2e62b733e0821468789aabeead82db2", size = 601514, upload-time = "2026-01-20T23:45:38.59Z" },
- { url = "https://files.pythonhosted.org/packages/0c/07/cfe00f2f19942ce81fa22bfe2e6af7f6253a9bfd2936890b9ef2a97f9ee0/winloop-0.5.0-cp39-cp39-win32.whl", hash = "sha256:9f233985fbe47500c9c002ae6d2a40699a7d9865f6c8317586b074489956d79c", size = 554569, upload-time = "2026-01-20T23:45:39.765Z" },
- { url = "https://files.pythonhosted.org/packages/bc/c8/808bcb237eb2759e526774c644ef32284ee0b2343f9dd7de07e1eb444ee4/winloop-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:55818aae8eb052419ed936f3650e33ddfa61644a6820e37cfcb134e2d19b8d7e", size = 671535, upload-time = "2026-01-20T23:45:41.28Z" },
- { url = "https://files.pythonhosted.org/packages/f8/34/ea631bf463c2ea2b405deebc50061fd88c6aa4ecd47560f544a0315bb4c3/winloop-0.5.0-cp39-cp39-win_arm64.whl", hash = "sha256:1b5dc8e49b87406ed415bcf738f6824d4bc8a449080e02e17613a83c74e45f47", size = 555661, upload-time = "2026-01-20T23:45:42.533Z" },
]
[[package]]
@@ -1148,23 +848,6 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428, upload-time = "2025-06-10T00:46:09.923Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/cb/65/7fed0d774abf47487c64be14e9223749468922817b5e8792b8a64792a1bb/yarl-1.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4", size = 132910, upload-time = "2025-06-10T00:42:31.108Z" },
- { url = "https://files.pythonhosted.org/packages/8a/7b/988f55a52da99df9e56dc733b8e4e5a6ae2090081dc2754fc8fd34e60aa0/yarl-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a", size = 90644, upload-time = "2025-06-10T00:42:33.851Z" },
- { url = "https://files.pythonhosted.org/packages/f7/de/30d98f03e95d30c7e3cc093759982d038c8833ec2451001d45ef4854edc1/yarl-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed", size = 89322, upload-time = "2025-06-10T00:42:35.688Z" },
- { url = "https://files.pythonhosted.org/packages/e0/7a/f2f314f5ebfe9200724b0b748de2186b927acb334cf964fd312eb86fc286/yarl-1.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e", size = 323786, upload-time = "2025-06-10T00:42:37.817Z" },
- { url = "https://files.pythonhosted.org/packages/15/3f/718d26f189db96d993d14b984ce91de52e76309d0fd1d4296f34039856aa/yarl-1.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73", size = 319627, upload-time = "2025-06-10T00:42:39.937Z" },
- { url = "https://files.pythonhosted.org/packages/a5/76/8fcfbf5fa2369157b9898962a4a7d96764b287b085b5b3d9ffae69cdefd1/yarl-1.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e", size = 339149, upload-time = "2025-06-10T00:42:42.627Z" },
- { url = "https://files.pythonhosted.org/packages/3c/95/d7fc301cc4661785967acc04f54a4a42d5124905e27db27bb578aac49b5c/yarl-1.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8", size = 333327, upload-time = "2025-06-10T00:42:44.842Z" },
- { url = "https://files.pythonhosted.org/packages/65/94/e21269718349582eee81efc5c1c08ee71c816bfc1585b77d0ec3f58089eb/yarl-1.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23", size = 326054, upload-time = "2025-06-10T00:42:47.149Z" },
- { url = "https://files.pythonhosted.org/packages/32/ae/8616d1f07853704523519f6131d21f092e567c5af93de7e3e94b38d7f065/yarl-1.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70", size = 315035, upload-time = "2025-06-10T00:42:48.852Z" },
- { url = "https://files.pythonhosted.org/packages/48/aa/0ace06280861ef055855333707db5e49c6e3a08840a7ce62682259d0a6c0/yarl-1.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb", size = 338962, upload-time = "2025-06-10T00:42:51.024Z" },
- { url = "https://files.pythonhosted.org/packages/20/52/1e9d0e6916f45a8fb50e6844f01cb34692455f1acd548606cbda8134cd1e/yarl-1.20.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2", size = 335399, upload-time = "2025-06-10T00:42:53.007Z" },
- { url = "https://files.pythonhosted.org/packages/f2/65/60452df742952c630e82f394cd409de10610481d9043aa14c61bf846b7b1/yarl-1.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30", size = 338649, upload-time = "2025-06-10T00:42:54.964Z" },
- { url = "https://files.pythonhosted.org/packages/7b/f5/6cd4ff38dcde57a70f23719a838665ee17079640c77087404c3d34da6727/yarl-1.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309", size = 358563, upload-time = "2025-06-10T00:42:57.28Z" },
- { url = "https://files.pythonhosted.org/packages/d1/90/c42eefd79d0d8222cb3227bdd51b640c0c1d0aa33fe4cc86c36eccba77d3/yarl-1.20.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24", size = 357609, upload-time = "2025-06-10T00:42:59.055Z" },
- { url = "https://files.pythonhosted.org/packages/03/c8/cea6b232cb4617514232e0f8a718153a95b5d82b5290711b201545825532/yarl-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13", size = 350224, upload-time = "2025-06-10T00:43:01.248Z" },
- { url = "https://files.pythonhosted.org/packages/ce/a3/eaa0ab9712f1f3d01faf43cf6f1f7210ce4ea4a7e9b28b489a2261ca8db9/yarl-1.20.1-cp310-cp310-win32.whl", hash = "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8", size = 81753, upload-time = "2025-06-10T00:43:03.486Z" },
- { url = "https://files.pythonhosted.org/packages/8f/34/e4abde70a9256465fe31c88ed02c3f8502b7b5dead693a4f350a06413f28/yarl-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16", size = 86817, upload-time = "2025-06-10T00:43:05.231Z" },
{ url = "https://files.pythonhosted.org/packages/b1/18/893b50efc2350e47a874c5c2d67e55a0ea5df91186b2a6f5ac52eff887cd/yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", size = 133833, upload-time = "2025-06-10T00:43:07.393Z" },
{ url = "https://files.pythonhosted.org/packages/89/ed/b8773448030e6fc47fa797f099ab9eab151a43a25717f9ac043844ad5ea3/yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", size = 91070, upload-time = "2025-06-10T00:43:09.538Z" },
{ url = "https://files.pythonhosted.org/packages/e3/e3/409bd17b1e42619bf69f60e4f031ce1ccb29bd7380117a55529e76933464/yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", size = 89818, upload-time = "2025-06-10T00:43:11.575Z" },
@@ -1233,22 +916,5 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/ed/c5fb04869b99b717985e244fd93029c7a8e8febdfcffa06093e32d7d44e7/yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", size = 341709, upload-time = "2025-06-10T00:45:23.221Z" },
{ url = "https://files.pythonhosted.org/packages/24/fd/725b8e73ac2a50e78a4534ac43c6addf5c1c2d65380dd48a9169cc6739a9/yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", size = 86591, upload-time = "2025-06-10T00:45:25.793Z" },
{ url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003, upload-time = "2025-06-10T00:45:27.752Z" },
- { url = "https://files.pythonhosted.org/packages/01/75/0d37402d208d025afa6b5b8eb80e466d267d3fd1927db8e317d29a94a4cb/yarl-1.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3", size = 134259, upload-time = "2025-06-10T00:45:29.882Z" },
- { url = "https://files.pythonhosted.org/packages/73/84/1fb6c85ae0cf9901046f07d0ac9eb162f7ce6d95db541130aa542ed377e6/yarl-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b", size = 91269, upload-time = "2025-06-10T00:45:32.917Z" },
- { url = "https://files.pythonhosted.org/packages/f3/9c/eae746b24c4ea29a5accba9a06c197a70fa38a49c7df244e0d3951108861/yarl-1.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983", size = 89995, upload-time = "2025-06-10T00:45:35.066Z" },
- { url = "https://files.pythonhosted.org/packages/fb/30/693e71003ec4bc1daf2e4cf7c478c417d0985e0a8e8f00b2230d517876fc/yarl-1.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805", size = 325253, upload-time = "2025-06-10T00:45:37.052Z" },
- { url = "https://files.pythonhosted.org/packages/0f/a2/5264dbebf90763139aeb0b0b3154763239398400f754ae19a0518b654117/yarl-1.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba", size = 320897, upload-time = "2025-06-10T00:45:39.962Z" },
- { url = "https://files.pythonhosted.org/packages/e7/17/77c7a89b3c05856489777e922f41db79ab4faf58621886df40d812c7facd/yarl-1.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e", size = 340696, upload-time = "2025-06-10T00:45:41.915Z" },
- { url = "https://files.pythonhosted.org/packages/6d/55/28409330b8ef5f2f681f5b478150496ec9cf3309b149dab7ec8ab5cfa3f0/yarl-1.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723", size = 335064, upload-time = "2025-06-10T00:45:43.893Z" },
- { url = "https://files.pythonhosted.org/packages/85/58/cb0257cbd4002828ff735f44d3c5b6966c4fd1fc8cc1cd3cd8a143fbc513/yarl-1.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000", size = 327256, upload-time = "2025-06-10T00:45:46.393Z" },
- { url = "https://files.pythonhosted.org/packages/53/f6/c77960370cfa46f6fb3d6a5a79a49d3abfdb9ef92556badc2dcd2748bc2a/yarl-1.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5", size = 316389, upload-time = "2025-06-10T00:45:48.358Z" },
- { url = "https://files.pythonhosted.org/packages/64/ab/be0b10b8e029553c10905b6b00c64ecad3ebc8ace44b02293a62579343f6/yarl-1.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c", size = 340481, upload-time = "2025-06-10T00:45:50.663Z" },
- { url = "https://files.pythonhosted.org/packages/c5/c3/3f327bd3905a4916029bf5feb7f86dcf864c7704f099715f62155fb386b2/yarl-1.20.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240", size = 336941, upload-time = "2025-06-10T00:45:52.554Z" },
- { url = "https://files.pythonhosted.org/packages/d1/42/040bdd5d3b3bb02b4a6ace4ed4075e02f85df964d6e6cb321795d2a6496a/yarl-1.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee", size = 339936, upload-time = "2025-06-10T00:45:54.919Z" },
- { url = "https://files.pythonhosted.org/packages/0d/1c/911867b8e8c7463b84dfdc275e0d99b04b66ad5132b503f184fe76be8ea4/yarl-1.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010", size = 360163, upload-time = "2025-06-10T00:45:56.87Z" },
- { url = "https://files.pythonhosted.org/packages/e2/31/8c389f6c6ca0379b57b2da87f1f126c834777b4931c5ee8427dd65d0ff6b/yarl-1.20.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8", size = 359108, upload-time = "2025-06-10T00:45:58.869Z" },
- { url = "https://files.pythonhosted.org/packages/7f/09/ae4a649fb3964324c70a3e2b61f45e566d9ffc0affd2b974cbf628957673/yarl-1.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d", size = 351875, upload-time = "2025-06-10T00:46:01.45Z" },
- { url = "https://files.pythonhosted.org/packages/8d/43/bbb4ed4c34d5bb62b48bf957f68cd43f736f79059d4f85225ab1ef80f4b9/yarl-1.20.1-cp39-cp39-win32.whl", hash = "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06", size = 82293, upload-time = "2025-06-10T00:46:03.763Z" },
- { url = "https://files.pythonhosted.org/packages/d7/cd/ce185848a7dba68ea69e932674b5c1a42a1852123584bccc5443120f857c/yarl-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00", size = 87385, upload-time = "2025-06-10T00:46:05.655Z" },
{ url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542, upload-time = "2025-06-10T00:46:07.521Z" },
]