binancex.IsToken hiện chỉ kiểm tra token có futures pair qua Token2FutureSymbols, sau đó kiểm tra Alpha token. Hàm chưa kiểm tra spot pair/token, nên các token chỉ có spot market sẽ không được nhận diện là token hợp lệ.
Evidence
internal/helper/binancex/symbol.go:32: IsToken trả true nếu len(Token2FutureSymbols(s)) > 0, sau đó mới check data.Market.IsAlphaToken(s).
internal/services/tele/commands/chat.go:19: chat text chỉ đi vào OnTokenInfo khi binancex.IsToken(text) trả true.
internal/services/tele/commands/token.go:90: sau khi đã vào handler, collectRichTokenData có xử lý spot qua Token2SpotSymbols.
internal/helper/binancex/resolver.go:63: Token2SpotSymbols đã có fallback spot-only dạng TOKENUSDT và gọi data.Market.IsSpotPair.
internal/data/market/trading_pairs.go:29: hệ thống đã cache danh sách spot pairs.
internal/data/market/trading_pairs.go:36: hệ thống đã cache danh sách futures pairs.
internal/data/imarket.go:19: interface đã expose IsSpotPair và IsFuturesPair.
Current Behavior
Nếu user gửi token spot-only trong chat, ví dụ token có ABCUSDT trên spot nhưng không có futures pair:
OnChatHandler gọi binancex.IsToken("abc").
Token2FutureSymbols("abc") trả empty.
IsAlphaToken("ABC") trả false.
IsToken trả false.
Chat message bị ignore, dù spot data có thể lấy được nếu vào OnTokenInfo.
Expected Behavior
IsToken nên nhận diện token hợp lệ nếu token có ít nhất một nguồn dữ liệu sau:
spot pair/token
futures pair/token
Alpha token
Root Cause
IsToken đang dùng futures availability làm proxy cho token validity. Điều này không đúng với spot-only tokens, trong khi codebase đã có cache pair/token và helper Token2SpotSymbols để kiểm tra spot.
Suggested Direction
Cập nhật predicate để kiểm tra cả spot và futures trước Alpha, ví dụ theo logic:
len(Token2FutureSymbols(s)) > 0, hoặc
len(Token2SpotSymbols(s)) > 0, hoặc
data.Market.IsAlphaToken(strings.ToUpper(s))
Cần lưu ý tránh gọi trùng/đệ quy không cần thiết nếu dùng Token2SpotSymbols, vì hàm này hiện gọi Token2FutureSymbols trước rồi mới fallback spot-only.
## Summary
`binancex.IsToken` hiện chỉ kiểm tra token có futures pair qua `Token2FutureSymbols`, sau đó kiểm tra Alpha token. Hàm chưa kiểm tra spot pair/token, nên các token chỉ có spot market sẽ không được nhận diện là token hợp lệ.
## Evidence
- `internal/helper/binancex/symbol.go:32`: `IsToken` trả `true` nếu `len(Token2FutureSymbols(s)) > 0`, sau đó mới check `data.Market.IsAlphaToken(s)`.
- `internal/services/tele/commands/chat.go:19`: chat text chỉ đi vào `OnTokenInfo` khi `binancex.IsToken(text)` trả `true`.
- `internal/services/tele/commands/token.go:90`: sau khi đã vào handler, `collectRichTokenData` có xử lý spot qua `Token2SpotSymbols`.
- `internal/helper/binancex/resolver.go:63`: `Token2SpotSymbols` đã có fallback spot-only dạng `TOKENUSDT` và gọi `data.Market.IsSpotPair`.
- `internal/data/market/trading_pairs.go:29`: hệ thống đã cache danh sách spot pairs.
- `internal/data/market/trading_pairs.go:36`: hệ thống đã cache danh sách futures pairs.
- `internal/data/imarket.go:19`: interface đã expose `IsSpotPair` và `IsFuturesPair`.
## Current Behavior
Nếu user gửi token spot-only trong chat, ví dụ token có `ABCUSDT` trên spot nhưng không có futures pair:
1. `OnChatHandler` gọi `binancex.IsToken("abc")`.
2. `Token2FutureSymbols("abc")` trả empty.
3. `IsAlphaToken("ABC")` trả false.
4. `IsToken` trả false.
5. Chat message bị ignore, dù spot data có thể lấy được nếu vào `OnTokenInfo`.
## Expected Behavior
`IsToken` nên nhận diện token hợp lệ nếu token có ít nhất một nguồn dữ liệu sau:
- spot pair/token
- futures pair/token
- Alpha token
## Root Cause
`IsToken` đang dùng futures availability làm proxy cho token validity. Điều này không đúng với spot-only tokens, trong khi codebase đã có cache pair/token và helper `Token2SpotSymbols` để kiểm tra spot.
## Suggested Direction
Cập nhật predicate để kiểm tra cả spot và futures trước Alpha, ví dụ theo logic:
- `len(Token2FutureSymbols(s)) > 0`, hoặc
- `len(Token2SpotSymbols(s)) > 0`, hoặc
- `data.Market.IsAlphaToken(strings.ToUpper(s))`
Cần lưu ý tránh gọi trùng/đệ quy không cần thiết nếu dùng `Token2SpotSymbols`, vì hàm này hiện gọi `Token2FutureSymbols` trước rồi mới fallback spot-only.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
binancex.IsTokenhiện chỉ kiểm tra token có futures pair quaToken2FutureSymbols, sau đó kiểm tra Alpha token. Hàm chưa kiểm tra spot pair/token, nên các token chỉ có spot market sẽ không được nhận diện là token hợp lệ.Evidence
internal/helper/binancex/symbol.go:32:IsTokentrảtruenếulen(Token2FutureSymbols(s)) > 0, sau đó mới checkdata.Market.IsAlphaToken(s).internal/services/tele/commands/chat.go:19: chat text chỉ đi vàoOnTokenInfokhibinancex.IsToken(text)trảtrue.internal/services/tele/commands/token.go:90: sau khi đã vào handler,collectRichTokenDatacó xử lý spot quaToken2SpotSymbols.internal/helper/binancex/resolver.go:63:Token2SpotSymbolsđã có fallback spot-only dạngTOKENUSDTvà gọidata.Market.IsSpotPair.internal/data/market/trading_pairs.go:29: hệ thống đã cache danh sách spot pairs.internal/data/market/trading_pairs.go:36: hệ thống đã cache danh sách futures pairs.internal/data/imarket.go:19: interface đã exposeIsSpotPairvàIsFuturesPair.Current Behavior
Nếu user gửi token spot-only trong chat, ví dụ token có
ABCUSDTtrên spot nhưng không có futures pair:OnChatHandlergọibinancex.IsToken("abc").Token2FutureSymbols("abc")trả empty.IsAlphaToken("ABC")trả false.IsTokentrả false.OnTokenInfo.Expected Behavior
IsTokennên nhận diện token hợp lệ nếu token có ít nhất một nguồn dữ liệu sau:Root Cause
IsTokenđang dùng futures availability làm proxy cho token validity. Điều này không đúng với spot-only tokens, trong khi codebase đã có cache pair/token và helperToken2SpotSymbolsđể kiểm tra spot.Suggested Direction
Cập nhật predicate để kiểm tra cả spot và futures trước Alpha, ví dụ theo logic:
len(Token2FutureSymbols(s)) > 0, hoặclen(Token2SpotSymbols(s)) > 0, hoặcdata.Market.IsAlphaToken(strings.ToUpper(s))Cần lưu ý tránh gọi trùng/đệ quy không cần thiết nếu dùng
Token2SpotSymbols, vì hàm này hiện gọiToken2FutureSymbolstrước rồi mới fallback spot-only.