process all voucher lists as ordered, with stables at the top

This commit is contained in:
Alfred Kamanda 2026-02-12 19:22:38 +03:00
parent 80ea357e9c
commit 8b6f8b9a43
Signed by: Alfred-mk
GPG Key ID: E60B2165A97F4D41

View File

@ -148,7 +148,36 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
} }
} }
// Filter out the active voucher from vouchersResp // Build stable voucher priority (lower index = higher priority)
stablePriority := make(map[string]int)
stableAddresses := config.StableVoucherAddresses()
for i, addr := range stableAddresses {
stablePriority[strings.ToLower(addr)] = i
}
// Helper: order vouchers (stable first, priority-based)
orderVouchers := func(vouchers []dataserviceapi.TokenHoldings) []dataserviceapi.TokenHoldings {
stable := make([]dataserviceapi.TokenHoldings, 0)
nonStable := make([]dataserviceapi.TokenHoldings, 0)
for _, v := range vouchers {
if isStableVoucher(v.TokenAddress) {
stable = append(stable, v)
} else {
nonStable = append(nonStable, v)
}
}
sort.SliceStable(stable, func(i, j int) bool {
ai := stablePriority[strings.ToLower(stable[i].TokenAddress)]
aj := stablePriority[strings.ToLower(stable[j].TokenAddress)]
return ai < aj
})
return append(stable, nonStable...)
}
// Remove active voucher
filteredVouchers := make([]dataserviceapi.TokenHoldings, 0, len(vouchersResp)) filteredVouchers := make([]dataserviceapi.TokenHoldings, 0, len(vouchersResp))
for _, v := range vouchersResp { for _, v := range vouchersResp {
if v.TokenSymbol != activeSymStr { if v.TokenSymbol != activeSymStr {
@ -156,8 +185,11 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
} }
} }
// Store all voucher data (excluding the current active voucher) // Order remaining vouchers
data := store.ProcessVouchers(filteredVouchers) orderedFilteredVouchers := orderVouchers(filteredVouchers)
// Process & store
data := store.ProcessVouchers(orderedFilteredVouchers)
dataMap := map[storedb.DataTyp]string{ dataMap := map[storedb.DataTyp]string{
storedb.DATA_VOUCHER_SYMBOLS: data.Symbols, storedb.DATA_VOUCHER_SYMBOLS: data.Symbols,
@ -170,47 +202,27 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
for key, value := range dataMap { for key, value := range dataMap {
if err := userStore.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil { if err := userStore.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil {
logg.ErrorCtxf(ctx, "Failed to write data entry for sessionId: %s", sessionId, "key", key, "error", err) logg.ErrorCtxf(ctx, "Failed to write data entry for sessionId: %s", sessionId, "key", key, "error", err)
continue
} }
} }
// Get stable voucher priority order (lower index = higher priority) // Order all vouchers
stablePriority := make(map[string]int) orderedVouchers := orderVouchers(vouchersResp)
stableAddresses := config.StableVoucherAddresses()
for i, addr := range stableAddresses { // Stable voucher presence flag (based on full list)
stablePriority[strings.ToLower(addr)] = i hasStable := false
} for _, v := range orderedVouchers {
// Split vouchers into stable and non-stable
stableVouchers := make([]dataserviceapi.TokenHoldings, 0)
nonStableVouchers := make([]dataserviceapi.TokenHoldings, 0)
for _, v := range vouchersResp {
if isStableVoucher(v.TokenAddress) { if isStableVoucher(v.TokenAddress) {
stableVouchers = append(stableVouchers, v) hasStable = true
} else { break
nonStableVouchers = append(nonStableVouchers, v)
} }
} }
// No stable vouchers at all if !hasStable {
if len(stableVouchers) == 0 {
res.FlagSet = append(res.FlagSet, flag_no_stable_vouchers) res.FlagSet = append(res.FlagSet, flag_no_stable_vouchers)
} else { } else {
res.FlagReset = append(res.FlagReset, flag_no_stable_vouchers) res.FlagReset = append(res.FlagReset, flag_no_stable_vouchers)
} }
// Sort stable vouchers by configured priority
sort.SliceStable(stableVouchers, func(i, j int) bool {
ai := stablePriority[strings.ToLower(stableVouchers[i].TokenAddress)]
aj := stablePriority[strings.ToLower(stableVouchers[j].TokenAddress)]
return ai < aj
})
// Final ordered list: stable first, then others
orderedVouchers := append(stableVouchers, nonStableVouchers...)
// Process ALL vouchers (stable first) // Process ALL vouchers (stable first)
orderedVoucherData := store.ProcessVouchers(orderedVouchers) orderedVoucherData := store.ProcessVouchers(orderedVouchers)