Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,9 @@ python hedge_mode.py --exchange edgex --ticker BTC --size 0.001 --iter 20

2. 在浏览器中打开这个网址

3. 在结果中搜索 "account_index" - 如果你有子账户,会有多个 account_index,短的那个是你主账户的,长的是你的子账户。
3. 如果你只有主账户,直接将钱包地址填入 LIGHTER_ADDRESS 环境变量,无需查找 account_index。

4. 如果你需要使用子账户,请在返回的结果中查找 account_index。主账户的 account_index 通常较短,而子账户的 account_index 较长。手动查找并填写对应的 account_index。

### 命令行参数

Expand Down
2 changes: 2 additions & 0 deletions env_example.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ ASTER_SECRET_KEY=your_aster_secret_key

# Lighter Configuration
API_KEY_PRIVATE_KEY=your_api_key_private_key_here
# <use the primary account index if not provided>
LIGHTER_ACCOUNT_INDEX=0
LIGHTER_API_KEY_INDEX=0
LIGHTER_ADDRESS=<your_wallet_address (ignored if LIGHTER_ACCOUNT_INDEX is set)>

# Extended Configuration
EXTENDED_API_KEY=your_extended_api_key
Expand Down
52 changes: 45 additions & 7 deletions exchanges/lighter.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,24 @@ class LighterClient(BaseExchangeClient):
def __init__(self, config: Dict[str, Any]):
"""Initialize Lighter client."""
super().__init__(config)

self.logger = TradingLogger(exchange="lighter", ticker=self.config.ticker, log_to_console=False)

# Lighter credentials from environment
self.api_key_private_key = os.getenv('API_KEY_PRIVATE_KEY')
self.account_index = int(os.getenv('LIGHTER_ACCOUNT_INDEX', '0'))
# 如果没有提供 Lighter account index,通过钱包地址查找主账户
if self.account_index == 0:
self.account_address = os.getenv('LIGHTER_ADDRESS', '')
if not self.account_address:
raise ValueError("LIGHTER_ADDRESS is not set in environment variables.")
self.account_index = self._get_lihgter_account_index(self.account_address)
self.api_key_index = int(os.getenv('LIGHTER_API_KEY_INDEX', '0'))
self.base_url = "https://mainnet.zklighter.elliot.ai"

if not self.api_key_private_key:
raise ValueError("API_KEY_PRIVATE_KEY must be set in environment variables")

# Initialize logger
self.logger = TradingLogger(exchange="lighter", ticker=self.config.ticker, log_to_console=False)
self._order_update_handler = None

# Initialize Lighter client (will be done in connect)
Expand All @@ -59,13 +65,45 @@ def __init__(self, config: Dict[str, Any]):
self.orders_cache = {}
self.current_order_client_id = None
self.current_order = None


def _get_lihgter_account_index(self, address):
from eth_utils import to_checksum_address
import requests

# 转换为 EIP-55 校验格式
checksum_address = to_checksum_address(address.lower())
url = 'https://mainnet.zklighter.elliot.ai/api/v1/account?by=l1_address&value='
full_url = url + checksum_address

res = requests.get(full_url)
data = res.json()

# 提取 account_index
if 'accounts' in data:
account_index = data['accounts'][0]['account_index']
self.logger.log(f"Lighter Account Index: {account_index}")
return int(account_index)
else:
self.logger.log(f"Account not found by {address}.")

def _validate_config(self) -> None:
"""Validate Lighter configuration."""
required_env_vars = ['API_KEY_PRIVATE_KEY', 'LIGHTER_ACCOUNT_INDEX', 'LIGHTER_API_KEY_INDEX']
missing_vars = [var for var in required_env_vars if not os.getenv(var)]
if missing_vars:
raise ValueError(f"Missing required environment variables: {missing_vars}")
required_vars = ['API_KEY_PRIVATE_KEY']
missing_required = [var for var in required_vars if not os.getenv(var)]

if missing_required:
raise ValueError(f"Missing required environment variables: {missing_required}")

# 检查 LIGHTER_ACCOUNT_INDEX 或 LIGHTER_ADDRESS 至少有一个
has_index = os.getenv('LIGHTER_ACCOUNT_INDEX')
has_address = os.getenv('LIGHTER_ADDRESS')
if not (has_index or has_address):
raise ValueError("Either LIGHTER_ACCOUNT_INDEX or LIGHTER_ADDRESS must be set in environment variables.")

# 检查 API Key Index(如果没有则使用默认值并提示)
if not os.getenv('LIGHTER_API_KEY_INDEX'):
self.logger.log("Warning: LIGHTER_API_KEY_INDEX not set, defaulting to 0.")


async def _get_market_config(self, ticker: str) -> Tuple[int, int, int]:
"""Get market configuration for a ticker using official SDK."""
Expand Down