-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.go
114 lines (98 loc) · 2.57 KB
/
utils.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package main
import (
"math/big"
"reflect"
"regexp"
"strconv"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/shopspring/decimal"
)
// IsValidAddress validate hex address
func IsValidAddress(iaddress interface{}) bool {
re := regexp.MustCompile("^0x[0-9a-fA-F]{40}$")
switch v := iaddress.(type) {
case string:
return re.MatchString(v)
case common.Address:
return re.MatchString(v.Hex())
default:
return false
}
}
// IsZeroAddress validate if it's a 0 address
func IsZeroAddress(iaddress interface{}) bool {
var address common.Address
switch v := iaddress.(type) {
case string:
address = common.HexToAddress(v)
case common.Address:
address = v
default:
return false
}
zeroAddressBytes := common.FromHex("0x0000000000000000000000000000000000000000")
addressBytes := address.Bytes()
return reflect.DeepEqual(addressBytes, zeroAddressBytes)
}
// ToDecimal wei to decimals
func ToDecimal(ivalue interface{}, decimals int) decimal.Decimal {
value := new(big.Int)
switch v := ivalue.(type) {
case string:
value.SetString(v, 10)
case *big.Int:
value = v
}
mul := decimal.NewFromFloat(float64(10)).Pow(decimal.NewFromFloat(float64(decimals)))
num, _ := decimal.NewFromString(value.String())
result := num.Div(mul)
return result
}
// ToWei decimals to wei
func ToWei(iamount interface{}, decimals int) *big.Int {
amount := decimal.NewFromFloat(0)
switch v := iamount.(type) {
case string:
amount, _ = decimal.NewFromString(v)
case float64:
amount = decimal.NewFromFloat(v)
case int64:
amount = decimal.NewFromFloat(float64(v))
case decimal.Decimal:
amount = v
case *decimal.Decimal:
amount = *v
}
mul := decimal.NewFromFloat(float64(10)).Pow(decimal.NewFromFloat(float64(decimals)))
result := amount.Mul(mul)
wei := new(big.Int)
wei.SetString(result.String(), 10)
return wei
}
// CalcGasCost calculate gas cost given gas limit (units) and gas price (wei)
func CalcGasCost(gasLimit uint64, gasPrice *big.Int) *big.Int {
gasLimitBig := big.NewInt(int64(gasLimit))
return gasLimitBig.Mul(gasLimitBig, gasPrice)
}
// SigRSV signatures R S V returned as arrays
func SigRSV(isig interface{}) ([32]byte, [32]byte, uint8) {
var sig []byte
switch v := isig.(type) {
case []byte:
sig = v
case string:
sig, _ = hexutil.Decode(v)
}
sigstr := common.Bytes2Hex(sig)
rS := sigstr[0:64]
sS := sigstr[64:128]
R := [32]byte{}
S := [32]byte{}
copy(R[:], common.FromHex(rS))
copy(S[:], common.FromHex(sS))
vStr := sigstr[128:130]
vI, _ := strconv.Atoi(vStr)
V := uint8(vI + 27)
return R, S, V
}