forked from mirror/go-ethereum
commit
8affdf96e2
@ -1,174 +0,0 @@ |
|||||||
package common |
|
||||||
|
|
||||||
import ( |
|
||||||
"fmt" |
|
||||||
"math/big" |
|
||||||
"os" |
|
||||||
"os/user" |
|
||||||
"path" |
|
||||||
"path/filepath" |
|
||||||
"runtime" |
|
||||||
"time" |
|
||||||
|
|
||||||
"github.com/kardianos/osext" |
|
||||||
) |
|
||||||
|
|
||||||
// MakeName creates a node name that follows the ethereum convention
|
|
||||||
// for such names. It adds the operation system name and Go runtime version
|
|
||||||
// the name.
|
|
||||||
func MakeName(name, version string) string { |
|
||||||
return fmt.Sprintf("%s/v%s/%s/%s", name, version, runtime.GOOS, runtime.Version()) |
|
||||||
} |
|
||||||
|
|
||||||
func DefaultAssetPath() string { |
|
||||||
var assetPath string |
|
||||||
pwd, _ := os.Getwd() |
|
||||||
srcdir := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") |
|
||||||
|
|
||||||
// If the current working directory is the go-ethereum dir
|
|
||||||
// assume a debug build and use the source directory as
|
|
||||||
// asset directory.
|
|
||||||
if pwd == srcdir { |
|
||||||
assetPath = path.Join(pwd, "assets") |
|
||||||
} else { |
|
||||||
switch runtime.GOOS { |
|
||||||
case "darwin": |
|
||||||
// Get Binary Directory
|
|
||||||
exedir, _ := osext.ExecutableFolder() |
|
||||||
assetPath = filepath.Join(exedir, "../Resources") |
|
||||||
case "linux": |
|
||||||
assetPath = "/usr/share/mist" |
|
||||||
case "windows": |
|
||||||
assetPath = "./assets" |
|
||||||
default: |
|
||||||
assetPath = "." |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Check if the assetPath exists. If not, try the source directory
|
|
||||||
// This happens when binary is run from outside cmd/mist directory
|
|
||||||
if _, err := os.Stat(assetPath); os.IsNotExist(err) { |
|
||||||
assetPath = path.Join(srcdir, "assets") |
|
||||||
} |
|
||||||
|
|
||||||
return assetPath |
|
||||||
} |
|
||||||
|
|
||||||
func DefaultDataDir() string { |
|
||||||
usr, _ := user.Current() |
|
||||||
if runtime.GOOS == "darwin" { |
|
||||||
return path.Join(usr.HomeDir, "Library/Ethereum") |
|
||||||
} else if runtime.GOOS == "windows" { |
|
||||||
return path.Join(usr.HomeDir, "AppData/Roaming/Ethereum") |
|
||||||
} else { |
|
||||||
return path.Join(usr.HomeDir, ".ethereum") |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func ToHex(b []byte) string { |
|
||||||
hex := Bytes2Hex(b) |
|
||||||
// Prefer output of "0x0" instead of "0x"
|
|
||||||
if len(hex) == 0 { |
|
||||||
hex = "0" |
|
||||||
} |
|
||||||
return "0x" + hex |
|
||||||
} |
|
||||||
|
|
||||||
func FromHex(s string) []byte { |
|
||||||
if len(s) > 1 { |
|
||||||
if s[0:2] == "0x" { |
|
||||||
s = s[2:] |
|
||||||
} |
|
||||||
if len(s)%2 == 1 { |
|
||||||
s = "0" + s |
|
||||||
} |
|
||||||
return Hex2Bytes(s) |
|
||||||
} |
|
||||||
return nil |
|
||||||
} |
|
||||||
func IsWindows() bool { |
|
||||||
return runtime.GOOS == "windows" |
|
||||||
} |
|
||||||
|
|
||||||
func WindonizePath(path string) string { |
|
||||||
if string(path[0]) == "/" && IsWindows() { |
|
||||||
path = path[1:] |
|
||||||
} |
|
||||||
return path |
|
||||||
} |
|
||||||
|
|
||||||
// The different number of units
|
|
||||||
var ( |
|
||||||
Douglas = BigPow(10, 42) |
|
||||||
Einstein = BigPow(10, 21) |
|
||||||
Ether = BigPow(10, 18) |
|
||||||
Finney = BigPow(10, 15) |
|
||||||
Szabo = BigPow(10, 12) |
|
||||||
Shannon = BigPow(10, 9) |
|
||||||
Babbage = BigPow(10, 6) |
|
||||||
Ada = BigPow(10, 3) |
|
||||||
Wei = big.NewInt(1) |
|
||||||
) |
|
||||||
|
|
||||||
//
|
|
||||||
// Currency to string
|
|
||||||
// Returns a string representing a human readable format
|
|
||||||
func CurrencyToString(num *big.Int) string { |
|
||||||
var ( |
|
||||||
fin *big.Int = num |
|
||||||
denom string = "Wei" |
|
||||||
) |
|
||||||
|
|
||||||
switch { |
|
||||||
case num.Cmp(Douglas) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Douglas) |
|
||||||
denom = "Douglas" |
|
||||||
case num.Cmp(Einstein) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Einstein) |
|
||||||
denom = "Einstein" |
|
||||||
case num.Cmp(Ether) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Ether) |
|
||||||
denom = "Ether" |
|
||||||
case num.Cmp(Finney) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Finney) |
|
||||||
denom = "Finney" |
|
||||||
case num.Cmp(Szabo) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Szabo) |
|
||||||
denom = "Szabo" |
|
||||||
case num.Cmp(Shannon) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Shannon) |
|
||||||
denom = "Shannon" |
|
||||||
case num.Cmp(Babbage) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Babbage) |
|
||||||
denom = "Babbage" |
|
||||||
case num.Cmp(Ada) >= 0: |
|
||||||
fin = new(big.Int).Div(num, Ada) |
|
||||||
denom = "Ada" |
|
||||||
} |
|
||||||
|
|
||||||
// TODO add comment clarifying expected behavior
|
|
||||||
if len(fin.String()) > 5 { |
|
||||||
return fmt.Sprintf("%sE%d %s", fin.String()[0:5], len(fin.String())-5, denom) |
|
||||||
} |
|
||||||
|
|
||||||
return fmt.Sprintf("%v %s", fin, denom) |
|
||||||
} |
|
||||||
|
|
||||||
// Common big integers often used
|
|
||||||
var ( |
|
||||||
Big1 = big.NewInt(1) |
|
||||||
Big2 = big.NewInt(2) |
|
||||||
Big3 = big.NewInt(3) |
|
||||||
Big0 = big.NewInt(0) |
|
||||||
BigTrue = Big1 |
|
||||||
BigFalse = Big0 |
|
||||||
Big32 = big.NewInt(32) |
|
||||||
Big256 = big.NewInt(0xff) |
|
||||||
Big257 = big.NewInt(257) |
|
||||||
) |
|
||||||
|
|
||||||
func Bench(pre string, cb func()) { |
|
||||||
start := time.Now() |
|
||||||
cb() |
|
||||||
fmt.Println(pre, ": took:", time.Since(start)) |
|
||||||
} |
|
@ -1,89 +0,0 @@ |
|||||||
package common |
|
||||||
|
|
||||||
import ( |
|
||||||
"bytes" |
|
||||||
"math/big" |
|
||||||
"os" |
|
||||||
"testing" |
|
||||||
|
|
||||||
checker "gopkg.in/check.v1" |
|
||||||
) |
|
||||||
|
|
||||||
type CommonSuite struct{} |
|
||||||
|
|
||||||
var _ = checker.Suite(&CommonSuite{}) |
|
||||||
|
|
||||||
func (s *CommonSuite) TestOS(c *checker.C) { |
|
||||||
expwin := (os.PathSeparator == '\\' && os.PathListSeparator == ';') |
|
||||||
res := IsWindows() |
|
||||||
|
|
||||||
if !expwin { |
|
||||||
c.Assert(res, checker.Equals, expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator)) |
|
||||||
} else { |
|
||||||
c.Assert(res, checker.Not(checker.Equals), expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator)) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func (s *CommonSuite) TestWindonziePath(c *checker.C) { |
|
||||||
iswindowspath := os.PathSeparator == '\\' |
|
||||||
path := "/opt/eth/test/file.ext" |
|
||||||
res := WindonizePath(path) |
|
||||||
ressep := string(res[0]) |
|
||||||
|
|
||||||
if !iswindowspath { |
|
||||||
c.Assert(ressep, checker.Equals, "/") |
|
||||||
} else { |
|
||||||
c.Assert(ressep, checker.Not(checker.Equals), "/") |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func (s *CommonSuite) TestCommon(c *checker.C) { |
|
||||||
douglas := CurrencyToString(BigPow(10, 43)) |
|
||||||
einstein := CurrencyToString(BigPow(10, 22)) |
|
||||||
ether := CurrencyToString(BigPow(10, 19)) |
|
||||||
finney := CurrencyToString(BigPow(10, 16)) |
|
||||||
szabo := CurrencyToString(BigPow(10, 13)) |
|
||||||
shannon := CurrencyToString(BigPow(10, 10)) |
|
||||||
babbage := CurrencyToString(BigPow(10, 7)) |
|
||||||
ada := CurrencyToString(BigPow(10, 4)) |
|
||||||
wei := CurrencyToString(big.NewInt(10)) |
|
||||||
|
|
||||||
c.Assert(douglas, checker.Equals, "10 Douglas") |
|
||||||
c.Assert(einstein, checker.Equals, "10 Einstein") |
|
||||||
c.Assert(ether, checker.Equals, "10 Ether") |
|
||||||
c.Assert(finney, checker.Equals, "10 Finney") |
|
||||||
c.Assert(szabo, checker.Equals, "10 Szabo") |
|
||||||
c.Assert(shannon, checker.Equals, "10 Shannon") |
|
||||||
c.Assert(babbage, checker.Equals, "10 Babbage") |
|
||||||
c.Assert(ada, checker.Equals, "10 Ada") |
|
||||||
c.Assert(wei, checker.Equals, "10 Wei") |
|
||||||
} |
|
||||||
|
|
||||||
func (s *CommonSuite) TestLarge(c *checker.C) { |
|
||||||
douglaslarge := CurrencyToString(BigPow(100000000, 43)) |
|
||||||
adalarge := CurrencyToString(BigPow(100000000, 4)) |
|
||||||
weilarge := CurrencyToString(big.NewInt(100000000)) |
|
||||||
|
|
||||||
c.Assert(douglaslarge, checker.Equals, "10000E298 Douglas") |
|
||||||
c.Assert(adalarge, checker.Equals, "10000E7 Einstein") |
|
||||||
c.Assert(weilarge, checker.Equals, "100 Babbage") |
|
||||||
} |
|
||||||
|
|
||||||
//fromHex
|
|
||||||
func TestFromHex(t *testing.T) { |
|
||||||
input := "0x01" |
|
||||||
expected := []byte{1} |
|
||||||
result := FromHex(input) |
|
||||||
if bytes.Compare(expected, result) != 0 { |
|
||||||
t.Errorf("Expected % x got % x", expected, result) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func TestFromHexOddLength(t *testing.T) { |
|
||||||
input := "0x1" |
|
||||||
expected := []byte{1} |
|
||||||
result := FromHex(input) |
|
||||||
if bytes.Compare(expected, result) != 0 { |
|
||||||
t.Errorf("Expected % x got % x", expected, result) |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue