| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | package ethutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2015-02-26 02:36:06 +01:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-02-23 11:28:20 +01:00
										 |  |  | 	"os/user" | 
					
						
							|  |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2015-02-26 02:36:06 +01:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2014-07-14 15:24:38 +02:00
										 |  |  | 	"runtime" | 
					
						
							| 
									
										
										
										
											2015-02-19 22:33:22 +01:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2015-02-26 02:36:06 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/kardianos/osext" | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-11 14:29:07 -05:00
										 |  |  | // 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()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 02:32:27 +01:00
										 |  |  | func DefaultAssetPath() string { | 
					
						
							|  |  |  | 	var assetPath string | 
					
						
							| 
									
										
										
										
											2015-02-26 21:01:40 +01:00
										 |  |  | 	pwd, _ := os.Getwd() | 
					
						
							|  |  |  | 	srcdir := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 02:32:27 +01:00
										 |  |  | 	// If the current working directory is the go-ethereum dir | 
					
						
							|  |  |  | 	// assume a debug build and use the source directory as | 
					
						
							|  |  |  | 	// asset directory. | 
					
						
							| 
									
										
										
										
											2015-02-26 21:01:40 +01:00
										 |  |  | 	if pwd == srcdir { | 
					
						
							| 
									
										
										
										
											2015-02-26 02:32:27 +01:00
										 |  |  | 		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 = "." | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-02-26 21:04:26 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-26 21:01:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 21:04:26 +01:00
										 |  |  | 	// 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") | 
					
						
							| 
									
										
										
										
											2015-02-26 02:32:27 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-26 21:04:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-26 02:32:27 +01:00
										 |  |  | 	return assetPath | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-23 11:28:20 +01:00
										 |  |  | 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") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-14 15:24:38 +02:00
										 |  |  | func IsWindows() bool { | 
					
						
							|  |  |  | 	return runtime.GOOS == "windows" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func WindonizePath(path string) string { | 
					
						
							|  |  |  | 	if string(path[0]) == "/" && IsWindows() { | 
					
						
							|  |  |  | 		path = path[1:] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return path | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // The different number of units | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | var ( | 
					
						
							| 
									
										
										
										
											2014-06-06 12:12:27 +02:00
										 |  |  | 	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) | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2014-06-11 10:28:18 +02:00
										 |  |  | // Currency to string | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Returns a string representing a human readable format | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | func CurrencyToString(num *big.Int) string { | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 	var ( | 
					
						
							|  |  |  | 		fin   *big.Int = num | 
					
						
							|  |  |  | 		denom string   = "Wei" | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | 	switch { | 
					
						
							| 
									
										
										
										
											2014-06-06 12:12:27 +02:00
										 |  |  | 	case num.Cmp(Douglas) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Douglas) | 
					
						
							|  |  |  | 		denom = "Douglas" | 
					
						
							| 
									
										
										
										
											2014-06-06 12:12:27 +02:00
										 |  |  | 	case num.Cmp(Einstein) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Einstein) | 
					
						
							|  |  |  | 		denom = "Einstein" | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | 	case num.Cmp(Ether) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Ether) | 
					
						
							|  |  |  | 		denom = "Ether" | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | 	case num.Cmp(Finney) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Finney) | 
					
						
							|  |  |  | 		denom = "Finney" | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | 	case num.Cmp(Szabo) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Szabo) | 
					
						
							|  |  |  | 		denom = "Szabo" | 
					
						
							| 
									
										
										
										
											2014-05-20 14:53:34 +02:00
										 |  |  | 	case num.Cmp(Shannon) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Shannon) | 
					
						
							|  |  |  | 		denom = "Shannon" | 
					
						
							| 
									
										
										
										
											2014-05-20 14:53:34 +02:00
										 |  |  | 	case num.Cmp(Babbage) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Babbage) | 
					
						
							|  |  |  | 		denom = "Babbage" | 
					
						
							| 
									
										
										
										
											2014-05-20 14:53:34 +02:00
										 |  |  | 	case num.Cmp(Ada) >= 0: | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 		fin = new(big.Int).Div(num, Ada) | 
					
						
							|  |  |  | 		denom = "Ada" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 15:01:52 -06:00
										 |  |  | 	// TODO add comment clarifying expected behavior | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 	if len(fin.String()) > 5 { | 
					
						
							|  |  |  | 		return fmt.Sprintf("%sE%d %s", fin.String()[0:5], len(fin.String())-5, denom) | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-17 12:42:32 +02:00
										 |  |  | 	return fmt.Sprintf("%v %s", fin, denom) | 
					
						
							| 
									
										
										
										
											2014-02-25 11:20:24 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-03-21 18:22:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Common big integers often used | 
					
						
							| 
									
										
										
										
											2014-03-21 18:22:47 +01:00
										 |  |  | var ( | 
					
						
							| 
									
										
										
										
											2014-07-21 20:38:43 +02:00
										 |  |  | 	Big1     = big.NewInt(1) | 
					
						
							|  |  |  | 	Big2     = big.NewInt(2) | 
					
						
							| 
									
										
										
										
											2014-10-27 11:44:16 +01:00
										 |  |  | 	Big3     = big.NewInt(3) | 
					
						
							| 
									
										
										
										
											2014-07-21 20:38:43 +02:00
										 |  |  | 	Big0     = big.NewInt(0) | 
					
						
							|  |  |  | 	BigTrue  = Big1 | 
					
						
							|  |  |  | 	BigFalse = Big0 | 
					
						
							|  |  |  | 	Big32    = big.NewInt(32) | 
					
						
							|  |  |  | 	Big256   = big.NewInt(0xff) | 
					
						
							| 
									
										
										
										
											2015-01-13 00:25:45 +01:00
										 |  |  | 	Big257   = big.NewInt(257) | 
					
						
							| 
									
										
										
										
											2014-03-21 18:22:47 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-02-19 22:33:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func Bench(pre string, cb func()) { | 
					
						
							|  |  |  | 	start := time.Now() | 
					
						
							|  |  |  | 	cb() | 
					
						
							|  |  |  | 	fmt.Println(pre, ": took:", time.Since(start)) | 
					
						
							|  |  |  | } |