epsilon-exchange
Python SDK for Epsilon — non-custodial limit,
stop-loss, and DCA orders on Robinhood Chain, via the Epsilon /v1 API.
Your private key never leaves your machine: orders are built and EIP-712 signed locally, and the API only ever sees the signed payload. The signing implementation is pinned byte-for-byte against the TypeScript SDK and the Go verifier by a shared golden fixture.
Install
pip install epsilon-exchange
Get an API key at developers.epsilon.exchange/dashboard.
Place a limit order
from epsilon_exchange import (
EpsilonClient, build_and_sign_order, parse_units, calculate_trigger_price,
)
client = EpsilonClient(api_key="eps_...")
private_key = "0x..." # the wallet that holds the tokens
wallet = "0x..." # its address
# 1. Find tokens (symbol → address + decimals)
eth = client.search_tokens("WETH")["tokens"][0]
usd = client.search_tokens("USDG")["tokens"][0]
# 2. Route — request it with the order_type you will submit; its feeLegs carry
# that fee cell and are exact-matched on submit. Pass them through unmodified.
amount_in = parse_units("0.5", eth["decimals"])
route = client.order_route(eth["address"], usd["address"], amount_in,
slippage_ppm=10_000, wallet=wallet, order_type="limit")
# 3. Build + sign locally (sell 0.5 WETH at 3000 USDG/WETH or better)
signed = build_and_sign_order(
private_key,
token_in=eth["address"],
token_out=usd["address"],
amount_in=amount_in,
trigger_price=calculate_trigger_price("3000", usd["decimals"]),
token_in_decimals=eth["decimals"],
fee_legs=route.get("feeLegs"),
kind="limit",
)
# 4. Submit
res = client.submit_order(signed, "limit")
print(res["orderHash"])
The router must be approved to spend token_in first (a plain ERC-20
approve to the router — address in epsilon_exchange.ROUTER_ADDRESS).
Modules
EpsilonClient—/v1API:search_tokens,quote,order_route,submit_order,get_order,list_orders,cancel_orderbuild_and_sign_order/sign_cancel— local EIP-712 signing (eth-account)parse_units/format_units/calculate_trigger_price— decimal helperschain— chain id, router address, EIP-712 domain and types
Also available
- TypeScript:
@epsilon-exchange/sdk - AI agents (Claude/Cursor):
@epsilon-exchange/mcp - Docs: developers.epsilon.exchange
Metadata
Release files for epsilon-exchange 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| epsilon_exchange-0.2.0.tar.gz | 8.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| epsilon_exchange-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.8 kB
Release files / epsilon_exchange-0.2.0.tar.gz
| Download URL | epsilon_exchange-0.2.0.tar.gz |
|---|---|
| Size | 8.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4a251efe5ccf1a883a8d99440b54f0145db03539b6cc7b0f57a1582c8621154c
|
|
BLAKE2b-256 checksum How to use checksums |
5deb88a8dc3d277dabfa72f7f6ddd4eb9a42e0ea76273a32e1af6137055dc745
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.6
|
Release files / epsilon_exchange-0.2.0-py3-none-any.whl
| Download URL | epsilon_exchange-0.2.0-py3-none-any.whl |
|---|---|
| Size | 9.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b05e4646742822f1568980de6ae1b12c06abd940e8f2dae1ad3dd210b1fe0da1
|
|
BLAKE2b-256 checksum How to use checksums |
159ce235dc0d84a272abd40dcd7a189c665fe4cf99b6020694353f1450bcc77c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.6
|