updated the send logic to work with a custom voucher

This commit is contained in:
Alfred Kamanda 2026-02-18 16:59:37 +03:00
parent 75caed5f08
commit 4660527e66
Signed by: Alfred-mk
GPG Key ID: 7EA3D01708908703

View File

@ -48,10 +48,10 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input
return res, nil return res, nil
} }
// save the recipient as the temporaryRecipient // save the recipient under recipient input
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(recipient)) err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT_INPUT, []byte(recipient))
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "failed to write temporaryRecipient entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", recipient, "error", err) logg.ErrorCtxf(ctx, "failed to write recipient input entry with", "key", storedb.DATA_RECIPIENT_INPUT, "value", recipient, "error", err)
return res, err return res, err
} }
@ -352,7 +352,7 @@ func (h *MenuHandlers) MaxAmount(ctx context.Context, sym string, input []byte)
return res, err return res, err
} }
customVoucherSelection, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_TRANSACTION_CUSTOM_VOUCHER) customVoucherSelection, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_TRANSACTION_CUSTOM_VOUCHER_STATE)
if err == nil { if err == nil {
customVoucherValue, _ := strconv.ParseUint(string(customVoucherSelection), 0, 64) customVoucherValue, _ := strconv.ParseUint(string(customVoucherSelection), 0, 64)
if customVoucherValue == 1 { if customVoucherValue == 1 {
@ -619,40 +619,46 @@ func (h *MenuHandlers) ValidateAmount(ctx context.Context, sym string, input []b
userStore := h.userdataStore userStore := h.userdataStore
var balanceValue float64
// retrieve the active balance // retrieve the active balance
activeBal, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) activeBal, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL)
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err) logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err)
return res, err return res, err
} }
balanceValue, err = strconv.ParseFloat(string(activeBal), 64)
customVoucherSelection, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_TRANSACTION_CUSTOM_VOUCHER_STATE)
if err == nil {
customVoucherValue, _ := strconv.ParseUint(string(customVoucherSelection), 0, 64)
if customVoucherValue == 1 {
// use the custom voucher
customTransactionVoucher, err := store.GetTemporaryVoucherData(ctx, h.userdataStore, sessionId)
if err != nil {
logg.ErrorCtxf(ctx, "failed on GetTemporaryVoucherData", "error", err)
return res, err
}
activeBal = []byte(customTransactionVoucher.Balance)
}
}
maxValue, err := strconv.ParseFloat(string(activeBal), 64)
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "Failed to convert the activeBal to a float", "error", err) logg.ErrorCtxf(ctx, "Failed to convert the activeBal to a float", "error", err)
return res, err return res, err
} }
// Extract numeric part from the input amount inputAmount, err := strconv.ParseFloat(inputStr, 64)
amountStr := strings.TrimSpace(inputStr) if err != nil || inputAmount > maxValue || inputAmount < 0.1 {
inputAmount, err := strconv.ParseFloat(amountStr, 64)
if err != nil {
res.FlagSet = append(res.FlagSet, flag_invalid_amount) res.FlagSet = append(res.FlagSet, flag_invalid_amount)
res.Content = amountStr res.Content = inputStr
return res, nil
}
if inputAmount > balanceValue || inputAmount < 0.1 {
res.FlagSet = append(res.FlagSet, flag_invalid_amount)
res.Content = amountStr
return res, nil return res, nil
} }
// Format the amount to 2 decimal places before saving (truncated) // Format the amount to 2 decimal places before saving (truncated)
formattedAmount, err := store.TruncateDecimalString(amountStr, 2) formattedAmount, err := store.TruncateDecimalString(inputStr, 2)
if err != nil { if err != nil {
res.FlagSet = append(res.FlagSet, flag_invalid_amount) res.FlagSet = append(res.FlagSet, flag_invalid_amount)
res.Content = amountStr res.Content = inputStr
return res, nil return res, nil
} }
@ -724,8 +730,62 @@ func (h *MenuHandlers) GetAmount(ctx context.Context, sym string, input []byte)
return res, nil return res, nil
} }
// InitiateTransaction calls the TokenTransfer and returns a confirmation based on the result. // NormalTransactionPreview displays the token transfer preview awaiting authorization
func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, input []byte) (resource.Result, error) { func (h *MenuHandlers) NormalTransactionPreview(ctx context.Context, sym string, input []byte) (resource.Result, error) {
var res resource.Result
sessionId, ok := ctx.Value("SessionId").(string)
if !ok {
return res, fmt.Errorf("missing session")
}
// Input in RAT
inputStr := string(input)
if inputStr == "0" {
return res, nil
}
code := codeFromCtx(ctx)
l := gotext.NewLocale(translationDir, code)
l.AddDomain("default")
userStore := h.userdataStore
data, err := store.ReadTransactionData(ctx, h.userdataStore, sessionId)
if err != nil {
return res, err
}
customVoucherSelection, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_TRANSACTION_CUSTOM_VOUCHER_STATE)
if err == nil {
customVoucherValue, _ := strconv.ParseUint(string(customVoucherSelection), 0, 64)
if customVoucherValue == 1 {
// use the custom voucher
customTransactionVoucher, err := store.GetTemporaryVoucherData(ctx, h.userdataStore, sessionId)
if err != nil {
logg.ErrorCtxf(ctx, "failed on GetTemporaryVoucherData", "error", err)
return res, err
}
data.ActiveSym = customTransactionVoucher.TokenSymbol
data.ActiveDecimal = customTransactionVoucher.TokenDecimals
data.ActiveAddress = customTransactionVoucher.TokenAddress
}
}
res.Content = l.Get(
"%s will receive %s %s from %s",
data.RecipientInput,
data.Amount,
data.ActiveSym,
sessionId,
)
return res, nil
}
// InitiateNormalTransaction calls the TokenTransfer and returns a confirmation based on the result.
// used for non-swap transactions
func (h *MenuHandlers) InitiateNormalTransaction(ctx context.Context, sym string, input []byte) (resource.Result, error) {
var res resource.Result var res resource.Result
var err error var err error
sessionId, ok := ctx.Value("SessionId").(string) sessionId, ok := ctx.Value("SessionId").(string)
@ -735,6 +795,8 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu
flag_account_authorized, _ := h.flagManager.GetFlag("flag_account_authorized") flag_account_authorized, _ := h.flagManager.GetFlag("flag_account_authorized")
userStore := h.userdataStore
code := codeFromCtx(ctx) code := codeFromCtx(ctx)
l := gotext.NewLocale(translationDir, code) l := gotext.NewLocale(translationDir, code)
l.AddDomain("default") l.AddDomain("default")
@ -744,6 +806,23 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu
return res, err return res, err
} }
customVoucherSelection, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_TRANSACTION_CUSTOM_VOUCHER_STATE)
if err == nil {
customVoucherValue, _ := strconv.ParseUint(string(customVoucherSelection), 0, 64)
if customVoucherValue == 1 {
// use the custom voucher
customTransactionVoucher, err := store.GetTemporaryVoucherData(ctx, h.userdataStore, sessionId)
if err != nil {
logg.ErrorCtxf(ctx, "failed on GetTemporaryVoucherData", "error", err)
return res, err
}
data.ActiveSym = customTransactionVoucher.TokenSymbol
data.ActiveDecimal = customTransactionVoucher.TokenDecimals
data.ActiveAddress = customTransactionVoucher.TokenAddress
}
}
finalAmountStr, err := store.ParseAndScaleAmount(data.Amount, data.ActiveDecimal) finalAmountStr, err := store.ParseAndScaleAmount(data.Amount, data.ActiveDecimal)
if err != nil { if err != nil {
return res, err return res, err
@ -775,7 +854,7 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu
res.Content = l.Get( res.Content = l.Get(
"Your request has been sent. %s will receive %s %s from %s.", "Your request has been sent. %s will receive %s %s from %s.",
data.TemporaryValue, data.RecipientInput,
data.Amount, data.Amount,
data.ActiveSym, data.ActiveSym,
sessionId, sessionId,
@ -807,7 +886,7 @@ func (h *MenuHandlers) TransactionSwapPreview(ctx context.Context, sym string, i
userStore := h.userdataStore userStore := h.userdataStore
recipientPhoneNumber, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_RECIPIENT_PHONE_NUMBER) recipientInput, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_RECIPIENT_INPUT)
if err != nil { if err != nil {
// invalid state // invalid state
return res, err return res, err
@ -871,7 +950,7 @@ func (h *MenuHandlers) TransactionSwapPreview(ctx context.Context, sym string, i
// Format the qouteAmount amount to 2 decimal places // Format the qouteAmount amount to 2 decimal places
qouteAmount, _ := store.TruncateDecimalString(quoteAmountStr, 2) qouteAmount, _ := store.TruncateDecimalString(quoteAmountStr, 2)
// store the qouteAmount in the temporary value // store the qouteAmount in the temporary value (display)
err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(qouteAmount)) err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(qouteAmount))
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "failed to write temporary qouteAmount entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", qouteAmount, "error", err) logg.ErrorCtxf(ctx, "failed to write temporary qouteAmount entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", qouteAmount, "error", err)
@ -887,7 +966,7 @@ func (h *MenuHandlers) TransactionSwapPreview(ctx context.Context, sym string, i
res.Content = l.Get( res.Content = l.Get(
"%s will receive %s %s", "%s will receive %s %s",
string(recipientPhoneNumber), qouteAmount, swapData.ActiveSwapToSym, string(recipientInput), qouteAmount, swapData.ActiveSwapToSym,
) )
return res, nil return res, nil
@ -946,7 +1025,7 @@ func (h *MenuHandlers) TransactionInitiateSwap(ctx context.Context, sym string,
logg.ErrorCtxf(ctx, "failed to read swapAmount entry with", "key", storedb.DATA_ACTIVE_SWAP_AMOUNT, "error", err) logg.ErrorCtxf(ctx, "failed to read swapAmount entry with", "key", storedb.DATA_ACTIVE_SWAP_AMOUNT, "error", err)
return res, err return res, err
} }
recipientPhoneNumber, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_RECIPIENT_PHONE_NUMBER) recipientInput, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_RECIPIENT_INPUT)
if err != nil { if err != nil {
// invalid state // invalid state
return res, err return res, err
@ -974,7 +1053,7 @@ func (h *MenuHandlers) TransactionInitiateSwap(ctx context.Context, sym string,
res.Content = l.Get( res.Content = l.Get(
"Your request has been sent. %s will receive %s %s from %s.", "Your request has been sent. %s will receive %s %s from %s.",
string(recipientPhoneNumber), string(recipientInput),
swapData.TemporaryValue, swapData.TemporaryValue,
swapData.ActiveSwapToSym, swapData.ActiveSwapToSym,
sessionId, sessionId,