/
web3.go
86 lines (75 loc) · 1.97 KB
/
web3.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
// Package web3 is converted golang layer from web3.js
package web3
import (
"fmt"
"math/big"
"strings"
"github.com/metadium/go-delegator/common"
"github.com/metadium/go-delegator/log"
)
// GetValueOfUnit returns a value about given unit
func GetValueOfUnit(unit string) (val *big.Float, err string) {
val = common.UnitFloatMap[unit]
if val == nil {
err = "Invalid unit"
} else if val.Cmp(common.UnitFloatMap["noether"]) == -1 {
val = nil
err = "float64 overflow"
}
return
}
// Parse number string to big float
func getBigFloat(number string) *big.Float {
var err error
val := new(big.Float)
if number[:2] == "0x" {
_, _, err = val.Parse(number[:2], 16)
} else {
_, _, err = val.Parse(number, 10)
}
if err != nil {
log.Error("web3: failed to convert number")
return nil
}
return val
}
// FromWei applys unit to wei
func FromWei(number, unit string) (ret string, err error) {
// Validate unit
unitVal, errStr := GetValueOfUnit(unit)
if errStr != "" {
err = fmt.Errorf("Failed to find unit")
return
}
// Parse number string to big float
val := getBigFloat(number)
if val == nil {
// TODO: when number overflow, split to upper and lower bits, convert each bits, combine
err = fmt.Errorf("Number is not appropriate for float64")
return
}
// Divide number by unit
val.Quo(val, unitVal)
ret = strings.TrimRight(strings.TrimRight(val.Text('f', 10), "0"), ".")
return
}
// ToWei gets wei from given value and unit
func ToWei(number, unit string) (ret string, err error) {
// Validate unit
unitVal, errStr := GetValueOfUnit(unit)
if errStr != "" {
err = fmt.Errorf("Failed to find unit")
return
}
// Parse number string to big float
val := getBigFloat(number)
if val == nil {
// TODO: when number overflow, split to upper and lower bits, convert each bits, combine
err = fmt.Errorf("Number is not appropriate for float64")
return
}
// Multiply number by unit
val.Mul(val, unitVal)
ret = strings.Split(val.Text('f', 10), ".")[0]
return
}