Python SDK for interacting with Perp City perpetual futures contracts.
pip install perpcity-sdkFor development:
pip install -e ".[dev]"from perpcity_sdk import PerpCityContext, open_taker_position, OpenTakerPositionParams
# Initialize context
context = PerpCityContext(
rpc_url="https://base-sepolia.g.alchemy.com/v2/YOUR_KEY",
private_key="0xYOUR_PRIVATE_KEY",
perp_manager_address="0xPERP_MANAGER",
usdc_address="0xUSDC",
)
# Fetch market data
perp_data = context.get_perp_data(perp_id)
print(f"Mark price: {perp_data.mark}")
# Open a long position
position = open_taker_position(
context,
perp_id,
OpenTakerPositionParams(
is_long=True,
margin=100, # $100
leverage=5, # 5x
unspecified_amount_limit=0,
),
)
print(f"Position ID: {position.position_id}")
# Check live details
details = position.live_details()
print(f"PnL: ${details.pnl:.2f}")context = PerpCityContext(rpc_url, private_key, perp_manager_address, usdc_address, chain_id=84532)Methods:
get_perp_data(perp_id)- Fetch market data (mark price, fees, bounds)get_user_data(address, positions)- Fetch user USDC balance and position detailsget_position_raw_data(position_id)- Fetch raw position data for calculationsget_open_position_data(perp_id, position_id, is_long, is_maker)- Fetch position with live detailsvalidate_chain_id()- Verify RPC matches expected chain
open_taker_position(context, perp_id, params)- Open a long/short positionopen_maker_position(context, perp_id, params)- Provide liquidity in a price rangeclose_position(context, perp_id, position_id, params)- Close a positioncreate_perp(context, params)- Create a new perpetual market
calculate_entry_price(raw_data)- Entry price from position datacalculate_position_size(raw_data)- Position size in perp unitscalculate_position_value(raw_data, mark_price)- Current value in USDcalculate_leverage(position_value, effective_margin)- Current leveragecalculate_liquidation_price(raw_data, is_long)- Liquidation price
price_to_sqrt_price_x96(price)/sqrt_price_x96_to_price(sqrt_price_x96)price_to_tick(price, round_down)/tick_to_price(tick)scale_6_decimals(amount)/scale_from_6_decimals(value)estimate_liquidity(tick_lower, tick_upper, usd_scaled)calculate_liquidity_for_target_ratio(...)
RPC_URL=https://base-sepolia.g.alchemy.com/v2/YOUR_KEY
PRIVATE_KEY=0xYOUR_PRIVATE_KEY
PERP_MANAGER_ADDRESS=0xYOUR_PERP_MANAGER
USDC_ADDRESS=0xYOUR_USDC
make build # Install with dev deps
make test-unit # Run unit tests
make lint # Lint with ruff
make ci # Full CI (lint + tests)MIT