-
Notifications
You must be signed in to change notification settings - Fork 0
/
common.go
73 lines (63 loc) · 2.13 KB
/
common.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package client
import (
"strings"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/furya-official/fury-blockchain/x/bonds/types"
)
func splitParameters(fnParamsStr string) (paramValuePairs []string) {
// If empty, just return empty list
if strings.TrimSpace(fnParamsStr) != "" {
// Split "a:1,b:2" into ["a:1","b:2"]
paramValuePairs = strings.Split(fnParamsStr, ",")
}
return paramValuePairs
}
func paramsListToMap(paramValuePairs []string) (paramsFieldMap map[string]string, err error) {
paramsFieldMap = make(map[string]string)
for _, pv := range paramValuePairs {
// Split each "a:1" into ["a","1"]
pvArray := strings.SplitN(pv, ":", 2)
if len(pvArray) != 2 {
return nil, sdkerrors.Wrap(types.ErrInvalidFunctionParameter, pv)
}
paramsFieldMap[pvArray[0]] = pvArray[1]
}
return paramsFieldMap, nil
}
func paramsMapToObj(paramsFieldMap map[string]string) (functionParams types.FunctionParams, err error) {
for p, v := range paramsFieldMap {
vDec, err := sdk.NewDecFromStr(v)
if err != nil {
return nil, sdkerrors.Wrap(types.ErrArgumentMissingOrNonFloat, p)
} else {
functionParams = append(functionParams, types.NewFunctionParam(p, vDec))
}
}
return functionParams, nil
}
// TODO Consider bypassing the use of a map to avoid non-determinism on the order of parameters at the client side
func ParseFunctionParams(fnParamsStr string) (fnParams types.FunctionParams, err error) {
// Split (if not empty) and check number of parameters
paramValuePairs := splitParameters(fnParamsStr)
// Parse function parameters into map
paramsFieldMap, err := paramsListToMap(paramValuePairs)
if err != nil {
return nil, err
}
// Parse parameters into floats
functionParams, err := paramsMapToObj(paramsFieldMap)
if err != nil {
return nil, err
}
return functionParams, nil
}
func ParseTwoPartCoin(amount, denom string) (coin sdk.Coin, err error) {
coin, err = sdk.ParseCoinNormalized(amount + denom)
if err != nil {
return sdk.Coin{}, err
} else if denom != coin.Denom {
return sdk.Coin{}, sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, denom)
}
return coin, nil
}