fix: preserve futures token identity in canonical cache

Keep futureToken2Symbol keyed by raw futures token and use explicit spot-to-future alias mapping during resolver fallback lookups.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-27 04:53:54 +07:00
parent 711721c1ee
commit d6338fa092
4 changed files with 14 additions and 17 deletions
+4
View File
@@ -15,3 +15,7 @@ var QuotePriority = []string{"USDT", "USDC", "FDUSD"}
var FutureToken2SpotTokenMap = map[string]string{
"LUNA2": "LUNA",
}
var SpotToken2FutureTokenMap = map[string]string{
"LUNA": "LUNA2",
}
+3 -7
View File
@@ -69,7 +69,7 @@ func (ms *MarketData) refreshFuturePairCache() error {
if token == "" {
continue
}
token = normalizeFutureToken(token)
token = futureCacheTokenKey(token)
futureTokenCandidates[token] = append(futureTokenCandidates[token], s.Symbol)
}
@@ -168,12 +168,8 @@ func selectCanonicalSymbolByQuotePriority(token string, candidates []string) str
return normalized[0]
}
func normalizeFutureToken(token string) string {
token = strings.ToUpper(token)
if mapped, ok := binance.FutureToken2SpotTokenMap[token]; ok {
return strings.ToUpper(mapped)
}
return token
func futureCacheTokenKey(token string) string {
return strings.ToUpper(token)
}
func (ms *MarketData) IsSpotPair(symbol string) bool {
+6 -6
View File
@@ -26,15 +26,15 @@ func TestSelectCanonicalSymbolByQuotePriority_NoPreferredQuote(t *testing.T) {
}
}
func TestNormalizeFutureToken_AppliesOverride(t *testing.T) {
got := normalizeFutureToken("LUNA2")
if got != "LUNA" {
t.Fatalf("expected LUNA, got %q", got)
func TestFutureCacheTokenKey_PreservesRawFutureToken(t *testing.T) {
got := futureCacheTokenKey("LUNA2")
if got != "LUNA2" {
t.Fatalf("expected LUNA2, got %q", got)
}
}
func TestNormalizeFutureToken_NoOverride(t *testing.T) {
got := normalizeFutureToken("PEPE")
func TestFutureCacheTokenKey_NoOverride(t *testing.T) {
got := futureCacheTokenKey("PEPE")
if got != "PEPE" {
t.Fatalf("expected PEPE, got %q", got)
}
+1 -4
View File
@@ -18,10 +18,7 @@ func Token2FutureSymbols(token string) []string {
return []string{mapped}
}
for futureToken, spotToken := range binance.FutureToken2SpotTokenMap {
if strings.ToUpper(spotToken) != token {
continue
}
if futureToken, ok := binance.SpotToken2FutureTokenMap[token]; ok {
if mapped, ok := data.Market.GetFutureSymbolByToken(strings.ToUpper(futureToken)); ok {
return []string{mapped}
}