Compare commits

..

11 Commits

Author SHA1 Message Date
alfred-mk
193c9c119a filter out the active voucher from swapToList 2025-07-21 13:01:06 +03:00
alfred-mk
36a3c59287 removed existing INCMP statement 2025-07-21 12:34:45 +03:00
alfred-mk
1234723e10 add navigation inputs for the swap_to list 2025-07-21 12:30:30 +03:00
alfred-mk
61f48abb7d return on navigation inputs to prevent data processing 2025-07-21 12:30:05 +03:00
alfred-mk
3e40a09d39 format the balance to 2 d.p. before displaying it 2025-07-21 12:22:05 +03:00
alfred-mk
7e90124199 filter out the active pool from the list of available pools 2025-07-21 11:50:50 +03:00
alfred-mk
e27905765c updated TestManageVouchers to match filtering of active vouchers 2025-07-21 11:28:05 +03:00
alfred-mk
4ce9baa379 return on navigation inputs to prevent data processing 2025-07-21 11:27:20 +03:00
alfred-mk
e47415cc22 remove the active voucher from the list of stored vouchers 2025-07-21 11:25:33 +03:00
alfred-mk
1f4d810e14 update the GetVoucherList comment description 2025-07-21 10:23:00 +03:00
35d9d13442 Merge pull request 'Move select pool menu to the home page' (#98) from move-pools-menu into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #98
2025-07-21 08:24:54 +02:00
5 changed files with 75 additions and 16 deletions

View File

@@ -9,6 +9,7 @@ import (
"git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store" "git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
"gopkg.in/leonelquinteros/gotext.v1" "gopkg.in/leonelquinteros/gotext.v1"
) )
@@ -36,9 +37,26 @@ func (h *MenuHandlers) GetPools(ctx context.Context, sym string, input []byte) (
return res, nil return res, nil
} }
data := store.ProcessPools(topPools) activePoolSymStr := ""
// Store all Pool data activePoolSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_POOL_SYM)
if err != nil {
activePoolSymStr = config.DefaultPoolSymbol()
} else {
activePoolSymStr = string(activePoolSym)
}
// Filter out the active pool from topPools
filteredPools := make([]dataserviceapi.PoolDetails, 0, len(topPools))
for _, p := range topPools {
if p.PoolSymbol != activePoolSymStr {
filteredPools = append(filteredPools, p)
}
}
data := store.ProcessPools(filteredPools)
// Store the filtered Pool data
dataMap := map[storedb.DataTyp]string{ dataMap := map[storedb.DataTyp]string{
storedb.DATA_POOL_NAMES: data.PoolNames, storedb.DATA_POOL_NAMES: data.PoolNames,
storedb.DATA_POOL_SYMBOLS: data.PoolSymbols, storedb.DATA_POOL_SYMBOLS: data.PoolSymbols,

View File

@@ -10,6 +10,7 @@ import (
"git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store" "git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
"gopkg.in/leonelquinteros/gotext.v1" "gopkg.in/leonelquinteros/gotext.v1"
) )
@@ -121,7 +122,16 @@ func (h *MenuHandlers) LoadSwapToList(ctx context.Context, sym string, input []b
return res, nil return res, nil
} }
data := store.ProcessVouchers(swapToList) // Filter out the active voucher from swapToList
filteredSwapToList := make([]dataserviceapi.TokenHoldings, 0, len(swapToList))
for _, s := range swapToList {
if s.TokenSymbol != string(activeSym) {
filteredSwapToList = append(filteredSwapToList, s)
}
}
// Store filtered swap to list data (excluding the current active voucher)
data := store.ProcessVouchers(filteredSwapToList)
logg.InfoCtxf(ctx, "ProcessVouchers", "data", data) logg.InfoCtxf(ctx, "ProcessVouchers", "data", data)
@@ -161,7 +171,7 @@ func (h *MenuHandlers) SwapMaxLimit(ctx context.Context, sym string, input []byt
res.FlagReset = append(res.FlagReset, flag_incorrect_voucher, flag_low_swap_amount) res.FlagReset = append(res.FlagReset, flag_incorrect_voucher, flag_low_swap_amount)
inputStr := string(input) inputStr := string(input)
if inputStr == "0" { if inputStr == "0" || inputStr == "99" || inputStr == "88" || inputStr == "98" {
return res, nil return res, nil
} }

View File

@@ -51,6 +51,9 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
res.FlagReset = append(res.FlagReset, flag_no_active_voucher) res.FlagReset = append(res.FlagReset, flag_no_active_voucher)
// add a variable to filter out the active voucher
activeSymStr := ""
// Check if user has an active voucher with proper error handling // Check if user has an active voucher with proper error handling
activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM)
if err != nil { if err != nil {
@@ -62,6 +65,8 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
defaultDec := firstVoucher.TokenDecimals defaultDec := firstVoucher.TokenDecimals
defaultAddr := firstVoucher.TokenAddress defaultAddr := firstVoucher.TokenAddress
activeSymStr = defaultSym
// Scale down the balance // Scale down the balance
scaledBalance := store.ScaleDownBalance(defaultBal, defaultDec) scaledBalance := store.ScaleDownBalance(defaultBal, defaultDec)
@@ -89,10 +94,8 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
return res, err return res, err
} }
} else { } else {
// Update active voucher balance
activeSymStr := string(activeSym)
// Find the matching voucher data // Find the matching voucher data
activeSymStr = string(activeSym)
var activeData *dataserviceapi.TokenHoldings var activeData *dataserviceapi.TokenHoldings
for _, voucher := range vouchersResp { for _, voucher := range vouchersResp {
if voucher.TokenSymbol == activeSymStr { if voucher.TokenSymbol == activeSymStr {
@@ -102,9 +105,10 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
} }
if activeData == nil { if activeData == nil {
logg.ErrorCtxf(ctx, "activeSym not found in vouchers, setting the first voucher as the default", "activeSym", activeSymStr) logg.InfoCtxf(ctx, "activeSym not found in vouchers, setting the first voucher as the default", "activeSym", activeSymStr)
firstVoucher := vouchersResp[0] firstVoucher := vouchersResp[0]
activeData = &firstVoucher activeData = &firstVoucher
activeSymStr = string(activeData.TokenSymbol)
} }
// Scale down the balance // Scale down the balance
@@ -120,8 +124,17 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
} }
} }
// Store all voucher data // Filter out the active voucher from vouchersResp
data := store.ProcessVouchers(vouchersResp) filteredVouchers := make([]dataserviceapi.TokenHoldings, 0, len(vouchersResp))
for _, v := range vouchersResp {
if v.TokenSymbol != activeSymStr {
filteredVouchers = append(filteredVouchers, v)
}
}
// Store all voucher data (excluding the current active voucher)
data := store.ProcessVouchers(filteredVouchers)
dataMap := map[storedb.DataTyp]string{ dataMap := map[storedb.DataTyp]string{
storedb.DATA_VOUCHER_SYMBOLS: data.Symbols, storedb.DATA_VOUCHER_SYMBOLS: data.Symbols,
storedb.DATA_VOUCHER_BALANCES: data.Balances, storedb.DATA_VOUCHER_BALANCES: data.Balances,
@@ -140,7 +153,7 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
return res, nil return res, nil
} }
// GetVoucherList fetches the list of vouchers and formats them. // GetVoucherList fetches the list of vouchers from the store and formats them.
func (h *MenuHandlers) GetVoucherList(ctx context.Context, sym string, input []byte) (resource.Result, error) { func (h *MenuHandlers) GetVoucherList(ctx context.Context, sym string, input []byte) (resource.Result, error) {
var res resource.Result var res resource.Result
sessionId, ok := ctx.Value("SessionId").(string) sessionId, ok := ctx.Value("SessionId").(string)
@@ -191,6 +204,10 @@ func (h *MenuHandlers) ViewVoucher(ctx context.Context, sym string, input []byte
flag_incorrect_voucher, _ := h.flagManager.GetFlag("flag_incorrect_voucher") flag_incorrect_voucher, _ := h.flagManager.GetFlag("flag_incorrect_voucher")
inputStr := string(input) inputStr := string(input)
if inputStr == "0" || inputStr == "99" || inputStr == "88" || inputStr == "98" {
res.FlagReset = append(res.FlagReset, flag_incorrect_voucher)
return res, nil
}
metadata, err := store.GetVoucherData(ctx, h.userdataStore, sessionId, inputStr) metadata, err := store.GetVoucherData(ctx, h.userdataStore, sessionId, inputStr)
if err != nil { if err != nil {
@@ -207,8 +224,16 @@ func (h *MenuHandlers) ViewVoucher(ctx context.Context, sym string, input []byte
return res, err return res, err
} }
// Format the balance to 2 decimal places
formattedAmount, err := store.TruncateDecimalString(metadata.Balance, 2)
if err != nil {
logg.ErrorCtxf(ctx, "failed to TruncateDecimalString on ViewVoucher", "error", err)
res.FlagSet = append(res.FlagSet, flag_incorrect_voucher)
return res, nil
}
res.FlagReset = append(res.FlagReset, flag_incorrect_voucher) res.FlagReset = append(res.FlagReset, flag_incorrect_voucher)
res.Content = l.Get("Symbol: %s\nBalance: %s", metadata.TokenSymbol, metadata.Balance) res.Content = l.Get("Symbol: %s\nBalance: %s", metadata.TokenSymbol, formattedAmount)
return res, nil return res, nil
} }

View File

@@ -73,8 +73,8 @@ func TestManageVouchers(t *testing.T) {
Balance: "100", Balance: "100",
}, },
}, },
expectedVoucherSymbols: []byte("1:TOKEN1"), expectedVoucherSymbols: []byte(""),
expectedUpdatedAddress: []byte("0x123"), expectedUpdatedAddress: []byte(""),
expectedResult: resource.Result{ expectedResult: resource.Result{
FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, FlagReset: []uint32{flag_api_error, flag_no_active_voucher},
}, },
@@ -86,7 +86,7 @@ func TestManageVouchers(t *testing.T) {
{TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200"}, {TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200"},
}, },
storedActiveVoucher: "SRF", storedActiveVoucher: "SRF",
expectedVoucherSymbols: []byte("1:SRF\n2:MILO"), expectedVoucherSymbols: []byte("1:MILO"),
expectedUpdatedAddress: []byte("0xd4c288865Ce"), expectedUpdatedAddress: []byte("0xd4c288865Ce"),
expectedResult: resource.Result{ expectedResult: resource.Result{
FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, FlagReset: []uint32{flag_api_error, flag_no_active_voucher},

View File

@@ -4,11 +4,17 @@ RELOAD swap_to_list
MAP swap_to_list MAP swap_to_list
CATCH missing_voucher flag_incorrect_voucher 1 CATCH missing_voucher flag_incorrect_voucher 1
MOUT back 0 MOUT back 0
MOUT quit 99
MNEXT next 88
MPREV prev 98
HALT HALT
INCMP > 88
INCMP < 98
INCMP _ 0
INCMP quit 99
LOAD swap_max_limit 64 LOAD swap_max_limit 64
RELOAD swap_max_limit RELOAD swap_max_limit
CATCH api_failure flag_api_call_error 1 CATCH api_failure flag_api_call_error 1
CATCH . flag_incorrect_voucher 1 CATCH . flag_incorrect_voucher 1
CATCH low_swap_amount flag_low_swap_amount 1 CATCH low_swap_amount flag_low_swap_amount 1
INCMP _ 0
INCMP swap_limit * INCMP swap_limit *