| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | package javascript | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-14 18:12:27 +00:00
										 |  |  | 	"github.com/ethereum/go-ethereum/eth" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:43:14 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/state" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ui" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/xeth" | 
					
						
							| 
									
										
										
										
											2014-05-20 17:49:12 +02:00
										 |  |  | 	"github.com/obscuren/otto" | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | type JSStateObject struct { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	*xeth.JSObject | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | 	eth *JSEthereum | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value { | 
					
						
							|  |  |  | 	cb := call.Argument(0) | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 	it := self.JSObject.Trie().Iterator() | 
					
						
							|  |  |  | 	for it.Next() { | 
					
						
							|  |  |  | 		cb.Call(self.eth.toVal(self), self.eth.toVal(ethutil.Bytes2Hex(it.Key)), self.eth.toVal(ethutil.Bytes2Hex(it.Value))) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 20:34:25 +02:00
										 |  |  | 	return otto.UndefinedValue() | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // The JSEthereum object attempts to wrap the PEthereum object and returns | 
					
						
							|  |  |  | // meaningful javascript objects | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | type JSBlock struct { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	*xeth.JSBlock | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | 	eth *JSEthereum | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSBlock) GetTransaction(hash string) otto.Value { | 
					
						
							| 
									
										
										
										
											2014-08-16 01:38:24 +02:00
										 |  |  | 	return self.eth.toVal(self.JSBlock.GetTransaction(hash)) | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | type JSMessage struct { | 
					
						
							| 
									
										
										
										
											2014-08-14 17:01:21 +02:00
										 |  |  | 	To        string `json:"to"` | 
					
						
							|  |  |  | 	From      string `json:"from"` | 
					
						
							|  |  |  | 	Input     string `json:"input"` | 
					
						
							|  |  |  | 	Output    string `json:"output"` | 
					
						
							|  |  |  | 	Path      int    `json:"path"` | 
					
						
							|  |  |  | 	Origin    string `json:"origin"` | 
					
						
							|  |  |  | 	Timestamp int32  `json:"timestamp"` | 
					
						
							|  |  |  | 	Coinbase  string `json:"coinbase"` | 
					
						
							|  |  |  | 	Block     string `json:"block"` | 
					
						
							|  |  |  | 	Number    int32  `json:"number"` | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:43:14 +01:00
										 |  |  | func NewJSMessage(message *state.Message) JSMessage { | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 	return JSMessage{ | 
					
						
							|  |  |  | 		To:        ethutil.Bytes2Hex(message.To), | 
					
						
							|  |  |  | 		From:      ethutil.Bytes2Hex(message.From), | 
					
						
							|  |  |  | 		Input:     ethutil.Bytes2Hex(message.Input), | 
					
						
							|  |  |  | 		Output:    ethutil.Bytes2Hex(message.Output), | 
					
						
							|  |  |  | 		Path:      message.Path, | 
					
						
							|  |  |  | 		Origin:    ethutil.Bytes2Hex(message.Origin), | 
					
						
							|  |  |  | 		Timestamp: int32(message.Timestamp), | 
					
						
							|  |  |  | 		Coinbase:  ethutil.Bytes2Hex(message.Origin), | 
					
						
							|  |  |  | 		Block:     ethutil.Bytes2Hex(message.Block), | 
					
						
							|  |  |  | 		Number:    int32(message.Number.Int64()), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | type JSEthereum struct { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	*xeth.JSXEth | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 	vm       *otto.Otto | 
					
						
							|  |  |  | 	ethereum *eth.Ethereum | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-02 22:19:58 +01:00
										 |  |  | func (self *JSEthereum) Block(v interface{}) otto.Value { | 
					
						
							|  |  |  | 	if number, ok := v.(int64); ok { | 
					
						
							|  |  |  | 		return self.toVal(&JSBlock{self.JSXEth.BlockByNumber(int32(number)), self}) | 
					
						
							|  |  |  | 	} else if hash, ok := v.(string); ok { | 
					
						
							|  |  |  | 		return self.toVal(&JSBlock{self.JSXEth.BlockByHash(hash), self}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return otto.UndefinedValue() | 
					
						
							| 
									
										
										
										
											2014-05-21 12:14:39 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-02 22:19:58 +01:00
										 |  |  | func (self *JSEthereum) Peers() otto.Value { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	return self.toVal(self.JSXEth.Peers()) | 
					
						
							| 
									
										
										
										
											2014-06-02 15:16:37 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-02 22:19:58 +01:00
										 |  |  | func (self *JSEthereum) Key() otto.Value { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	return self.toVal(self.JSXEth.Key()) | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSEthereum) GetStateObject(addr string) otto.Value { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	return self.toVal(&JSStateObject{xeth.NewJSObject(self.JSXEth.World().SafeGet(ethutil.Hex2Bytes(addr))), self}) | 
					
						
							| 
									
										
										
										
											2014-06-04 15:54:33 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value { | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	r, err := self.JSXEth.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		fmt.Println(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return otto.UndefinedValue() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return self.toVal(r) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSEthereum) toVal(v interface{}) otto.Value { | 
					
						
							|  |  |  | 	result, err := self.vm.ToValue(v) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-06-04 15:54:33 +02:00
										 |  |  | 		fmt.Println("Value unknown:", err) | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return otto.UndefinedValue() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return result | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value { | 
					
						
							| 
									
										
										
										
											2014-10-18 13:20:35 +02:00
										 |  |  | 	filter := ui.NewFilterFromMap(object, self.ethereum) | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	messages := filter.Find() | 
					
						
							|  |  |  | 	var msgs []JSMessage | 
					
						
							|  |  |  | 	for _, m := range messages { | 
					
						
							|  |  |  | 		msgs = append(msgs, NewJSMessage(m)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	v, _ := self.vm.ToValue(msgs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return v | 
					
						
							|  |  |  | } |