Compare commits
	
		
			4 Commits
		
	
	
		
			master
			...
			normalize-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 984688998b | |||
| 1bbb51d352 | |||
| e3aad7153d | |||
| 7c31a8920f | 
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @ -5,7 +5,7 @@ go 1.23.4 | ||||
| require ( | ||||
| 	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/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-africastalking v0.0.0-20250129070628-5a539172c694 | ||||
| 	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.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.20251021120522-6f7802b58cf5 h1:bQglHVxMilciZ9M2PGuLgA+Wkvqo8OqQh6TFYwjtuSE= | ||||
| 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.20251022084613-532547899f63 h1:yznaUXeAy+qiZb2nCxosYXE5HyCPpynIoplEuYV/zQM= | ||||
| 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.20251006084325-61410b2b294e h1:RlKXekj4O0+cLWLitY+aLBo3WVwUslCkrTbU2q/FZYQ= | ||||
| 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.20251006090242-8d4fbb9c2ef4 h1:ONW+0eXvkuBojaKaqg8WZBYSW2ZXdIE9A1jaPTUI7Y8= | ||||
| 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/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= | ||||
| git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= | ||||
|  | ||||
| @ -2,7 +2,6 @@ package application | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| @ -12,7 +11,6 @@ import ( | ||||
| 	"git.grassecon.net/grassrootseconomics/common/identity" | ||||
| 	"git.grassecon.net/grassrootseconomics/common/phone" | ||||
| 	"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/store" | ||||
| 	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
 | ||||
| 	r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress) | ||||
| 	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") | ||||
| 		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) | ||||
| 		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) | ||||
| 
 | ||||
| 	// sanitize invalid characters
 | ||||
| 	symbol := strings.ReplaceAll(voucherData.TokenSymbol, "USD₮", "USDT") | ||||
| 
 | ||||
| 	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 | ||||
|  | ||||
| @ -41,7 +41,4 @@ msgid "%s is not in %s. Please update your voucher and try again." | ||||
| msgstr "%s haipo kwenye %s. Tafadhali badilisha sarafu yako na ujaribu tena." | ||||
| 
 | ||||
| msgid "Name: %s\nSymbol: %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." | ||||
| msgstr "Jina: %s\nSarafu: %s" | ||||
| @ -15,11 +15,6 @@ var ( | ||||
| 	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
 | ||||
| type VoucherMetadata struct { | ||||
| 	Symbols   string | ||||
| @ -28,24 +23,13 @@ type VoucherMetadata struct { | ||||
| 	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
 | ||||
| func ProcessVouchers(holdings []dataserviceapi.TokenHoldings) VoucherMetadata { | ||||
| 	var data VoucherMetadata | ||||
| 	var symbols, balances, decimals, addresses []string | ||||
| 
 | ||||
| 	for i, h := range holdings { | ||||
| 		// normalize token symbol before use
 | ||||
| 		cleanSymbol := sanitizeSymbol(h.TokenSymbol) | ||||
| 
 | ||||
| 		symbols = append(symbols, fmt.Sprintf("%d:%s", i+1, cleanSymbol)) | ||||
| 		symbols = append(symbols, fmt.Sprintf("%d:%s", i+1, h.TokenSymbol)) | ||||
| 
 | ||||
| 		// Scale down the balance
 | ||||
| 		scaledBalance := ScaleDownBalance(h.Balance, h.TokenDecimals) | ||||
|  | ||||
| @ -61,14 +61,13 @@ func TestProcessVouchers(t *testing.T) { | ||||
| 	holdings := []dataserviceapi.TokenHoldings{ | ||||
| 		{TokenAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100000000"}, | ||||
| 		{TokenAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200000000"}, | ||||
| 		{TokenAddress: "0x41c143d63Qa", TokenSymbol: "USD₮", TokenDecimals: "6", Balance: "300000000"}, | ||||
| 	} | ||||
| 
 | ||||
| 	expectedResult := VoucherMetadata{ | ||||
| 		Symbols:   "1:SRF\n2:MILO\n3:USDT", | ||||
| 		Balances:  "1:100\n2:20000\n3:300", | ||||
| 		Decimals:  "1:6\n2:4\n3:6", | ||||
| 		Addresses: "1:0xd4c288865Ce\n2:0x41c188d63Qa\n3:0x41c143d63Qa", | ||||
| 		Symbols:   "1:SRF\n2:MILO", | ||||
| 		Balances:  "1:100\n2:20000", | ||||
| 		Decimals:  "1:6\n2:4", | ||||
| 		Addresses: "1:0xd4c288865Ce\n2:0x41c188d63Qa", | ||||
| 	} | ||||
| 
 | ||||
| 	result := ProcessVouchers(holdings) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user