| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | package rpc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-05-18 10:09:00 -05:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-16 14:46:46 -04:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2015-05-22 15:38:46 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/vm" | 
					
						
							| 
									
										
										
										
											2015-01-29 00:24:00 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							| 
									
										
										
										
											2015-04-09 18:16:22 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/xeth" | 
					
						
							| 
									
										
										
										
											2014-10-21 13:24:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | type EthereumApi struct { | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 	eth *xeth.XEth | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 09:36:18 +01:00
										 |  |  | func NewEthereumApi(xeth *xeth.XEth) *EthereumApi { | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	api := &EthereumApi{ | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 		eth: xeth, | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return api | 
					
						
							| 
									
										
										
										
											2015-01-25 14:50:43 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | func (api *EthereumApi) xeth() *xeth.XEth { | 
					
						
							|  |  |  | 	return api.eth | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | func (api *EthereumApi) xethAtStateNum(num int64) *xeth.XEth { | 
					
						
							|  |  |  | 	return api.xeth().AtStateNum(num) | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error { | 
					
						
							| 
									
										
										
										
											2015-03-25 12:09:55 +01:00
										 |  |  | 	// Spec at https://github.com/ethereum/wiki/wiki/JSON-RPC | 
					
						
							| 
									
										
										
										
											2015-04-09 18:16:22 +02:00
										 |  |  | 	glog.V(logger.Debug).Infof("%s %s", req.Method, req.Params) | 
					
						
							| 
									
										
										
										
											2015-03-20 15:25:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 	switch req.Method { | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "web3_sha3": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(Sha3Args) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-16 15:17:19 +01:00
										 |  |  | 		*reply = common.ToHex(crypto.Sha3(common.FromHex(args.Data))) | 
					
						
							| 
									
										
										
										
											2015-03-12 19:20:46 -05:00
										 |  |  | 	case "web3_clientVersion": | 
					
						
							| 
									
										
										
										
											2015-03-24 16:33:37 +01:00
										 |  |  | 		*reply = api.xeth().ClientVersion() | 
					
						
							| 
									
										
										
										
											2015-03-12 19:20:46 -05:00
										 |  |  | 	case "net_version": | 
					
						
							| 
									
										
										
										
											2015-03-24 16:33:37 +01:00
										 |  |  | 		*reply = api.xeth().NetworkVersion() | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "net_listening": | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().IsListening() | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "net_peerCount": | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 		*reply = newHexNum(api.xeth().PeerCount()) | 
					
						
							| 
									
										
										
										
											2015-04-22 13:42:09 -05:00
										 |  |  | 	case "eth_protocolVersion": | 
					
						
							| 
									
										
										
										
											2015-03-25 12:09:55 +01:00
										 |  |  | 		*reply = api.xeth().EthVersion() | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 	case "eth_coinbase": | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 		*reply = newHexData(api.xeth().Coinbase()) | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 	case "eth_mining": | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().IsMining() | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_gasPrice": | 
					
						
							| 
									
										
										
										
											2015-04-27 13:58:32 -05:00
										 |  |  | 		v := xeth.DefaultGasPrice() | 
					
						
							|  |  |  | 		*reply = newHexNum(v.Bytes()) | 
					
						
							| 
									
										
										
										
											2015-01-29 20:39:26 +01:00
										 |  |  | 	case "eth_accounts": | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().Accounts() | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_blockNumber": | 
					
						
							| 
									
										
										
										
											2015-03-24 16:33:37 +01:00
										 |  |  | 		v := api.xeth().CurrentBlock().Number() | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 		*reply = newHexNum(v.Bytes()) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getBalance": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(GetBalanceArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-19 20:00:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 12:57:04 +02:00
										 |  |  | 		*reply = api.xethAtStateNum(args.BlockNumber).BalanceAt(args.Address) | 
					
						
							|  |  |  | 		//v := api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address).Balance() | 
					
						
							|  |  |  | 		//*reply = common.ToHex(v.Bytes()) | 
					
						
							| 
									
										
										
										
											2015-03-10 20:14:38 +01:00
										 |  |  | 	case "eth_getStorage", "eth_storageAt": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(GetStorageArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 20:39:26 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-19 20:02:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-26 22:35:42 +01:00
										 |  |  | 		*reply = api.xethAtStateNum(args.BlockNumber).State().SafeGet(args.Address).Storage() | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getStorageAt": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(GetStorageAtArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 13:45:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-01 23:22:03 +02:00
										 |  |  | 		*reply = api.xethAtStateNum(args.BlockNumber).StorageAt(args.Address, args.Key) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getTransactionCount": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(GetTxCountArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-19 20:03:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 22:22:13 +03:00
										 |  |  | 		count := api.xethAtStateNum(args.BlockNumber).TxCountAt(args.Address) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexNum(big.NewInt(int64(count)).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getBlockTransactionCountByHash": | 
					
						
							| 
									
										
										
										
											2015-04-02 13:17:55 +02:00
										 |  |  | 		args := new(HashArgs) | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 13:17:55 +02:00
										 |  |  | 		block := NewBlockRes(api.xeth().EthBlockByHash(args.Hash), false) | 
					
						
							| 
									
										
										
										
											2015-04-02 20:37:51 +02:00
										 |  |  | 		if block == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 			*reply = newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-04-02 20:37:51 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getBlockTransactionCountByNumber": | 
					
						
							| 
									
										
										
										
											2015-04-02 13:17:55 +02:00
										 |  |  | 		args := new(BlockNumArg) | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		block := NewBlockRes(api.xeth().EthBlockByNumber(args.BlockNumber), false) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 		if block == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getUncleCountByBlockHash": | 
					
						
							| 
									
										
										
										
											2015-04-02 13:17:55 +02:00
										 |  |  | 		args := new(HashArgs) | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 13:17:55 +02:00
										 |  |  | 		block := api.xeth().EthBlockByHash(args.Hash) | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		br := NewBlockRes(block, false) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 		if br == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexNum(big.NewInt(int64(len(br.Uncles))).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getUncleCountByBlockNumber": | 
					
						
							| 
									
										
										
										
											2015-04-02 13:17:55 +02:00
										 |  |  | 		args := new(BlockNumArg) | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		block := api.xeth().EthBlockByNumber(args.BlockNumber) | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		br := NewBlockRes(block, false) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 		if br == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexNum(big.NewInt(int64(len(br.Uncles))).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-14 18:57:12 +01:00
										 |  |  | 	case "eth_getData", "eth_getCode": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(GetDataArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-02 13:38:12 +02:00
										 |  |  | 		v := api.xethAtStateNum(args.BlockNumber).CodeAtBytes(args.Address) | 
					
						
							|  |  |  | 		*reply = newHexData(v) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 13:00:04 +02:00
										 |  |  | 	case "eth_sign": | 
					
						
							|  |  |  | 		args := new(NewSigArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		v, err := api.xeth().Sign(args.From, args.Data, false) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		*reply = v | 
					
						
							| 
									
										
										
										
											2015-05-08 16:17:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-10 20:28:20 +01:00
										 |  |  | 	case "eth_sendTransaction", "eth_transact": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(NewTxArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 12:01:51 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 07:15:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-05 23:08:52 +02:00
										 |  |  | 		// nonce may be nil ("guess" mode) | 
					
						
							|  |  |  | 		var nonce string | 
					
						
							|  |  |  | 		if args.Nonce != nil { | 
					
						
							|  |  |  | 			nonce = args.Nonce.String() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		v, err := api.xeth().Transact(args.From, args.To, nonce, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) | 
					
						
							| 
									
										
										
										
											2015-03-20 07:15:34 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		*reply = v | 
					
						
							| 
									
										
										
										
											2015-05-12 14:14:08 +02:00
										 |  |  | 	case "eth_estimateGas": | 
					
						
							|  |  |  | 		_, gas, err := api.doCall(req.Params) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 13:10:34 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 06:58:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:14:08 +02:00
										 |  |  | 		// TODO unwrap the parent method's ToHex call | 
					
						
							|  |  |  | 		if len(gas) == 0 { | 
					
						
							| 
									
										
										
										
											2015-05-12 15:02:44 +02:00
										 |  |  | 			*reply = newHexNum(0) | 
					
						
							| 
									
										
										
										
											2015-05-12 14:14:08 +02:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-05-12 15:02:44 +02:00
										 |  |  | 			*reply = newHexNum(gas) | 
					
						
							| 
									
										
										
										
											2015-05-12 14:14:08 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	case "eth_call": | 
					
						
							|  |  |  | 		v, _, err := api.doCall(req.Params) | 
					
						
							| 
									
										
										
										
											2015-03-20 06:58:53 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-12 14:14:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-15 12:45:20 -05:00
										 |  |  | 		// TODO unwrap the parent method's ToHex call | 
					
						
							| 
									
										
										
										
											2015-04-22 14:14:10 -05:00
										 |  |  | 		if v == "0x0" { | 
					
						
							|  |  |  | 			*reply = newHexData([]byte{}) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			*reply = newHexData(common.FromHex(v)) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_flush": | 
					
						
							| 
									
										
										
										
											2015-03-12 19:07:03 -05:00
										 |  |  | 		return NewNotImplementedError(req.Method) | 
					
						
							| 
									
										
										
										
											2015-03-05 11:07:05 -06:00
										 |  |  | 	case "eth_getBlockByHash": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(GetBlockByHashArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-26 22:35:42 +01:00
										 |  |  | 		block := api.xeth().EthBlockByHash(args.BlockHash) | 
					
						
							| 
									
										
										
										
											2015-04-02 12:56:36 +02:00
										 |  |  | 		br := NewBlockRes(block, args.IncludeTxs) | 
					
						
							| 
									
										
										
										
											2015-03-20 06:53:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		*reply = br | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 	case "eth_getBlockByNumber": | 
					
						
							|  |  |  | 		args := new(GetBlockByNumberArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-10 12:52:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		block := api.xeth().EthBlockByNumber(args.BlockNumber) | 
					
						
							| 
									
										
										
										
											2015-04-02 12:56:36 +02:00
										 |  |  | 		br := NewBlockRes(block, args.IncludeTxs) | 
					
						
							| 
									
										
										
										
											2015-05-19 08:14:48 -05:00
										 |  |  | 		// If request was for "pending", nil nonsensical fields | 
					
						
							| 
									
										
										
										
											2015-05-18 09:16:10 -05:00
										 |  |  | 		if args.BlockNumber == -2 { | 
					
						
							|  |  |  | 			br.BlockHash = nil | 
					
						
							|  |  |  | 			br.BlockNumber = nil | 
					
						
							|  |  |  | 			br.Miner = nil | 
					
						
							|  |  |  | 			br.Nonce = nil | 
					
						
							|  |  |  | 			br.LogsBloom = nil | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 06:57:23 +01:00
										 |  |  | 		*reply = br | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getTransactionByHash": | 
					
						
							| 
									
										
										
										
											2015-04-02 14:37:11 +02:00
										 |  |  | 		args := new(HashArgs) | 
					
						
							| 
									
										
										
										
											2015-03-12 15:59:07 +01:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-04-02 14:49:33 +02:00
										 |  |  | 			return err | 
					
						
							| 
									
										
										
										
											2015-03-12 15:59:07 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-31 22:40:12 +02:00
										 |  |  | 		tx, bhash, bnum, txi := api.xeth().EthTransactionByHash(args.Hash) | 
					
						
							| 
									
										
										
										
											2015-03-19 20:12:12 -04:00
										 |  |  | 		if tx != nil { | 
					
						
							| 
									
										
										
										
											2015-03-31 22:40:12 +02:00
										 |  |  | 			v := NewTransactionRes(tx) | 
					
						
							| 
									
										
										
										
											2015-05-18 10:09:00 -05:00
										 |  |  | 			// if the blockhash is 0, assume this is a pending transaction | 
					
						
							| 
									
										
										
										
											2015-05-19 08:14:48 -05:00
										 |  |  | 			if bytes.Compare(bhash.Bytes(), bytes.Repeat([]byte{0}, 32)) != 0 { | 
					
						
							| 
									
										
										
										
											2015-05-18 10:09:00 -05:00
										 |  |  | 				v.BlockHash = newHexData(bhash) | 
					
						
							|  |  |  | 				v.BlockNumber = newHexNum(bnum) | 
					
						
							|  |  |  | 				v.TxIndex = newHexNum(txi) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-03-31 22:40:12 +02:00
										 |  |  | 			*reply = v | 
					
						
							| 
									
										
										
										
											2015-03-19 20:12:12 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getTransactionByBlockHashAndIndex": | 
					
						
							| 
									
										
										
										
											2015-03-10 22:25:07 -05:00
										 |  |  | 		args := new(HashIndexArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-26 22:35:42 +01:00
										 |  |  | 		block := api.xeth().EthBlockByHash(args.Hash) | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		br := NewBlockRes(block, true) | 
					
						
							| 
									
										
										
										
											2015-04-02 14:54:28 +02:00
										 |  |  | 		if br == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 			break | 
					
						
							| 
									
										
										
										
											2015-04-02 14:54:28 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 06:53:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-31 17:56:06 +02:00
										 |  |  | 		if args.Index >= int64(len(br.Transactions)) || args.Index < 0 { | 
					
						
							| 
									
										
										
										
											2015-04-02 16:11:00 +02:00
										 |  |  | 			// return NewValidationError("Index", "does not exist") | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			*reply = br.Transactions[args.Index] | 
					
						
							| 
									
										
										
										
											2015-03-10 22:25:07 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getTransactionByBlockNumberAndIndex": | 
					
						
							| 
									
										
										
										
											2015-03-10 22:25:07 -05:00
										 |  |  | 		args := new(BlockNumIndexArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		block := api.xeth().EthBlockByNumber(args.BlockNumber) | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		v := NewBlockRes(block, true) | 
					
						
							| 
									
										
										
										
											2015-04-02 14:54:28 +02:00
										 |  |  | 		if v == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							| 
									
										
										
										
											2015-04-07 06:10:00 -05:00
										 |  |  | 			break | 
					
						
							| 
									
										
										
										
											2015-04-02 14:54:28 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 06:57:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-31 17:56:06 +02:00
										 |  |  | 		if args.Index >= int64(len(v.Transactions)) || args.Index < 0 { | 
					
						
							| 
									
										
										
										
											2015-04-02 16:11:00 +02:00
										 |  |  | 			// return NewValidationError("Index", "does not exist") | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			*reply = v.Transactions[args.Index] | 
					
						
							| 
									
										
										
										
											2015-03-10 22:25:07 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getUncleByBlockHashAndIndex": | 
					
						
							| 
									
										
										
										
											2015-03-11 10:27:32 -05:00
										 |  |  | 		args := new(HashIndexArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		br := NewBlockRes(api.xeth().EthBlockByHash(args.Hash), false) | 
					
						
							| 
									
										
										
										
											2015-04-02 13:27:58 +02:00
										 |  |  | 		if br == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-20 06:53:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-31 17:56:06 +02:00
										 |  |  | 		if args.Index >= int64(len(br.Uncles)) || args.Index < 0 { | 
					
						
							| 
									
										
										
										
											2015-04-02 16:12:19 +02:00
										 |  |  | 			// return NewValidationError("Index", "does not exist") | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-04-02 17:55:42 +02:00
										 |  |  | 			*reply = br.Uncles[args.Index] | 
					
						
							| 
									
										
										
										
											2015-03-11 10:27:32 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getUncleByBlockNumberAndIndex": | 
					
						
							| 
									
										
										
										
											2015-03-11 10:27:32 -05:00
										 |  |  | 		args := new(BlockNumIndexArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		block := api.xeth().EthBlockByNumber(args.BlockNumber) | 
					
						
							| 
									
										
										
										
											2015-04-01 13:18:30 +02:00
										 |  |  | 		v := NewBlockRes(block, true) | 
					
						
							| 
									
										
										
										
											2015-03-20 06:57:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 13:27:58 +02:00
										 |  |  | 		if v == nil { | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-31 17:56:06 +02:00
										 |  |  | 		if args.Index >= int64(len(v.Uncles)) || args.Index < 0 { | 
					
						
							| 
									
										
										
										
											2015-04-02 16:12:19 +02:00
										 |  |  | 			// return NewValidationError("Index", "does not exist") | 
					
						
							|  |  |  | 			*reply = nil | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-04-02 17:55:42 +02:00
										 |  |  | 			*reply = v.Uncles[args.Index] | 
					
						
							| 
									
										
										
										
											2015-03-11 10:27:32 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getCompilers": | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 		var lang string | 
					
						
							|  |  |  | 		if solc, _ := api.xeth().Solc(); solc != nil { | 
					
						
							|  |  |  | 			lang = "Solidity" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		c := []string{lang} | 
					
						
							| 
									
										
										
										
											2015-03-19 20:04:40 -04:00
										 |  |  | 		*reply = c | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	case "eth_compileLLL", "eth_compileSerpent": | 
					
						
							| 
									
										
										
										
											2015-03-12 19:07:03 -05:00
										 |  |  | 		return NewNotImplementedError(req.Method) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	case "eth_compileSolidity": | 
					
						
							|  |  |  | 		solc, _ := api.xeth().Solc() | 
					
						
							|  |  |  | 		if solc == nil { | 
					
						
							| 
									
										
										
										
											2015-05-20 05:29:28 +01:00
										 |  |  | 			return NewNotAvailableError(req.Method, "solc (solidity compiler) not found") | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		args := new(SourceArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-20 04:11:48 +01:00
										 |  |  | 		contracts, err := solc.Compile(args.Source) | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-20 04:11:48 +01:00
										 |  |  | 		*reply = contracts | 
					
						
							| 
									
										
										
										
											2015-04-22 23:11:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_newFilter": | 
					
						
							| 
									
										
										
										
											2015-03-19 23:55:17 -04:00
										 |  |  | 		args := new(BlockFilterArgs) | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-02-05 11:55:03 -08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-19 23:03:53 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 17:51:32 +02:00
										 |  |  | 		id := api.xeth().NewLogFilter(args.Earliest, args.Latest, args.Skip, args.Max, args.Address, args.Topics) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexNum(big.NewInt(int64(id)).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-05-06 17:51:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 11:07:05 -06:00
										 |  |  | 	case "eth_newBlockFilter": | 
					
						
							| 
									
										
										
										
											2015-05-06 17:51:32 +02:00
										 |  |  | 		*reply = newHexNum(api.xeth().NewBlockFilter()) | 
					
						
							| 
									
										
										
										
											2015-05-07 13:56:19 +02:00
										 |  |  | 	case "eth_newPendingTransactionFilter": | 
					
						
							| 
									
										
										
										
											2015-05-06 17:51:32 +02:00
										 |  |  | 		*reply = newHexNum(api.xeth().NewTransactionFilter()) | 
					
						
							| 
									
										
										
										
											2015-02-19 13:21:37 +01:00
										 |  |  | 	case "eth_uninstallFilter": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(FilterIdArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-02-19 13:21:37 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().UninstallFilter(args.Id) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getFilterChanges": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(FilterIdArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-06 17:51:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		switch api.xeth().GetFilterType(args.Id) { | 
					
						
							|  |  |  | 		case xeth.BlockFilterTy: | 
					
						
							|  |  |  | 			*reply = NewHashesRes(api.xeth().BlockFilterChanged(args.Id)) | 
					
						
							|  |  |  | 		case xeth.TransactionFilterTy: | 
					
						
							|  |  |  | 			*reply = NewHashesRes(api.xeth().TransactionFilterChanged(args.Id)) | 
					
						
							|  |  |  | 		case xeth.LogFilterTy: | 
					
						
							|  |  |  | 			*reply = NewLogsRes(api.xeth().LogFilterChanged(args.Id)) | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			*reply = []string{} // reply empty string slice | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getFilterLogs": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(FilterIdArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-02-17 22:46:30 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = NewLogsRes(api.xeth().Logs(args.Id)) | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "eth_getLogs": | 
					
						
							| 
									
										
										
										
											2015-03-19 23:55:17 -04:00
										 |  |  | 		args := new(BlockFilterArgs) | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-02-22 13:12:01 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-27 16:36:01 +01:00
										 |  |  | 		*reply = NewLogsRes(api.xeth().AllLogs(args.Earliest, args.Latest, args.Skip, args.Max, args.Address, args.Topics)) | 
					
						
							| 
									
										
										
										
											2015-03-22 15:38:01 +01:00
										 |  |  | 	case "eth_getWork": | 
					
						
							| 
									
										
										
										
											2015-05-11 15:43:14 +02:00
										 |  |  | 		api.xeth().SetMining(true, 0) | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 		*reply = api.xeth().RemoteMining().GetWork() | 
					
						
							| 
									
										
										
										
											2015-03-22 15:38:01 +01:00
										 |  |  | 	case "eth_submitWork": | 
					
						
							| 
									
										
										
										
											2015-03-23 08:28:54 +01:00
										 |  |  | 		args := new(SubmitWorkArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-26 22:35:42 +01:00
										 |  |  | 		*reply = api.xeth().RemoteMining().SubmitWork(args.Nonce, common.HexToHash(args.Digest), common.HexToHash(args.Header)) | 
					
						
							| 
									
										
										
										
											2015-03-13 10:56:41 -04:00
										 |  |  | 	case "db_putString": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(DbArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 20:39:26 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-19 20:05:48 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if err := args.requirements(); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 09:36:18 +01:00
										 |  |  | 		api.xeth().DbPut([]byte(args.Database+args.Key), args.Value) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 20:05:48 -04:00
										 |  |  | 		*reply = true | 
					
						
							| 
									
										
										
										
											2015-03-13 10:56:41 -04:00
										 |  |  | 	case "db_getString": | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(DbArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-29 20:39:26 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-19 20:09:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 20:06:35 -04:00
										 |  |  | 		if err := args.requirements(); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 09:36:18 +01:00
										 |  |  | 		res, _ := api.xeth().DbGet([]byte(args.Database + args.Key)) | 
					
						
							| 
									
										
										
										
											2015-03-19 20:06:35 -04:00
										 |  |  | 		*reply = string(res) | 
					
						
							| 
									
										
										
										
											2015-03-23 16:04:21 +01:00
										 |  |  | 	case "db_putHex": | 
					
						
							|  |  |  | 		args := new(DbHexArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err := args.requirements(); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 09:36:18 +01:00
										 |  |  | 		api.xeth().DbPut([]byte(args.Database+args.Key), args.Value) | 
					
						
							| 
									
										
										
										
											2015-03-23 16:04:21 +01:00
										 |  |  | 		*reply = true | 
					
						
							|  |  |  | 	case "db_getHex": | 
					
						
							|  |  |  | 		args := new(DbHexArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err := args.requirements(); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 09:36:18 +01:00
										 |  |  | 		res, _ := api.xeth().DbGet([]byte(args.Database + args.Key)) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexData(res) | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-25 12:09:55 +01:00
										 |  |  | 	case "shh_version": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		// Retrieves the currently running whisper protocol version | 
					
						
							| 
									
										
										
										
											2015-03-25 12:09:55 +01:00
										 |  |  | 		*reply = api.xeth().WhisperVersion() | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "shh_post": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		// Injects a new message into the whisper network | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(WhisperMessageArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		err := api.xeth().Whisper().Post(args.Payload, args.To, args.From, args.Topics, args.Priority, args.Ttl) | 
					
						
							| 
									
										
										
										
											2015-03-19 20:40:50 -04:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		*reply = true | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 	case "shh_newIdentity": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		// Creates a new whisper identity to use for sending/receiving messages | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().Whisper().NewIdentity() | 
					
						
							| 
									
										
										
										
											2015-04-21 18:31:08 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "shh_hasIdentity": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		// Checks if an identity if owned or not | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(WhisperIdentityArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().Whisper().HasIdentity(args.Identity) | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 	case "shh_newFilter": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-21 18:31:08 +03:00
										 |  |  | 		// Create a new filter to watch and match messages with | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(WhisperFilterArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 		id := api.xeth().NewWhisperFilter(args.To, args.From, args.Topics) | 
					
						
							| 
									
										
										
										
											2015-04-07 06:49:31 -05:00
										 |  |  | 		*reply = newHexNum(big.NewInt(int64(id)).Bytes()) | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 08:58:46 -06:00
										 |  |  | 	case "shh_uninstallFilter": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		// Remove an existing filter watching messages | 
					
						
							| 
									
										
										
										
											2015-03-11 15:49:21 -05:00
										 |  |  | 		args := new(FilterIdArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 		*reply = api.xeth().UninstallWhisperFilter(args.Id) | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 11:07:05 -06:00
										 |  |  | 	case "shh_getFilterChanges": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 		// Retrieve all the new messages arrived since the last request | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(FilterIdArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		*reply = api.xeth().WhisperMessagesChanged(args.Id) | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-30 13:47:18 +01:00
										 |  |  | 	case "shh_getMessages": | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 		// Short circuit if whisper is not running | 
					
						
							|  |  |  | 		if api.xeth().Whisper() == nil { | 
					
						
							|  |  |  | 			return NewNotAvailableError(req.Method, "whisper offline") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-17 16:45:44 +03:00
										 |  |  | 		// Retrieve all the cached messages matching a specific, existing filter | 
					
						
							| 
									
										
										
										
											2015-03-05 21:37:45 -06:00
										 |  |  | 		args := new(FilterIdArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-01-30 13:47:18 +01:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-04-22 18:35:50 +03:00
										 |  |  | 		*reply = api.xeth().WhisperMessages(args.Id) | 
					
						
							| 
									
										
										
										
											2015-05-11 11:53:53 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-28 11:16:03 +02:00
										 |  |  | 	case "eth_hashrate": | 
					
						
							| 
									
										
										
										
											2015-04-21 16:44:02 +03:00
										 |  |  | 		*reply = newHexNum(api.xeth().HashRate()) | 
					
						
							| 
									
										
										
										
											2015-05-22 15:38:46 +02:00
										 |  |  | 	case "ext_disasm": | 
					
						
							|  |  |  | 		args := new(SourceArgs) | 
					
						
							|  |  |  | 		if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		*reply = vm.Disasm(common.FromHex(args.Source)) | 
					
						
							| 
									
										
										
										
											2015-03-22 15:38:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 21:48:03 -06:00
										 |  |  | 	// case "eth_register": | 
					
						
							| 
									
										
										
										
											2015-03-20 14:12:07 +01:00
										 |  |  | 	// 	// Placeholder for actual type | 
					
						
							|  |  |  | 	// 	args := new(HashIndexArgs) | 
					
						
							|  |  |  | 	// 	if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 21:48:03 -06:00
										 |  |  | 	// 		return err | 
					
						
							|  |  |  | 	// 	} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 	// 	*reply = api.xeth().Register(args.Hash) | 
					
						
							| 
									
										
										
										
											2015-03-05 21:48:03 -06:00
										 |  |  | 	// case "eth_unregister": | 
					
						
							| 
									
										
										
										
											2015-03-20 14:12:07 +01:00
										 |  |  | 	// 	args := new(HashIndexArgs) | 
					
						
							|  |  |  | 	// 	if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 21:48:03 -06:00
										 |  |  | 	// 		return err | 
					
						
							|  |  |  | 	// 	} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 	// 	*reply = api.xeth().Unregister(args.Hash) | 
					
						
							| 
									
										
										
										
											2015-03-05 21:48:03 -06:00
										 |  |  | 	// case "eth_watchTx": | 
					
						
							| 
									
										
										
										
											2015-03-20 14:12:07 +01:00
										 |  |  | 	// 	args := new(HashIndexArgs) | 
					
						
							|  |  |  | 	// 	if err := json.Unmarshal(req.Params, &args); err != nil { | 
					
						
							| 
									
										
										
										
											2015-03-05 21:48:03 -06:00
										 |  |  | 	// 		return err | 
					
						
							|  |  |  | 	// 	} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:24:52 +01:00
										 |  |  | 	// 	*reply = api.xeth().PullWatchTx(args.Hash) | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2015-03-12 19:07:03 -05:00
										 |  |  | 		return NewNotImplementedError(req.Method) | 
					
						
							| 
									
										
										
										
											2015-01-20 13:58:51 -06:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-18 10:11:27 -05:00
										 |  |  | 	// glog.V(logger.Detail).Infof("Reply: %v\n", reply) | 
					
						
							| 
									
										
										
										
											2015-01-13 09:27:36 -06:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-12 14:14:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (api *EthereumApi) doCall(params json.RawMessage) (string, string, error) { | 
					
						
							|  |  |  | 	args := new(CallArgs) | 
					
						
							|  |  |  | 	if err := json.Unmarshal(params, &args); err != nil { | 
					
						
							|  |  |  | 		return "", "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return api.xethAtStateNum(args.BlockNumber).Call(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) | 
					
						
							|  |  |  | } |