190 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package store
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"reflect"
 | 
						|
 | 
						|
	storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
 | 
						|
	dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
 | 
						|
)
 | 
						|
 | 
						|
type SwapData struct {
 | 
						|
	PublicKey             string
 | 
						|
	ActivePoolAddress     string
 | 
						|
	ActiveSwapFromSym     string
 | 
						|
	ActiveSwapFromDecimal string
 | 
						|
	ActiveSwapFromAddress string
 | 
						|
	ActiveSwapToSym       string
 | 
						|
	ActiveSwapToAddress   string
 | 
						|
}
 | 
						|
 | 
						|
type SwapPreviewData struct {
 | 
						|
	TemporaryValue        string
 | 
						|
	PublicKey             string
 | 
						|
	ActiveSwapMaxAmount   string
 | 
						|
	ActiveSwapFromDecimal string
 | 
						|
	ActivePoolAddress     string
 | 
						|
	ActiveSwapFromAddress string
 | 
						|
	ActiveSwapFromSym     string
 | 
						|
	ActiveSwapToAddress   string
 | 
						|
	ActiveSwapToSym       string
 | 
						|
	ActiveSwapToDecimal   string
 | 
						|
}
 | 
						|
 | 
						|
func ReadSwapData(ctx context.Context, store DataStore, sessionId string) (SwapData, error) {
 | 
						|
	data := SwapData{}
 | 
						|
	fieldToKey := map[string]storedb.DataTyp{
 | 
						|
		"PublicKey":             storedb.DATA_PUBLIC_KEY,
 | 
						|
		"ActivePoolAddress":     storedb.DATA_ACTIVE_POOL_ADDRESS,
 | 
						|
		"ActiveSwapFromSym":     storedb.DATA_ACTIVE_SYM,
 | 
						|
		"ActiveSwapFromDecimal": storedb.DATA_ACTIVE_DECIMAL,
 | 
						|
		"ActiveSwapFromAddress": storedb.DATA_ACTIVE_ADDRESS,
 | 
						|
		"ActiveSwapToSym":       storedb.DATA_ACTIVE_SWAP_TO_SYM,
 | 
						|
		"ActiveSwapToAddress":   storedb.DATA_ACTIVE_SWAP_TO_ADDRESS,
 | 
						|
	}
 | 
						|
 | 
						|
	v := reflect.ValueOf(&data).Elem()
 | 
						|
	for fieldName, key := range fieldToKey {
 | 
						|
		field := v.FieldByName(fieldName)
 | 
						|
		if !field.IsValid() || !field.CanSet() {
 | 
						|
			return data, errors.New("invalid struct field: " + fieldName)
 | 
						|
		}
 | 
						|
 | 
						|
		value, err := ReadStringEntry(ctx, store, sessionId, key)
 | 
						|
		if err != nil {
 | 
						|
			return data, err
 | 
						|
		}
 | 
						|
		field.SetString(value)
 | 
						|
	}
 | 
						|
 | 
						|
	return data, nil
 | 
						|
}
 | 
						|
 | 
						|
func ReadSwapPreviewData(ctx context.Context, store DataStore, sessionId string) (SwapPreviewData, error) {
 | 
						|
	data := SwapPreviewData{}
 | 
						|
	fieldToKey := map[string]storedb.DataTyp{
 | 
						|
		"TemporaryValue":        storedb.DATA_TEMPORARY_VALUE,
 | 
						|
		"PublicKey":             storedb.DATA_PUBLIC_KEY,
 | 
						|
		"ActiveSwapMaxAmount":   storedb.DATA_ACTIVE_SWAP_MAX_AMOUNT,
 | 
						|
		"ActiveSwapFromDecimal": storedb.DATA_ACTIVE_DECIMAL,
 | 
						|
		"ActivePoolAddress":     storedb.DATA_ACTIVE_POOL_ADDRESS,
 | 
						|
		"ActiveSwapFromAddress": storedb.DATA_ACTIVE_ADDRESS,
 | 
						|
		"ActiveSwapFromSym":     storedb.DATA_ACTIVE_SYM,
 | 
						|
		"ActiveSwapToAddress":   storedb.DATA_ACTIVE_SWAP_TO_ADDRESS,
 | 
						|
		"ActiveSwapToSym":       storedb.DATA_ACTIVE_SWAP_TO_SYM,
 | 
						|
		"ActiveSwapToDecimal":   storedb.DATA_ACTIVE_SWAP_TO_DECIMAL,
 | 
						|
	}
 | 
						|
 | 
						|
	v := reflect.ValueOf(&data).Elem()
 | 
						|
	for fieldName, key := range fieldToKey {
 | 
						|
		field := v.FieldByName(fieldName)
 | 
						|
		if !field.IsValid() || !field.CanSet() {
 | 
						|
			return data, errors.New("invalid struct field: " + fieldName)
 | 
						|
		}
 | 
						|
 | 
						|
		value, err := ReadStringEntry(ctx, store, sessionId, key)
 | 
						|
		if err != nil {
 | 
						|
			return data, err
 | 
						|
		}
 | 
						|
		field.SetString(value)
 | 
						|
	}
 | 
						|
 | 
						|
	return data, nil
 | 
						|
}
 | 
						|
 | 
						|
// GetSwapFromVoucherData retrieves and matches swap from voucher data
 | 
						|
func GetSwapFromVoucherData(ctx context.Context, store DataStore, sessionId string, input string) (*dataserviceapi.TokenHoldings, error) {
 | 
						|
	keys := []storedb.DataTyp{
 | 
						|
		storedb.DATA_POOL_FROM_SYMBOLS,
 | 
						|
		storedb.DATA_POOL_FROM_BALANCES,
 | 
						|
		storedb.DATA_POOL_FROM_DECIMALS,
 | 
						|
		storedb.DATA_POOL_FROM_ADDRESSES,
 | 
						|
	}
 | 
						|
	data := make(map[storedb.DataTyp]string)
 | 
						|
 | 
						|
	for _, key := range keys {
 | 
						|
		value, err := store.ReadEntry(ctx, sessionId, key)
 | 
						|
		if err != nil {
 | 
						|
			return nil, fmt.Errorf("failed to get data key %x: %v", key, err)
 | 
						|
		}
 | 
						|
		data[key] = string(value)
 | 
						|
	}
 | 
						|
 | 
						|
	symbol, balance, decimal, address := MatchVoucher(input,
 | 
						|
		data[storedb.DATA_POOL_FROM_SYMBOLS],
 | 
						|
		data[storedb.DATA_POOL_FROM_BALANCES],
 | 
						|
		data[storedb.DATA_POOL_FROM_DECIMALS],
 | 
						|
		data[storedb.DATA_POOL_FROM_ADDRESSES],
 | 
						|
	)
 | 
						|
 | 
						|
	if symbol == "" {
 | 
						|
		return nil, nil
 | 
						|
	}
 | 
						|
 | 
						|
	return &dataserviceapi.TokenHoldings{
 | 
						|
		TokenSymbol:   string(symbol),
 | 
						|
		Balance:       string(balance),
 | 
						|
		TokenDecimals: string(decimal),
 | 
						|
		TokenAddress:  string(address),
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
// GetSwapToVoucherData retrieves and matches token data
 | 
						|
func GetSwapToVoucherData(ctx context.Context, store DataStore, sessionId string, input string) (*dataserviceapi.TokenHoldings, error) {
 | 
						|
	keys := []storedb.DataTyp{
 | 
						|
		storedb.DATA_POOL_TO_SYMBOLS,
 | 
						|
		storedb.DATA_POOL_TO_BALANCES,
 | 
						|
		storedb.DATA_POOL_TO_DECIMALS,
 | 
						|
		storedb.DATA_POOL_TO_ADDRESSES,
 | 
						|
	}
 | 
						|
	data := make(map[storedb.DataTyp]string)
 | 
						|
 | 
						|
	for _, key := range keys {
 | 
						|
		value, err := store.ReadEntry(ctx, sessionId, key)
 | 
						|
		if err != nil {
 | 
						|
			return nil, fmt.Errorf("failed to get data key %x: %v", key, err)
 | 
						|
		}
 | 
						|
		data[key] = string(value)
 | 
						|
	}
 | 
						|
 | 
						|
	symbol, balance, decimal, address := MatchVoucher(input,
 | 
						|
		data[storedb.DATA_POOL_TO_SYMBOLS],
 | 
						|
		data[storedb.DATA_POOL_TO_BALANCES],
 | 
						|
		data[storedb.DATA_POOL_TO_DECIMALS],
 | 
						|
		data[storedb.DATA_POOL_TO_ADDRESSES],
 | 
						|
	)
 | 
						|
 | 
						|
	if symbol == "" {
 | 
						|
		return nil, nil
 | 
						|
	}
 | 
						|
 | 
						|
	return &dataserviceapi.TokenHoldings{
 | 
						|
		TokenSymbol:   string(symbol),
 | 
						|
		Balance:       string(balance),
 | 
						|
		TokenDecimals: string(decimal),
 | 
						|
		TokenAddress:  string(address),
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
// UpdateSwapToVoucherData updates the active swap to voucher data in the DataStore.
 | 
						|
func UpdateSwapToVoucherData(ctx context.Context, store DataStore, sessionId string, data *dataserviceapi.TokenHoldings) error {
 | 
						|
	logg.InfoCtxf(ctx, "UpdateSwapToVoucherData", "data", data)
 | 
						|
	// Active swap to voucher data entries
 | 
						|
	activeEntries := map[storedb.DataTyp][]byte{
 | 
						|
		storedb.DATA_ACTIVE_SWAP_TO_ADDRESS: []byte(data.TokenAddress),
 | 
						|
		storedb.DATA_ACTIVE_SWAP_TO_SYM:     []byte(data.TokenSymbol),
 | 
						|
		storedb.DATA_ACTIVE_SWAP_TO_DECIMAL: []byte(data.TokenDecimals),
 | 
						|
	}
 | 
						|
 | 
						|
	// Write active data
 | 
						|
	for key, value := range activeEntries {
 | 
						|
		if err := store.WriteEntry(ctx, sessionId, key, value); err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 |