api가 빌더만 받을 수 있어서 구축 어려운 분들은 참고
현재 포인트 프로그램을 준비하고 있는 것으로 보이지만, 보상이 정확히 무엇으로 지급될지는 아직 공개되지 않았습니다.
별개로 주간 리워드 풀은 매주 $100,000 규모로 분배되고 있으며, 1주차에는 수수료 대비 2~3배 수준의 수익
주간 리워드 풀 기준으로 손실이 나기 전까지는 계속 돌려볼 생각
역할: 너는 시니어 파이썬 트레이딩봇 개발자다. Ondo Perps(app.ondoperps.xyz, 미국주식 perp DEX)에서 "주간 USDC 리워드 파밍용
포스트온리 마켓메이킹 봇"을 처음부터 완성해라. 표준 라이브러리+eth_account만 사용, 단일파일 ondo_mm.py + .env.
[API] base=https://api.ondoperps.xyz. 코딩 전 먼저 docs.ondoperps.xyz/llms.txt 를 fetch해 엔드포인트를 검증하고 따라라.
인증=SIWE(ERC-4361):
1) POST /v1/auth/erc-4361/login/get_challenge {walletAddress, chainId:"1"} → result.message, result.id
2) eth_account로 personal_sign(encode_defunct(text=message))
3) POST /v1/auth/erc-4361/login/complete_challenge {id, signature(0x접두 제거), source:"web"} → result.token(JWT)
4) 이후 모든 호출 헤더 Authorization: Bearer {token}, expirationSecs 만료시 재로그인. (신규지갑은 invite코드 필요할 수
있음→complete body에 추가)
1) POST /v1/auth/erc-4361/login/get_challenge {walletAddress, chainId:"1"} → result.message, result.id
2) eth_account로 personal_sign(encode_defunct(text=message))
3) POST /v1/auth/erc-4361/login/complete_challenge {id, signature(0x접두 제거), source:"web"} → result.token(JWT)
4) 이후 모든 호출 헤더 Authorization: Bearer {token}, expirationSecs 만료시 재로그인. (신규지갑은 invite코드 필요할 수 있음→complete body에 추가)
시세=GET /v1/perps/contracts (한 콜에 전 마켓 bid/ask/indexPrice), 호가=GET /v1/perps/depth?market=SYM.
주문=POST /v1/perps/orders {market, side:"buy"|"sell", type:"limit", price, size, postOnly:true, timeInForce:"GTC"} → result.orderId
취소=DELETE /v1/perps/orders?market=SYM. 잔고=GET /v1/perps/balance, 포지션=GET /v1/perps/positions (인증필요).
[전략] 마켓마다 fair=북 mid((bid+ask)/2) ±(SPREAD_BPS/2)에 양방 포스트온리 지정가. REFRESH_MS마다 cancel→재호가. 인벤토리 스큐: 포지션 쌓인 방향 호가를 줄여 중립 유지.
목적=체결량(=주간 USDC 리워드) 누적.
[안전장치] (1)DRY=1이면 실주문 대신 로그만, 기본값 DRY=1로 시작. (2)마켓당 MAX_POS_USD 초과시 reduce-only. (3)일일손실 MAX_LOSS_USD 도달시 전주문취소+정지. (4)postOnly로
테이커수수료 회피.
[.env] ONDO_PRIVATE_KEY=, ONDO_SYMBOLS=NVDA,TSLA, ONDO_QTY_USD=20, ONDO_SPREAD_BPS=10, ONDO_MAX_POS_USD=100, ONDO_MAX_LOSS_USD=15, ONDO_REFRESH_MS=5000, DRY=1
[함정-꼭 반영] (a)price/size는 부스러기 없는 깔끔한 소수문자열로 전송(틱 소수자리=bestbid 소수자리에서 도출, f"{round(x,d):.{d}f}"), float 그대로면 order_invalid_price
거부. (b)GET orders는 취소·체결분도 반환→레스팅은 status=="open"만 필터. (c)포지션 스키마 size=netQuantity, side=direction("long"/"short"). (d)주식perp은 24/5(장외
체결적음).
[산출물] ①ondo_mm.py(asyncio 루프, 에러핸들+자동재로그인+graceful shutdown) ②.env.example ③실행법 README. 먼저 llms.txt로 검증 후 코딩하고, DRY=1로 콘솔에 양방 호가가
찍히는지 확인하는 법까지 안내해라.
Ondo perp
