From d6338fa092ac180ff03b2f402219149d8bc2231d Mon Sep 17 00:00:00 2001 From: thuanle Date: Mon, 27 Apr 2026 04:53:54 +0700 Subject: [PATCH] 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 --- internal/configs/binance/asset.go | 4 ++++ internal/data/market/trading_pairs.go | 10 +++------- internal/data/market/trading_pairs_test.go | 12 ++++++------ internal/helper/binancex/resolver.go | 5 +---- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/internal/configs/binance/asset.go b/internal/configs/binance/asset.go index f7fa800..974151e 100644 --- a/internal/configs/binance/asset.go +++ b/internal/configs/binance/asset.go @@ -15,3 +15,7 @@ var QuotePriority = []string{"USDT", "USDC", "FDUSD"} var FutureToken2SpotTokenMap = map[string]string{ "LUNA2": "LUNA", } + +var SpotToken2FutureTokenMap = map[string]string{ + "LUNA": "LUNA2", +} diff --git a/internal/data/market/trading_pairs.go b/internal/data/market/trading_pairs.go index aa6aa3d..e19e31e 100644 --- a/internal/data/market/trading_pairs.go +++ b/internal/data/market/trading_pairs.go @@ -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 { diff --git a/internal/data/market/trading_pairs_test.go b/internal/data/market/trading_pairs_test.go index d70354f..0e7c94f 100644 --- a/internal/data/market/trading_pairs_test.go +++ b/internal/data/market/trading_pairs_test.go @@ -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) } diff --git a/internal/helper/binancex/resolver.go b/internal/helper/binancex/resolver.go index ee67ac6..4a08091 100644 --- a/internal/helper/binancex/resolver.go +++ b/internal/helper/binancex/resolver.go @@ -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} }