| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"github.com/ethereum/eth-go" | 
					
						
							|  |  |  | 	"github.com/ethereum/eth-go/ethpub" | 
					
						
							| 
									
										
										
										
											2014-05-20 17:49:12 +02:00
										 |  |  | 	"github.com/obscuren/otto" | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Repl interface { | 
					
						
							|  |  |  | 	Start() | 
					
						
							|  |  |  | 	Stop() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type JSRepl struct { | 
					
						
							|  |  |  | 	re *JSRE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	prompt string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { | 
					
						
							|  |  |  | 	return &JSRepl{re: NewJSRE(ethereum), prompt: "> "} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSRepl) Start() { | 
					
						
							|  |  |  | 	self.read() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSRepl) Stop() { | 
					
						
							|  |  |  | 	self.re.Stop() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSRepl) parseInput(code string) { | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if r := recover(); r != nil { | 
					
						
							|  |  |  | 			fmt.Println("[native] error", r) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	value, err := self.re.Run(code) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		fmt.Println(err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	self.PrintValue(value) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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 { | 
					
						
							|  |  |  | 	*ethpub.PBlock | 
					
						
							|  |  |  | 	eth *JSEthereum | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSBlock) GetTransaction(hash string) otto.Value { | 
					
						
							|  |  |  | 	return self.eth.toVal(self.PBlock.GetTransaction(hash)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | type JSEthereum struct { | 
					
						
							|  |  |  | 	*ethpub.PEthereum | 
					
						
							|  |  |  | 	vm *otto.Otto | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-21 12:14:39 +02:00
										 |  |  | func (self *JSEthereum) GetBlock(hash string) otto.Value { | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | 	return self.toVal(&JSBlock{self.PEthereum.GetBlock(hash), self}) | 
					
						
							| 
									
										
										
										
											2014-05-21 12:14:39 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-02 15:16:37 +02:00
										 |  |  | func (self *JSEthereum) GetPeers() otto.Value { | 
					
						
							|  |  |  | 	return self.toVal(self.PEthereum.GetPeers()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 12:48:34 +02:00
										 |  |  | func (self *JSEthereum) GetKey() otto.Value { | 
					
						
							|  |  |  | 	return self.toVal(self.PEthereum.GetKey()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSEthereum) GetStateObject(addr string) otto.Value { | 
					
						
							|  |  |  | 	return self.toVal(self.PEthereum.GetStateObject(addr)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value { | 
					
						
							|  |  |  | 	r, err := self.PEthereum.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		fmt.Println(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return otto.UndefinedValue() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return self.toVal(r) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-23 14:37:03 +02:00
										 |  |  | func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, scriptStr string) otto.Value { | 
					
						
							|  |  |  | 	r, err := self.PEthereum.Create(key, valueStr, gasStr, gasPriceStr, scriptStr) | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							|  |  |  | 		fmt.Println(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return otto.UndefinedValue() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return result | 
					
						
							|  |  |  | } |