| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | package xeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * eXtended ETHereum | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-08-04 16:25:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/event" | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							| 
									
										
										
										
											2015-02-17 12:24:51 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/miner" | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/p2p" | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/whisper" | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-08-04 16:25:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 14:30:08 +01:00
										 |  |  | var pipelogger = logger.NewLogger("XETH") | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // to resolve the import cycle | 
					
						
							|  |  |  | type Backend interface { | 
					
						
							|  |  |  | 	BlockProcessor() *core.BlockProcessor | 
					
						
							|  |  |  | 	ChainManager() *core.ChainManager | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	TxPool() *core.TxPool | 
					
						
							|  |  |  | 	PeerCount() int | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	IsListening() bool | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	Peers() []*p2p.Peer | 
					
						
							|  |  |  | 	KeyManager() *crypto.KeyManager | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	Db() ethutil.Database | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	EventMux() *event.TypeMux | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 	Whisper() *whisper.Whisper | 
					
						
							| 
									
										
										
										
											2015-02-17 12:24:51 +01:00
										 |  |  | 	Miner() *miner.Miner | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | type XEth struct { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	eth            Backend | 
					
						
							|  |  |  | 	blockProcessor *core.BlockProcessor | 
					
						
							|  |  |  | 	chainManager   *core.ChainManager | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	state          *State | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 	whisper        *Whisper | 
					
						
							| 
									
										
										
										
											2015-02-17 12:24:51 +01:00
										 |  |  | 	miner          *miner.Miner | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func New(eth Backend) *XEth { | 
					
						
							|  |  |  | 	xeth := &XEth{ | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 		eth:            eth, | 
					
						
							|  |  |  | 		blockProcessor: eth.BlockProcessor(), | 
					
						
							|  |  |  | 		chainManager:   eth.ChainManager(), | 
					
						
							| 
									
										
										
										
											2015-01-30 13:25:12 +01:00
										 |  |  | 		whisper:        NewWhisper(eth.Whisper()), | 
					
						
							| 
									
										
										
										
											2015-02-17 12:24:51 +01:00
										 |  |  | 		miner:          eth.Miner(), | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-01-29 16:52:00 +01:00
										 |  |  | 	xeth.state = NewState(xeth) | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return xeth | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-17 12:24:51 +01:00
										 |  |  | func (self *XEth) Backend() Backend    { return self.eth } | 
					
						
							|  |  |  | func (self *XEth) State() *State       { return self.state } | 
					
						
							|  |  |  | func (self *XEth) Whisper() *Whisper   { return self.whisper } | 
					
						
							|  |  |  | func (self *XEth) Miner() *miner.Miner { return self.miner } | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) BlockByHash(strHash string) *Block { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	hash := fromHex(strHash) | 
					
						
							|  |  |  | 	block := self.chainManager.GetBlock(hash) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	return NewBlock(block) | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) BlockByNumber(num int32) *Block { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	if num == -1 { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 		return NewBlock(self.chainManager.CurrentBlock()) | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | 	return NewBlock(self.chainManager.GetBlockByNumber(uint64(num))) | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) Block(v interface{}) *Block { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	if n, ok := v.(int32); ok { | 
					
						
							|  |  |  | 		return self.BlockByNumber(n) | 
					
						
							|  |  |  | 	} else if str, ok := v.(string); ok { | 
					
						
							|  |  |  | 		return self.BlockByHash(str) | 
					
						
							|  |  |  | 	} else if f, ok := v.(float64); ok { // Don't ask ... | 
					
						
							|  |  |  | 		return self.BlockByNumber(int32(f)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) Accounts() []string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return []string{toHex(self.eth.KeyManager().Address())} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) PeerCount() int { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return self.eth.PeerCount() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) IsMining() bool { | 
					
						
							| 
									
										
										
										
											2015-02-17 12:24:51 +01:00
										 |  |  | 	return self.miner.Mining() | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) IsListening() bool { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return self.eth.IsListening() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) Coinbase() string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return toHex(self.eth.KeyManager().Address()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) NumberToHuman(balance string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	b := ethutil.Big(balance) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ethutil.CurrencyToString(b) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) StorageAt(addr, storageAddr string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	storage := self.State().SafeGet(addr).StorageString(storageAddr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return toHex(storage.Bytes()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) BalanceAt(addr string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return self.State().SafeGet(addr).Balance().String() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) TxCountAt(address string) int { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return int(self.State().SafeGet(address).Nonce) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) CodeAt(address string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return toHex(self.State().SafeGet(address).Code) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) IsContract(address string) bool { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return len(self.State().SafeGet(address).Code) > 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) SecretToAddress(key string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	pair, err := crypto.NewKeyPairFromSec(fromHex(key)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return toHex(pair.Address()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) Execute(addr, value, gas, price, data string) (string, error) { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	return "", nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type KeyVal struct { | 
					
						
							|  |  |  | 	Key   string `json:"key"` | 
					
						
							|  |  |  | 	Value string `json:"value"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) EachStorage(addr string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	var values []KeyVal | 
					
						
							|  |  |  | 	object := self.State().SafeGet(addr) | 
					
						
							|  |  |  | 	it := object.Trie().Iterator() | 
					
						
							|  |  |  | 	for it.Next() { | 
					
						
							|  |  |  | 		values = append(values, KeyVal{toHex(it.Key), toHex(it.Value)}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	valuesJson, err := json.Marshal(values) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return string(valuesJson) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) ToAscii(str string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	padded := ethutil.RightPadBytes([]byte(str), 32) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return "0x" + toHex(padded) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) FromAscii(str string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	if ethutil.IsHex(str) { | 
					
						
							|  |  |  | 		str = str[2:] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return string(bytes.Trim(fromHex(str), "\x00")) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) FromNumber(str string) string { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	if ethutil.IsHex(str) { | 
					
						
							|  |  |  | 		str = str[2:] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ethutil.BigD(fromHex(str)).String() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 18:35:49 +01:00
										 |  |  | func (self *XEth) PushTx(encodedTx string) (string, error) { | 
					
						
							| 
									
										
										
										
											2015-01-28 18:25:50 +01:00
										 |  |  | 	tx := types.NewTransactionFromBytes(fromHex(encodedTx)) | 
					
						
							|  |  |  | 	err := self.eth.TxPool().Add(tx) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if tx.To() == nil { | 
					
						
							|  |  |  | 		addr := core.AddressFromMessage(tx) | 
					
						
							|  |  |  | 		return toHex(addr), nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return toHex(tx.Hash()), nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-28 20:50:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 13:10:34 +01:00
										 |  |  | func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) { | 
					
						
							|  |  |  | 	if len(gasStr) == 0 { | 
					
						
							|  |  |  | 		gasStr = "100000" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(gasPriceStr) == 0 { | 
					
						
							|  |  |  | 		gasPriceStr = "1" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var ( | 
					
						
							| 
									
										
										
										
											2015-02-01 15:29:57 +01:00
										 |  |  | 		statedb = self.chainManager.TransState() | 
					
						
							|  |  |  | 		key     = self.eth.KeyManager().KeyPair() | 
					
						
							| 
									
										
										
										
											2015-02-17 22:20:47 +01:00
										 |  |  | 		from    = statedb.GetOrNewStateObject(key.Address()) | 
					
						
							| 
									
										
										
										
											2015-02-01 15:29:57 +01:00
										 |  |  | 		block   = self.chainManager.CurrentBlock() | 
					
						
							|  |  |  | 		to      = statedb.GetOrNewStateObject(fromHex(toStr)) | 
					
						
							|  |  |  | 		data    = fromHex(dataStr) | 
					
						
							|  |  |  | 		gas     = ethutil.Big(gasStr) | 
					
						
							|  |  |  | 		price   = ethutil.Big(gasPriceStr) | 
					
						
							|  |  |  | 		value   = ethutil.Big(valueStr) | 
					
						
							| 
									
										
										
										
											2015-01-29 13:10:34 +01:00
										 |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-01 15:29:57 +01:00
										 |  |  | 	msg := types.NewTransactionMessage(fromHex(toStr), value, gas, price, data) | 
					
						
							|  |  |  | 	msg.Sign(key.PrivateKey) | 
					
						
							|  |  |  | 	vmenv := core.NewEnv(statedb, self.chainManager, msg, block) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res, err := vmenv.Call(from, to.Address(), data, gas, price, value) | 
					
						
							| 
									
										
										
										
											2015-01-29 13:10:34 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return toHex(res), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 20:50:09 +01:00
										 |  |  | func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var ( | 
					
						
							|  |  |  | 		to               []byte | 
					
						
							|  |  |  | 		value            = ethutil.NewValue(valueStr) | 
					
						
							|  |  |  | 		gas              = ethutil.NewValue(gasStr) | 
					
						
							|  |  |  | 		price            = ethutil.NewValue(gasPriceStr) | 
					
						
							|  |  |  | 		data             []byte | 
					
						
							|  |  |  | 		key              = self.eth.KeyManager().KeyPair() | 
					
						
							|  |  |  | 		contractCreation bool | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	data = fromHex(codeStr) | 
					
						
							|  |  |  | 	to = fromHex(toStr) | 
					
						
							|  |  |  | 	if len(to) == 0 { | 
					
						
							|  |  |  | 		contractCreation = true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var tx *types.Transaction | 
					
						
							|  |  |  | 	if contractCreation { | 
					
						
							|  |  |  | 		tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		tx = types.NewTransactionMessage(to, value.BigInt(), gas.BigInt(), price.BigInt(), data) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	state := self.chainManager.TransState() | 
					
						
							|  |  |  | 	nonce := state.GetNonce(key.Address()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tx.SetNonce(nonce) | 
					
						
							|  |  |  | 	tx.Sign(key.PrivateKey) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Do some pre processing for our "pre" events  and hooks | 
					
						
							|  |  |  | 	block := self.chainManager.NewBlock(key.Address()) | 
					
						
							|  |  |  | 	coinbase := state.GetOrNewStateObject(key.Address()) | 
					
						
							|  |  |  | 	coinbase.SetGasPool(block.GasLimit()) | 
					
						
							|  |  |  | 	self.blockProcessor.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err := self.eth.TxPool().Add(tx) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "", err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	state.SetNonce(key.Address(), nonce+1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if contractCreation { | 
					
						
							|  |  |  | 		addr := core.AddressFromMessage(tx) | 
					
						
							|  |  |  | 		pipelogger.Infof("Contract addr %x\n", addr) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if types.IsContractAddr(to) { | 
					
						
							|  |  |  | 		return toHex(core.AddressFromMessage(tx)), nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return toHex(tx.Hash()), nil | 
					
						
							|  |  |  | } |