| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	*xeth.Object | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	it := self.Object.Trie().Iterator() | 
					
						
							| 
									
										
										
										
											2014-12-23 18:35:36 +01:00
										 |  |  | 	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 { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	*xeth.Block | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | 	eth *JSEthereum | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSBlock) GetTransaction(hash string) otto.Value { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	return self.eth.toVal(self.Block.GetTransaction(hash)) | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 10:47:17 +01:00
										 |  |  | type JSLog struct { | 
					
						
							|  |  |  | 	Address string   `json:address` | 
					
						
							|  |  |  | 	Topics  []string `json:topics` | 
					
						
							|  |  |  | 	Number  int32    `json:number` | 
					
						
							|  |  |  | 	Data    string   `json:data` | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 10:47:17 +01:00
										 |  |  | func NewJSLog(log state.Log) JSLog { | 
					
						
							|  |  |  | 	return JSLog{ | 
					
						
							|  |  |  | 		Address: ethutil.Bytes2Hex(log.Address()), | 
					
						
							|  |  |  | 		Topics:  nil, //ethutil.Bytes2Hex(log.Address()), | 
					
						
							|  |  |  | 		Number:  0, | 
					
						
							|  |  |  | 		Data:    ethutil.Bytes2Hex(log.Data()), | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | type JSEthereum struct { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	*xeth.XEth | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 		return self.toVal(&JSBlock{self.XEth.BlockByNumber(int32(number)), self}) | 
					
						
							| 
									
										
										
										
											2015-01-02 22:19:58 +01:00
										 |  |  | 	} else if hash, ok := v.(string); ok { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 		return self.toVal(&JSBlock{self.XEth.BlockByHash(hash), self}) | 
					
						
							| 
									
										
										
										
											2015-01-02 22:19:58 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return otto.UndefinedValue() | 
					
						
							| 
									
										
										
										
											2014-05-21 12:14:39 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | func (self *JSEthereum) GetStateObject(addr string) otto.Value { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	return self.toVal(&JSStateObject{self.XEth.State().SafeGet(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 { | 
					
						
							| 
									
										
										
										
											2015-01-28 20:50:09 +01:00
										 |  |  | 	r, err := self.XEth.Transact(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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 10:47:17 +01:00
										 |  |  | 	logs := filter.Find() | 
					
						
							|  |  |  | 	var jslogs []JSLog | 
					
						
							|  |  |  | 	for _, m := range logs { | 
					
						
							|  |  |  | 		jslogs = append(jslogs, NewJSLog(m)) | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 10:47:17 +01:00
										 |  |  | 	v, _ := self.vm.ToValue(jslogs) | 
					
						
							| 
									
										
										
										
											2014-08-11 16:24:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return v | 
					
						
							|  |  |  | } |