Skip to main content
Quarantined

This project has been quarantined by PyPI admins. It cannot be installed or modified until a security review is complete.

neutrl-core

Core utilities for Neutrl Protocol services. Provides standardized configuration loading, structured logging, RPC provider management, and retry logic.

Installation

pip install neutrl-core

# With optional extras:
pip install neutrl-core[web3]     # web3.py integration
pip install neutrl-core[nats]     # NATS messaging
pip install neutrl-core[redis]    # Redis support
pip install neutrl-core[all]      # Everything

Quick Start

Configuration

from neutrl_core import NeutrlConfig

# Loads from environment variables (NEUTRL_* prefix) and .env file
config = NeutrlConfig()

print(config.env)             # Environment.DEVELOPMENT
print(config.db.dsn)          # postgresql://neutrl:@localhost:5432/neutrl
print(config.nats.url)        # nats://localhost:4222
print(config.hasura.url)      # http://localhost:8080/v1/graphql
print(config.is_production)   # False

# Per-chain RPC config
eth_config = config.get_chain(1)
print(eth_config.rpc_urls)    # ["https://eth.llamarpc.com"]

Environment Variables

# Core
NEUTRL_ENV=production
NEUTRL_SERVICE_NAME=trading-engine
NEUTRL_LOG_LEVEL=INFO
NEUTRL_LOG_FORMAT=json

# Chain RPC
NEUTRL_CHAIN_ETH_RPC_URLS=https://eth.llamarpc.com,https://rpc.ankr.com/eth
NEUTRL_CHAIN_ETH_CHAIN_ID=1

# Database
NEUTRL_DB_HOST=db.internal
NEUTRL_DB_PORT=5432
NEUTRL_DB_NAME=neutrl_prod
NEUTRL_DB_USER=app
NEUTRL_DB_PASSWORD=secret

# NATS
NEUTRL_NATS_URL=nats://nats.internal:4222
NEUTRL_NATS_TOKEN=nats-auth-token

# Redis
NEUTRL_REDIS_URL=redis://redis.internal:6379

# Hasura
NEUTRL_HASURA_URL=https://hasura.internal/v1/graphql
NEUTRL_HASURA_ADMIN_SECRET=hasura-secret

Structured Logging

from neutrl_core import setup_logging, get_logger

setup_logging(level="INFO", format="json", service_name="trading-engine")

log = get_logger("positions")
log.info("position_opened", symbol="ETH-PERP", size=1.5, leverage=3)
log.warning("margin_low", account="0xabc...", ratio=0.12)

# Output (JSON):
# {"event": "position_opened", "symbol": "ETH-PERP", "size": 1.5, ...}

RPC Provider Management

from neutrl_core import ProviderManager, RPCEndpoint

manager = ProviderManager([
    RPCEndpoint(url="https://eth.llamarpc.com", chain_id=1),
    RPCEndpoint(url="https://rpc.ankr.com/eth", chain_id=1),
    RPCEndpoint(url="https://arb1.arbitrum.io/rpc", chain_id=42161),
])

# Auto-routes to healthiest provider
block = manager.call(1, "eth_blockNumber")
print(f"Block: {int(block, 16)}")

# Health monitoring
for health in manager.health_report(chain_id=1):
    print(f"{health.endpoint.url}: {health.status.value} ({health.latency_ms:.0f}ms)")

# Async support
result = await manager.async_call(42161, "eth_getBalance", ["0xabc...", "latest"])

Retry Logic

from neutrl_core import RetryPolicy, retry, async_retry

@retry(RetryPolicy(max_attempts=5, base_delay=0.5))
def fetch_price(symbol: str) -> float:
    return external_api.get_price(symbol)

@async_retry(RetryPolicy(max_attempts=3, base_delay=1.0))
async def submit_order(params: dict) -> str:
    return await exchange.place_order(params)

API Reference

Configuration

Class Description
NeutrlConfig Root config — aggregates all sub-configs
ChainConfig Per-chain RPC endpoints and settings
DatabaseConfig PostgreSQL connection with DSN builder
NATSConfig NATS messaging connection settings
RedisConfig Redis with sentinel support
HasuraConfig Hasura GraphQL endpoint and auth

Provider Management

Class / Method Description
ProviderManager Multi-provider RPC client with failover
RPCEndpoint Single endpoint configuration
ProviderHealth Health stats with latency tracking
.call() / .async_call() JSON-RPC with automatic failover
.health_report() Provider health summary

Logging

Function Description
setup_logging() Configure structlog for a service
get_logger() Get a bound structlog logger
bind_context() Add context to all logs in scope
clear_context() Reset context variables

Retry

Class / Function Description
RetryPolicy Configurable retry with exponential backoff
@retry() Sync retry decorator
@async_retry() Async retry decorator

Requirements

  • Python 3.9+
  • pydantic >= 2.0
  • pydantic-settings >= 2.0
  • httpx >= 0.24
  • structlog >= 23.0

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

neutrl_core-2.0.1.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

neutrl_core-2.0.1-py3-none-any.whl (14.1 kB view details)

Uploaded Python 3

File details

Details for the file neutrl_core-2.0.1.tar.gz.

File metadata

  • Download URL: neutrl_core-2.0.1.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.10.12

File hashes

Hashes for neutrl_core-2.0.1.tar.gz
Algorithm Hash digest
SHA256 be232afd97a5a0b477f7f52216353685b46ab9ef035e0f74e8688e5eb9a50a02
MD5 daf495062269a73ce8ce6b1b20ac8dbe
BLAKE2b-256 64afabaf4e82649467e4b238b59191320e826762f421f0934cd852ca4c525ddd

See more details on using hashes here.

File details

Details for the file neutrl_core-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: neutrl_core-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 14.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.10.12

File hashes

Hashes for neutrl_core-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aa64ae9df163fd0a25c818ba692f98898cfff2c5e7e1692b711c073b093899db
MD5 a73b8c67b1a780358ebadc15018deeab
BLAKE2b-256 305e6e2a499da6a229ff960cfc37c93db2330ccc5dc30b99d05b50def4e84ffb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page