Bug reports · 재현 · 수정

버그 리포트

개발·QA 중에 발견한 재현 가능한 버그를 남깁니다. 함정·제품 결정은 주요확인사항, 정식 추적은 구글시트 이슈대장을 봅니다.

역할 · 재현·원인·우회·수정 결과를 app/bug-reports/data.ts에 남깁니다. 함정·결정은 주요확인사항, 정식 추적은 이슈대장(시트).

리포트 목록 (15)

주요확인사항 →
b14002026-08-17차트 · 캔들

[버그] SPEPE 1h 차트에 mid 틱이 섞여 긴 빨간 봉처럼 보인다

8/15 오후 SPEPE/USDT 1시간봉이 바닥 0.01로 길게 내려가 보인다. 백필 소실이 아니라 호가 mid가 OHLC low를 끌어내린 것.

완화됨

재현 · 원인

Y축 0.01은 실제 low≈0.01112133996의 표시. 같은 시각 1분봉에 volume=0·가격 고정(0.01112133996) 봉이 다수 — 체결이 아니라 ingest upsertAllResolutions mid 틱. 체결가는 ~0.0113대. 1h마다 동일 low가 반복.

우회

1m·체결 테이프로 보면 정상. fills만으로 candle_bars를 다시 쌓으면 mid 오염 봉은 지울 수 있다.

수정 · 후속

v0.1.17 배포 + SPEPE --candles-only 재구성 완료(upsert 6917). 체결 없는 mid-only 봉은 남을 수 있음.

b13002026-08-14지갑 · Phantom

[버그] 아이폰 Phantom이 호가와 동떨어진 지정가를 Request blocked로 막는다

지정가 0.987처럼 호가(약 0.0098)와 멀면 Request blocked. 매수가 + 비슷한 수량이면 같은 폰에서 통과.

해결

재현 · 원인

Zenith 크래시가 아니라 Phantom 시뮬레이션 경고. 코드 변경 없이 재현·통과가 갈렸다. signAndSend 우선 변경은 넣었다가 철회.

우회

매수가(또는 호가 근처)와 비슷한 수량으로 낸다.

수정 · 후속

전송 경로 변경 없음.

b12002026-08-14주문 · UI

[버그] 지정가가 즉시 체결돼도 토스트는 ‘제출되었습니다’만 보여 호가에 안 뜬 줄 안다

아이폰에서 DOGEK 지정가 매수 후 제출됨 문구가 나왔는데 호가창에 주문이 없다. 실제로는 더 싼 매도와 바로 체결됐다.

해결

재현 · 원인

재현: 최우선 매도보다 높은 지정가로 매수. 기대: 호가 대기 또는 ‘체결됨’. 실제: 온체인 성공 → 제출됨 토스트, 호가에는 없음. 체결 기록 19:09:36 qty 0.0011 price 0.009801.

우회

하단 Trade History·호가의 체결 탭에서 같은 수량 확인.

수정 · 후속

resolvePlaceOutcome: 체결 인덱서·미체결 REST를 짧게 폴링. 즉시 체결이면 toast.orderFilled.

b11002026-08-14모바일 · 주문

[버그] 아이폰 X에서 매수호가·매도호가가 두 줄, 지정가 입력이 잘림

375폭에서 주문칸이 ~190px라 프리셋 ‘매수호가’가 줄바꿈되고, ±와 USDC 때문에 지정가 숫자가 잘린다.

해결

재현 · 원인

좌우 주문+호가 그리드. 프리셋 3칸·필드 스테퍼 overflow hidden. iOS 입력 16px이 가로를 더 먹는다. 화면 전체 축소는 쓰지 않기로 함.

우회

가로로 돌려 보거나 PC 폭에서 확인.

수정 · 후속

짧은 프리셋, 단위를 라벨로, ± 28px, ≤390에서 주문칸 확대.

b10002026-08-14모바일 · 마켓

[버그] 모바일 코인 선택 모달이 열리면 검색창 포커스로 키보드가 바로 올라온다

코인(마켓) 선택 모달을 열면 검색 입력에 autoFocus가 걸려 가상 키보드가 화면을 가린다.

해결

재현 · 원인

SearchMarketsModal 검색 input에 autoFocus가 고정. PC는 바로 타이핑하려고 필요하지만, 모바일은 목록을 먼저 보는데 키보드가 먼저 뜬다.

우회

검색창 바깥을 탭하면 키보드가 내려간다.

수정 · 후속

MobileTradeShell에서 autoFocusSearch={false}. PC 셸은 기존처럼 자동 포커스.

b09002026-08-14웹 · Safari

[버그] iOS 14.8 사파리에서 Application error (dev.zenith-dex.xyz)

iOS 14.8.1 사파리로 dev.zenith-dex.xyz를 열면 client-side exception만 보이고 트레이드 UI가 안 뜬다.

완화됨

재현 · 원인

Next 15 기본 타깃이 Safari 16.4+. 배포 청크(next-intl)에 class static { } 가 남아 iOS 14는 파싱 단계에서 SyntaxError. matchMedia addEventListener는 iOS 14에서 해당 없음.

우회

이 폰에서 iOS를 더 올릴 수 있으면 올린다. 아니면 배포 후 browserslist safari 14로 맞춘 빌드를 연다.

수정 · 후속

apps/web browserslist safari 14 · ios 14. next-intl/use-intl transpile. 배포 후 재확인.

b08002026-08-14모바일 · 레이아웃

[버그] 모바일 셸 overflow hidden으로 페이지 스크롤이 죽음

호가 50단 대응으로 셸을 100dvh overflow hidden 잠그면 미체결이 많아도 화면이 안 움직인다. 호가 아래끝=매수 버튼도 그대로 안 맞는다.

해결

재현 · 원인

PC 호가 1fr은 확정 높이가 있어야 한다. 모바일에 그대로 두고 셸만 잠그면 스크롤만 죽고 50단 min-content는 그리드 행을 계속 민다.

우회

PC 너비로 보면 됨. 모바일은 새로고침 후 주문 폼 높이 대비 호가를 본다.

수정 · 후속

셸 overflow 잠금 원복. `.m-book-slot` overflow hidden + 그리드 min-content로 주문 폼 높이에만 맞춤. 2026-08-14.

b07002026-08-14모바일 · 호가

[버그] 모바일 호가 50단이 페이지를 세로로 끝없이 늘림

갤럭시 등 모바일에서 주문창 아래가 텅 비고, 호가·미체결이 화면 밖으로 한없이 길어진다.

해결

재현 · 원인

호가를 각 50단+칸 스크롤로 바꾼 뒤 m-book이 높이 제한 없이 50줄을 다 펼침. 부모는 min-height:100dvh라 페이지가 같이 커짐. 1fr 스크롤이 먹히려면 칸에 고정 높이가 필요.

우회

PC(1101+)는 호가 패널 높이가 정해져 있어 안 보임.

수정 · 후속

100dvh 잠금은 스크롤을 죽여 b0800으로 이어짐. `.m-book-slot`이 주문 폼 높이에 stretch. 2026-08-14.

b06002026-08-14미체결 · UI

[버그] 미체결 취소 성공 문구가 ‘주문 제출됨’으로 나옴

매도/매수 취소를 해도 화면에 ‘지정가 주문이 제출되었습니다’가 떠서 취소됐는지 알기 어렵다.

해결

재현 · 원인

cancelStatus submitted가 order.submitted 번역을 재사용. 미체결 탭 아래 작은 회색 글씨만 있고, 호가 SSE가 늦으면 행도 잠깐 남음.

우회

미체결 목록에서 해당 줄이 사라졌는지, 탭 숫자가 줄었는지 본다.

수정 · 후속

취소 전용 문구 + 오른쪽 하단 TradeToasts. 2026-08-14.

b05002026-08-14호가 · UI

[버그] 호가창 같은 가격·수량 행에서 React key 중복

같은 가격·수량의 매도(예: 0.01 × 1)가 두 줄이면 콘솔에 Encountered two children with the same key 가 뜬다.

해결

재현 · 원인

key를 a-{price}-{qty}만 써서 주문이 겹치면 충돌. L2는 가격별로 합치지 않고 주문 단위라 같은 가격·수량이 나올 수 있다.

우회

표시는 되지만 행이 깜빡이거나 빠질 수 있음.

수정 · 후속

key에 행 번호·트레이더를 넣음. TradeShell · MobileTradeShell.

b04002026-08-14스크립트 · Mongo

[버그] backfill-fills $set+$setOnInsert marketId 충돌 (Mongo code 40)

npx tsx scripts/backfill-fills.ts --market sol-usdc 가 Updating the path 'marketId' would create a conflict 로 바로 죽는다.

해결

재현 · 원인

fill 문서에 listedMarketLabels를 넣고 $setOnInsert: fill 한 뒤, 같은 키를 $set에도 넣음. Mongo는 upsert에서 한 경로를 두 operator에 못 씀. dogek도 동일하나 이미 스킵되면 안 보일 수 있음. 수정: 라벨은 $set만, 나머지는 $setOnInsert.

우회

수정된 스크립트로 다시 실행. --candles-only는 fills upsert를 안 해서 이 에러 없음.

수정 · 후속

scripts/backfill-fills.ts updateOne 분리. 2026-08-14.

b03002026-08-06호가 · 표시

[버그] 호가창 금액이 소액 주문에서 0.000으로 표시

저가·소량 매수(예: 0.0099 × 0.0036)의 금액(price×qty)이 0.000으로 보인다. 실제 주문은 정상.

해결

재현 · 원인

원인: formatNotional이 1 미만을 항상 toFixed(3)로 표시해 0.000035…가 0.000으로 반올림. 수정: 0.001 미만은 소수 6자리.

우회

가격·수량 열로 확인. 금액 열만 표시 문제.

수정 · 후속

Utils.ts formatNotional — ≥1:1자리 · ≥0.001:3자리 · 미만:6자리.

b01002026-08-06지갑 · Phantom · 모바일

[버그] 모바일 첫 Phantom 연결 — UI만 붙고 주문 시 ‘계정 없음’

첫 Connect는 승인 시트 없이 ‘연결됨’처럼 보이고, 주문하면 ‘연결된 Phantom Solana 계정이 없습니다.’ 해지 후 재연결해야 Phantom ‘연결’ 시트가 뜨고 그제야 서명·주문이 된다.

완화됨

재현 · 원인

재현: 모바일 Phantom 인앱에서 지갑 연결 → 매수 시도. 기대: 첫 연결부터 승인 시트 후 주문 가능. 원인: connectPhantomSolana가 Wallet Standard accounts[0]이 있으면 connect()를 건너뛰고 주소만 저장. 모바일은 Standard+주입 공존으로 서명 시 accounts 비어 실패. 수정(v0.1.6): 명시적 연결은 항상 connect(); 모바일 주입 connect 우선; 서명 주입 세션 우선·폴백.

우회

지갑 해지 → 다시 연결 → Phantom 시트에서 ‘연결’ 후 주문.

수정 · 후속

phantomSolana.ts + Railway web v0.1.6(2026-08-06). 모바일 첫 연결·주문 재확인.

b02002026-08-06미체결 · 모바일

[버그] 모바일 미체결 — 방금 주문이 목록 상단에 안 보임

지정가 제출 성공 후 호가에는 반영됐는데, 미체결 탭은 먼 가격이 위에 있어 스크롤 전까지 ‘안 들어갔다’고 느껴진다.

완화됨

재현 · 원인

재현: 지정가 주문 직후 미체결 탭 확인. 기대: 방금 주문이 상단. 원인: 체인/wrapper 순서가 가격·시퀀스 기준이라 UI 상단이 구주문일 수 있음. 카운트는 맞음.

우회

미체결 목록을 아래로 스크롤하거나, 호가에서 같은 가격·수량 확인.

수정 · 후속

openOrders를 clientOrderId 내림차순(최신 위)으로 정렬(2026-08-06).

b03002026-08-06헤더 · 모바일

[버그] 모바일 헤더 Online — 제거했는데 다시 보임

Online은 PC만 표시하기로 했는데 모바일 헤더에 다시 붙어 있었다.

해결

재현 · 원인

재현: 모바일 폭에서 트레이드 UI. 기대: Online 없음. 원인: 제거가 로컬만 되고 커밋·배포에 안 들어감(함정은 c0500). Phantom 작업이 원복한 것이 아님.

우회

없음 — 코드에서 online-pill 제거 후 배포.

수정 · 후속

2026-08-06 MobileTradeShell에서 online-pill·onlineCount 재제거.