Compare commits
4 Commits
pool-debug
...
normalize-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
984688998b
|
||
|
|
1bbb51d352
|
||
|
|
e3aad7153d
|
||
|
|
7c31a8920f
|
2
go.mod
2
go.mod
@@ -5,7 +5,7 @@ go 1.23.4
|
|||||||
require (
|
require (
|
||||||
git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66
|
git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66
|
||||||
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e
|
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251022084613-532547899f63
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251006090242-8d4fbb9c2ef4
|
||||||
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306
|
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306
|
||||||
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694
|
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694
|
||||||
github.com/alecthomas/assert/v2 v2.2.2
|
github.com/alecthomas/assert/v2 v2.2.2
|
||||||
|
|||||||
8
go.sum
8
go.sum
@@ -20,10 +20,10 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630213606-
|
|||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630213606-12940bb5f284/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630213606-12940bb5f284/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a h1:KuhJ/WY4RCGmrXUA680ciaponM4vM5zBOJfnCpUo2fc=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a h1:KuhJ/WY4RCGmrXUA680ciaponM4vM5zBOJfnCpUo2fc=
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5 h1:bQglHVxMilciZ9M2PGuLgA+Wkvqo8OqQh6TFYwjtuSE=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251006084325-61410b2b294e h1:RlKXekj4O0+cLWLitY+aLBo3WVwUslCkrTbU2q/FZYQ=
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251006084325-61410b2b294e/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251022084613-532547899f63 h1:yznaUXeAy+qiZb2nCxosYXE5HyCPpynIoplEuYV/zQM=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251006090242-8d4fbb9c2ef4 h1:ONW+0eXvkuBojaKaqg8WZBYSW2ZXdIE9A1jaPTUI7Y8=
|
||||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251022084613-532547899f63/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251006090242-8d4fbb9c2ef4/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8=
|
||||||
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4=
|
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4=
|
||||||
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo=
|
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo=
|
||||||
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E=
|
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E=
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package application
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -12,7 +11,6 @@ import (
|
|||||||
"git.grassecon.net/grassrootseconomics/common/identity"
|
"git.grassecon.net/grassrootseconomics/common/identity"
|
||||||
"git.grassecon.net/grassrootseconomics/common/phone"
|
"git.grassecon.net/grassrootseconomics/common/phone"
|
||||||
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
|
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
|
||||||
"git.grassecon.net/grassrootseconomics/sarafu-api/remote/http"
|
|
||||||
"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"
|
||||||
@@ -359,20 +357,9 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu
|
|||||||
// Call TokenTransfer
|
// Call TokenTransfer
|
||||||
r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress)
|
r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var apiErr *http.APIError
|
|
||||||
if errors.As(err, &apiErr) {
|
|
||||||
switch apiErr.Code {
|
|
||||||
case "E10":
|
|
||||||
res.Content = l.Get("Only USD vouchers are allowed to mpesa.sarafu.eth.")
|
|
||||||
default:
|
|
||||||
res.Content = l.Get("Your request failed. Please try again later.")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res.Content = l.Get("An unexpected error occurred. Please try again later.")
|
|
||||||
}
|
|
||||||
|
|
||||||
flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error")
|
flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error")
|
||||||
res.FlagSet = append(res.FlagSet, flag_api_error)
|
res.FlagSet = append(res.FlagSet, flag_api_error)
|
||||||
|
res.Content = l.Get("Your request failed. Please try again later.")
|
||||||
logg.ErrorCtxf(ctx, "failed on TokenTransfer", "error", err)
|
logg.ErrorCtxf(ctx, "failed on TokenTransfer", "error", err)
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -289,11 +289,8 @@ func (h *MenuHandlers) GetVoucherDetails(ctx context.Context, sym string, input
|
|||||||
}
|
}
|
||||||
res.FlagReset = append(res.FlagReset, flag_api_error)
|
res.FlagReset = append(res.FlagReset, flag_api_error)
|
||||||
|
|
||||||
// sanitize invalid characters
|
|
||||||
symbol := strings.ReplaceAll(voucherData.TokenSymbol, "USD₮", "USDT")
|
|
||||||
|
|
||||||
res.Content = fmt.Sprintf(
|
res.Content = fmt.Sprintf(
|
||||||
"Name: %s\nSymbol: %s\nProduct: %s\nLocation: %s", voucherData.TokenName, symbol, voucherData.TokenCommodity, voucherData.TokenLocation,
|
"Name: %s\nSymbol: %s\nProduct: %s\nLocation: %s", voucherData.TokenName, voucherData.TokenSymbol, voucherData.TokenCommodity, voucherData.TokenLocation,
|
||||||
)
|
)
|
||||||
|
|
||||||
return res, nil
|
return res, nil
|
||||||
|
|||||||
@@ -42,6 +42,3 @@ msgstr "%s haipo kwenye %s. Tafadhali badilisha sarafu yako na ujaribu tena."
|
|||||||
|
|
||||||
msgid "Name: %s\nSymbol: %s"
|
msgid "Name: %s\nSymbol: %s"
|
||||||
msgstr "Jina: %s\nSarafu: %s"
|
msgstr "Jina: %s\nSarafu: %s"
|
||||||
|
|
||||||
msgid "Only USD vouchers are allowed to mpesa.sarafu.eth."
|
|
||||||
msgstr "Ni sarafu za USD pekee zinazoruhusiwa kwa mpesa.sarafu.eth."
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
CATCH no_voucher flag_no_active_voucher 1
|
CATCH no_voucher flag_no_active_voucher 1
|
||||||
LOAD get_pools 0
|
LOAD get_pools 0
|
||||||
RELOAD get_pools
|
|
||||||
MAP get_pools
|
MAP get_pools
|
||||||
LOAD get_default_pool 20
|
LOAD get_default_pool 20
|
||||||
RELOAD get_default_pool
|
RELOAD get_default_pool
|
||||||
|
|||||||
@@ -15,11 +15,6 @@ var (
|
|||||||
logg = logging.NewVanilla().WithDomain("vouchers").WithContextKey("SessionId")
|
logg = logging.NewVanilla().WithDomain("vouchers").WithContextKey("SessionId")
|
||||||
)
|
)
|
||||||
|
|
||||||
// symbolReplacements holds mappings of invalid symbols → valid ones
|
|
||||||
var symbolReplacements = map[string]string{
|
|
||||||
"USD₮": "USDT",
|
|
||||||
}
|
|
||||||
|
|
||||||
// VoucherMetadata helps organize data fields
|
// VoucherMetadata helps organize data fields
|
||||||
type VoucherMetadata struct {
|
type VoucherMetadata struct {
|
||||||
Symbols string
|
Symbols string
|
||||||
@@ -28,24 +23,13 @@ type VoucherMetadata struct {
|
|||||||
Addresses string
|
Addresses string
|
||||||
}
|
}
|
||||||
|
|
||||||
// sanitizeSymbol replaces known invalid token symbols with normalized ones
|
|
||||||
func sanitizeSymbol(symbol string) string {
|
|
||||||
if replacement, ok := symbolReplacements[symbol]; ok {
|
|
||||||
return replacement
|
|
||||||
}
|
|
||||||
return symbol
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProcessVouchers converts holdings into formatted strings
|
// ProcessVouchers converts holdings into formatted strings
|
||||||
func ProcessVouchers(holdings []dataserviceapi.TokenHoldings) VoucherMetadata {
|
func ProcessVouchers(holdings []dataserviceapi.TokenHoldings) VoucherMetadata {
|
||||||
var data VoucherMetadata
|
var data VoucherMetadata
|
||||||
var symbols, balances, decimals, addresses []string
|
var symbols, balances, decimals, addresses []string
|
||||||
|
|
||||||
for i, h := range holdings {
|
for i, h := range holdings {
|
||||||
// normalize token symbol before use
|
symbols = append(symbols, fmt.Sprintf("%d:%s", i+1, h.TokenSymbol))
|
||||||
cleanSymbol := sanitizeSymbol(h.TokenSymbol)
|
|
||||||
|
|
||||||
symbols = append(symbols, fmt.Sprintf("%d:%s", i+1, cleanSymbol))
|
|
||||||
|
|
||||||
// Scale down the balance
|
// Scale down the balance
|
||||||
scaledBalance := ScaleDownBalance(h.Balance, h.TokenDecimals)
|
scaledBalance := ScaleDownBalance(h.Balance, h.TokenDecimals)
|
||||||
|
|||||||
@@ -61,14 +61,13 @@ func TestProcessVouchers(t *testing.T) {
|
|||||||
holdings := []dataserviceapi.TokenHoldings{
|
holdings := []dataserviceapi.TokenHoldings{
|
||||||
{TokenAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100000000"},
|
{TokenAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100000000"},
|
||||||
{TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200000000"},
|
{TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200000000"},
|
||||||
{TokenAddress: "0x41c143d63Qa", TokenSymbol: "USD₮", TokenDecimals: "6", Balance: "300000000"},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedResult := VoucherMetadata{
|
expectedResult := VoucherMetadata{
|
||||||
Symbols: "1:SRF\n2:MILO\n3:USDT",
|
Symbols: "1:SRF\n2:MILO",
|
||||||
Balances: "1:100\n2:20000\n3:300",
|
Balances: "1:100\n2:20000",
|
||||||
Decimals: "1:6\n2:4\n3:6",
|
Decimals: "1:6\n2:4",
|
||||||
Addresses: "1:0xd4c288865Ce\n2:0x41c188d63Qa\n3:0x41c143d63Qa",
|
Addresses: "1:0xd4c288865Ce\n2:0x41c188d63Qa",
|
||||||
}
|
}
|
||||||
|
|
||||||
result := ProcessVouchers(holdings)
|
result := ProcessVouchers(holdings)
|
||||||
|
|||||||
Reference in New Issue
Block a user