Python SDK for XCCY Protocol - Interest Rate Swap AMM on Polygon
Project description
xccy-py
Python SDK for the XCCY Protocol — an Interest Rate Swap AMM on Polygon.
┌─────────────────────────────────────────────────────────────────────────┐
│ xccy-py SDK │
├─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────────┤
│ account │ margin │ trading │position │ oracle │ trades │ stream │
└────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴──────┬──────┘
│ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ On-Chain (Polygon) │ Backend │ WebSocket RPC │
│ CollateralEngine │ VAMMManager │ Oracles│ api.xccy│ wss://... │
└─────────────────────────────────────────────────────────────────────────┘
Installation
pip install xccy
Quick Start
from xccy import XccyClient
from xccy.tokens import PolygonTokens
# Initialize client
client = XccyClient(
rpc_url="https://polygon-rpc.com",
private_key="0x...", # Optional, for signing transactions
)
# Create account identifier
account = client.account.create_account_id(
owner="0xYourWallet...",
account_id=0,
isolated_margin_token=None # Cross-margin mode
)
# Deposit margin
tx = client.margin.deposit(
account=account,
token=PolygonTokens.USDC,
amount=1000 * 10**6 # 1000 USDC
)
print(f"Deposit tx: {tx.transactionHash.hex()}")
# Check health
obligations = client.position.get_obligations(account)
margin_value = client.margin.get_total_value_usd(account)
health = margin_value / obligations if obligations > 0 else float('inf')
print(f"Health factor: {health:.2f}")
Features
Multi-Account System
One wallet can own multiple sub-accounts with independent positions and margin:
# Cross-margin account
main = client.account.create_account_id(owner="0x...", account_id=0)
# Isolated margin account (USDC only)
isolated = client.account.create_account_id(
owner="0x...",
account_id=1,
isolated_margin_token=PolygonTokens.USDC
)
Trading (Swap & LP)
from xccy.math import fixed_rate_to_tick, notional_to_liquidity
# Execute a swap (pay fixed rate)
result = client.trading.swap(
pool_key=pool,
account=account,
notional=10_000 * 10**6,
is_fixed_taker=True,
tick_lower=-6930,
tick_upper=-6900,
)
# Provide liquidity with notional amount
tick_lower = fixed_rate_to_tick(0.06) # 6%
tick_upper = fixed_rate_to_tick(0.04) # 4%
liquidity = notional_to_liquidity(10_000 * 10**6, tick_lower, tick_upper)
client.trading.mint(pool, account, tick_lower, tick_upper, liquidity)
Oracle Data
# Get USD price
price = client.oracle.get_price_usd(PolygonTokens.USDC)
# Get current APR
apr = client.oracle.get_apr(PolygonTokens.A_USDC)
# Get rate between timestamps
rate = client.oracle.get_rate_from_to(
asset=PolygonTokens.A_USDC,
from_timestamp=1704067200,
to_timestamp=1735689600
)
Trade Tracking
# Historical trades from backend
trades, cursor = client.trades.get_pool_trades(pool_id, limit=50)
for trade in trades:
print(f"{trade.timestamp}: {trade.notional} @ {trade.fixed_rate:.2%}")
# User trades
my_trades = client.trades.get_user_trades(pool_id, my_address)
Live Streaming (WebSocket)
import asyncio
from xccy import XccyClient, TradeEvent
client = XccyClient(
rpc_url="https://polygon-rpc.com",
ws_rpc_url="wss://polygon-mainnet.g.alchemy.com/v2/KEY",
)
# Async iterator (recommended for trading strategies)
async def trading_strategy():
async for event in client.stream.events(event_types=["Swap"]):
print(f"New swap: {event.variable_token_delta}")
await react_to_trade(event)
# Wait for specific event
async def wait_for_my_fill():
event = await client.stream.next_event(
user_address=my_address,
event_types=["Swap"],
timeout=60.0,
)
print(f"Filled: {event.tx_hash}")
asyncio.run(trading_strategy())
Math Utilities
from xccy.math import (
tick_to_fixed_rate,
fixed_rate_to_tick,
liquidity_to_notional,
notional_to_liquidity,
wad_to_decimal,
)
# Tick ↔ Rate conversions
rate = tick_to_fixed_rate(-6930) # ~5% APR
tick = fixed_rate_to_tick(0.05)
# Liquidity ↔ Notional
liquidity = notional_to_liquidity(10_000 * 10**6, tick_lower, tick_upper)
notional = liquidity_to_notional(liquidity, tick_lower, tick_upper)
Documentation
Full documentation available at docs.xccy.finance
- Quick Start Guide
- Account System
- Margin Operations
- Trading Guide
- Trade Tracking
- Health Monitoring
- API Reference
Development
# Clone and install
git clone https://github.com/xccy-finance/xccy-sdk.git
cd xccy-sdk
pip install -e ".[dev,docs]"
# Run tests
pytest
# Run linter
ruff check xccy/
# Type check
mypy xccy/
# Build docs
mkdocs serve
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
xccy-0.2.1.tar.gz
(79.7 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
xccy-0.2.1-py3-none-any.whl
(66.7 kB
view details)
File details
Details for the file xccy-0.2.1.tar.gz.
File metadata
- Download URL: xccy-0.2.1.tar.gz
- Upload date:
- Size: 79.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96856c400bbaecdd7455c954a707246d0640b2b1d5c852371d9be3eca3dd6127
|
|
| MD5 |
f79927f891e5fe8b9221068f7a34ebb1
|
|
| BLAKE2b-256 |
c1c4fb2c643e8908765a51849bc8d72f97a26fc5c5165c619ea9003fc0358f43
|
File details
Details for the file xccy-0.2.1-py3-none-any.whl.
File metadata
- Download URL: xccy-0.2.1-py3-none-any.whl
- Upload date:
- Size: 66.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
035b9d8fec66eca49109d1c49fe55daf8ef818c373bcaac344f76dc647d2185c
|
|
| MD5 |
e40355efd7becea7c939f909027a992c
|
|
| BLAKE2b-256 |
127cfebe9b4926db4a82405ae2cb754c85c179c7597279a71181bff843b70b05
|