|
|
|
@ -177,19 +177,25 @@ func (self *JSXEth) FromNumber(str string) string { |
|
|
|
|
return ethutil.BigD(ethutil.Hex2Bytes(str)).String() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (*JSReceipt, error) { |
|
|
|
|
var hash []byte |
|
|
|
|
var contractCreation bool |
|
|
|
|
if len(toStr) == 0 { |
|
|
|
|
contractCreation = true |
|
|
|
|
func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { |
|
|
|
|
var ( |
|
|
|
|
to []byte |
|
|
|
|
value = ethutil.NewValue(valueStr) |
|
|
|
|
gas = ethutil.NewValue(gasStr) |
|
|
|
|
gasPrice = ethutil.NewValue(gasPriceStr) |
|
|
|
|
data []byte |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if ethutil.IsHex(codeStr) { |
|
|
|
|
data = ethutil.Hex2Bytes(codeStr[2:]) |
|
|
|
|
} else { |
|
|
|
|
// Check if an address is stored by this address
|
|
|
|
|
addr := self.World().Config().Get("NameReg").StorageString(toStr).Bytes() |
|
|
|
|
if len(addr) > 0 { |
|
|
|
|
hash = addr |
|
|
|
|
} else { |
|
|
|
|
hash = ethutil.Hex2Bytes(toStr) |
|
|
|
|
} |
|
|
|
|
data = ethutil.Hex2Bytes(codeStr) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ethutil.IsHex(toStr) { |
|
|
|
|
to = ethutil.Hex2Bytes(toStr[2:]) |
|
|
|
|
} else { |
|
|
|
|
to = ethutil.Hex2Bytes(toStr) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var keyPair *crypto.KeyPair |
|
|
|
@ -201,47 +207,77 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
value = ethutil.Big(valueStr) |
|
|
|
|
gas = ethutil.Big(gasStr) |
|
|
|
|
gasPrice = ethutil.Big(gasPriceStr) |
|
|
|
|
data []byte |
|
|
|
|
tx *chain.Transaction |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if ethutil.IsHex(codeStr) { |
|
|
|
|
data = ethutil.Hex2Bytes(codeStr[2:]) |
|
|
|
|
} else { |
|
|
|
|
data = ethutil.Hex2Bytes(codeStr) |
|
|
|
|
tx, err := self.XEth.Transact(keyPair, to, value, gas, gasPrice, data) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if contractCreation { |
|
|
|
|
tx = chain.NewContractCreationTx(value, gas, gasPrice, data) |
|
|
|
|
} else { |
|
|
|
|
tx = chain.NewTransactionMessage(hash, value, gas, gasPrice, data) |
|
|
|
|
if chain.IsContractAddr(to) { |
|
|
|
|
return ethutil.Bytes2Hex(tx.CreationAddress(nil)), nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
acc := self.obj.BlockManager().TransState().GetOrNewStateObject(keyPair.Address()) |
|
|
|
|
tx.Nonce = acc.Nonce |
|
|
|
|
acc.Nonce += 1 |
|
|
|
|
self.obj.BlockManager().TransState().UpdateStateObject(acc) |
|
|
|
|
return ethutil.Bytes2Hex(tx.Hash()), nil |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
var hash []byte |
|
|
|
|
var contractCreation bool |
|
|
|
|
if len(toStr) == 0 { |
|
|
|
|
contractCreation = true |
|
|
|
|
} else { |
|
|
|
|
// Check if an address is stored by this address
|
|
|
|
|
addr := self.World().Config().Get("NameReg").StorageString(toStr).Bytes() |
|
|
|
|
if len(addr) > 0 { |
|
|
|
|
hash = addr |
|
|
|
|
} else { |
|
|
|
|
hash = ethutil.Hex2Bytes(toStr) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tx.Sign(keyPair.PrivateKey) |
|
|
|
|
self.obj.TxPool().QueueTransaction(tx) |
|
|
|
|
var ( |
|
|
|
|
value = ethutil.Big(valueStr) |
|
|
|
|
gas = ethutil.Big(gasStr) |
|
|
|
|
gasPrice = ethutil.Big(gasPriceStr) |
|
|
|
|
data []byte |
|
|
|
|
tx *chain.Transaction |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if contractCreation { |
|
|
|
|
pipelogger.Infof("Contract addr %x", tx.CreationAddress(self.World().State())) |
|
|
|
|
} |
|
|
|
|
if ethutil.IsHex(codeStr) { |
|
|
|
|
data = ethutil.Hex2Bytes(codeStr[2:]) |
|
|
|
|
} else { |
|
|
|
|
data = ethutil.Hex2Bytes(codeStr) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return NewJSReciept(contractCreation, tx.CreationAddress(self.World().State()), tx.Hash(), keyPair.Address()), nil |
|
|
|
|
if contractCreation { |
|
|
|
|
tx = chain.NewContractCreationTx(value, gas, gasPrice, data) |
|
|
|
|
} else { |
|
|
|
|
tx = chain.NewTransactionMessage(hash, value, gas, gasPrice, data) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
acc := self.obj.BlockManager().TransState().GetOrNewStateObject(keyPair.Address()) |
|
|
|
|
tx.Nonce = acc.Nonce |
|
|
|
|
acc.Nonce += 1 |
|
|
|
|
self.obj.BlockManager().TransState().UpdateStateObject(acc) |
|
|
|
|
|
|
|
|
|
tx.Sign(keyPair.PrivateKey) |
|
|
|
|
self.obj.TxPool().QueueTransaction(tx) |
|
|
|
|
|
|
|
|
|
if contractCreation { |
|
|
|
|
pipelogger.Infof("Contract addr %x", tx.CreationAddress(self.World().State())) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return NewJSReciept(contractCreation, tx.CreationAddress(self.World().State()), tx.Hash(), keyPair.Address()), nil |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *JSXEth) PushTx(txStr string) (*JSReceipt, error) { |
|
|
|
|
tx := chain.NewTransactionFromBytes(ethutil.Hex2Bytes(txStr)) |
|
|
|
|
self.obj.TxPool().QueueTransaction(tx) |
|
|
|
|
err := self.obj.TxPool().Add(tx) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
return NewJSReciept(tx.CreatesContract(), tx.CreationAddress(self.World().State()), tx.Hash(), tx.Sender()), nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|