diff --git a/common/resolver/resolver.go b/common/resolver/resolver.go index 1e6d03ffb..42348a89c 100644 --- a/common/resolver/resolver.go +++ b/common/resolver/resolver.go @@ -24,11 +24,11 @@ var HashRegContractAddress string = "0000000000000000000000000000000000000000000 func CreateContracts(xeth *xe.XEth, addr string) { var err error - URLHintContractAddress, err = xeth.Transact(addr, "", "100000000000", "1000000", "100000", ContractCodeURLhint) + URLHintContractAddress, err = xeth.Transact(addr, "", "", "100000000000", "1000000", "100000", ContractCodeURLhint) if err != nil { panic(err) } - HashRegContractAddress, err = xeth.Transact(addr, "", "100000000000", "1000000", "100000", ContractCodeHashReg) + HashRegContractAddress, err = xeth.Transact(addr, "", "", "100000000000", "1000000", "100000", ContractCodeHashReg) if err != nil { panic(err) } diff --git a/rpc/api.go b/rpc/api.go index 6d3a20bfa..b79a1306e 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -173,7 +173,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return fmt.Errorf("Transaction not confirmed") } - v, err := api.xeth().Transact(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) + // 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) if err != nil { return err } diff --git a/rpc/args.go b/rpc/args.go index 4bd48e6d6..e61f28c4f 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -157,6 +157,7 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) { type NewTxArgs struct { From string To string + Nonce *big.Int Value *big.Int Gas *big.Int GasPrice *big.Int @@ -170,6 +171,7 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { var ext struct { From string To string + Nonce interface{} Value interface{} Gas interface{} GasPrice interface{} @@ -200,6 +202,14 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { args.Data = ext.Data var num *big.Int + if ext.Nonce != nil { + num, err = numString(ext.Nonce) + if err != nil { + return err + } + } + args.Nonce = num + if ext.Value == nil { num = big.NewInt(0) } else { diff --git a/xeth/xeth.go b/xeth/xeth.go index 692fb338c..ac59069d5 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -648,7 +648,7 @@ func (self *XEth) ConfirmTransaction(tx string) bool { } -func (self *XEth) Transact(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { +func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { var ( from = common.HexToAddress(fromStr) to = common.HexToAddress(toStr) @@ -704,7 +704,13 @@ func (self *XEth) Transact(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeSt } state := self.backend.ChainManager().TxState() - nonce := state.NewNonce(from) + + var nonce uint64 + if len(nonceStr) != 0 { + nonce = common.Big(nonceStr).Uint64() + } else { + nonce = state.NewNonce(from) + } tx.SetNonce(nonce) if err := self.sign(tx, from, false); err != nil {