테넷이니까 페이퍼 트레이딩 돌리기 딱일듯?
⏺ Bulk Trade 거래소 추가 프롬프트
multi-perp-dex 봇에 Bulk Trade (https://bulk.trade) 테스트넷을 추가해줘.
#핵심 정보
- API docs: https://docs.bulk.trade/api-reference/introduction
- API base: https://exchange-api.bulk.trade/api/v1
- 서명: Ed25519, `pip install bulk-keychain` (Python 3.11 필요, 3.14 빌드 안됨)
- 심볼 포맷: BTC-USD, ETH-USD, SOL-USD
- 최소 notional: $50
#구현 방식
bulk-keychain이 Python 3.14에서 안 되니까 nado/hotstuff처럼 격리 venv + subprocess bridge로 구현해.
1. bulk_venv 생성 (Python 3.11) → bulk-keychain, aiohttp, pyyaml 설치
2. strategies/exchange_bridge.py에 BulkBridge 클래스 추가
3. mpdex/factory.py에 bulk 등록 (_load, create_exchange, SYMBOL_FORMATS)
4. strategies/multi_runner.py ISOLATED_EXCHANGES에 "bulk": "bulk_venv" 추가
5. config.yaml에 bulk 설정 추가 (isolated: true, venv_path: bulk_venv)
#API 엔드포인트
- GET /exchangeInfo → 마켓 목록
- GET /ticker/{symbol} → markPrice
- POST /account {"type":"fullAccount","user":"pubkey"} → 잔고(margin.totalBalance),
포지션(positions[].price/size/unrealizedPnl)
- POST /account {"type":"openOrders","user":"pubkey"} → 미체결
- POST /order → 주문/취소/레버리지 (bulk-keychain으로 서명)
#서명 패턴 (bulk-keychain)
python
from bulk_keychain import Keypair, Signer
kp = Keypair.from_base58("시크릿키") # 또는 Keypair.from_bytes(hex_bytes)
signer = Signer(kp)
signed = signer.sign({"type":"order","symbol":"BTC-USD","is_buy":True,"price":100000.0,"size":0.001,"reduce_only":Fals
e,"order_type":{"type":"limit","tif":"GTC"}})
# 시장가는 tif:"IOC" + 슬리피지 가격
# 취소: signer.sign({"type":"cancel_all","symbols":["BTC-USD"]})
# 레버리지: signer.sign_user_settings([("ETH-USD",15.0)]) → actions의 m을 list→dict 변환 필요
# 파우셋: signer.sign_faucet()
config.yaml
exchanges:
bulk:
enabled: true
isolated: true
keys:
private_key: 'base58_시크릿키'
venv_path: bulk_venv
limit_order:
exchange_flags:
bulk: true
키는 Phantom 등 Solana 지갑에서 export한 base58 시크릿키 사용. 0x EVM키도 되지만 사이트 지갑과 pubkey가 달라짐.
