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:
@@ -15,3 +15,7 @@ var QuotePriority = []string{"USDT", "USDC", "FDUSD"}
|
||||
var FutureToken2SpotTokenMap = map[string]string{
|
||||
"LUNA2": "LUNA",
|
||||
}
|
||||
|
||||
var SpotToken2FutureTokenMap = map[string]string{
|
||||
"LUNA": "LUNA2",
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user