From 7e31df39877d95446b48c8064e55ebef48d4e5c6 Mon Sep 17 00:00:00 2001
From: Bas van Kervel <bas@ethdev.com>
Date: Fri, 10 Jul 2015 11:35:15 +0200
Subject: bugfix, pending transaction was resend with new gas price/limit but
 not removed from transaction pool

---
 core/transaction_pool.go      |  5 +++--
 core/transaction_pool_test.go |  2 +-
 rpc/api/eth.go                | 18 +++++++++++-------
 rpc/api/eth_args.go           |  8 ++++++++
 4 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/core/transaction_pool.go b/core/transaction_pool.go
index e02a3a6ac..eb4c374c2 100644
--- a/core/transaction_pool.go
+++ b/core/transaction_pool.go
@@ -356,11 +356,12 @@ func (self *TxPool) RemoveTransactions(txs types.Transactions) {
 	self.mu.Lock()
 	defer self.mu.Unlock()
 	for _, tx := range txs {
-		self.removeTx(tx.Hash())
+		self.RemoveTx(tx.Hash())
 	}
 }
 
-func (pool *TxPool) removeTx(hash common.Hash) {
+// RemoveTx removes the transaction with the given hash from the pool.
+func (pool *TxPool) RemoveTx(hash common.Hash) {
 	// delete from pending pool
 	delete(pool.pending, hash)
 	// delete from queue
diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go
index fdd0a7872..9d4cb40b4 100644
--- a/core/transaction_pool_test.go
+++ b/core/transaction_pool_test.go
@@ -130,7 +130,7 @@ func TestRemoveTx(t *testing.T) {
 		t.Error("expected txs to be 1, got", len(pool.pending))
 	}
 
-	pool.removeTx(tx.Hash())
+	pool.RemoveTx(tx.Hash())
 
 	if len(pool.queue) > 0 {
 		t.Error("expected queue to be 0, got", len(pool.queue))
diff --git a/rpc/api/eth.go b/rpc/api/eth.go
index 6c4745504..3fbb8d755 100644
--- a/rpc/api/eth.go
+++ b/rpc/api/eth.go
@@ -21,8 +21,9 @@ import (
 	"encoding/json"
 	"math/big"
 
+	"fmt"
+
 	"github.com/ethereum/go-ethereum/common"
-	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/rpc/codec"
 	"github.com/ethereum/go-ethereum/rpc/shared"
@@ -578,14 +579,17 @@ func (self *ethApi) Resend(req *shared.Request) (interface{}, error) {
 		return nil, shared.NewDecodeParamError(err.Error())
 	}
 
-	ret, err := self.xeth.Transact(args.Tx.From, args.Tx.To, args.Tx.Nonce, args.Tx.Value, args.GasLimit, args.GasPrice, args.Tx.Data)
-	if err != nil {
-		return nil, err
-	}
+	from := common.HexToAddress(args.Tx.From)
 
-	self.ethereum.TxPool().RemoveTransactions(types.Transactions{args.Tx.tx})
+	pending := self.ethereum.TxPool().GetTransactions()
+	for _, p := range pending {
+		if pFrom, err := p.From(); err == nil && pFrom == from && p.SigHash() == args.Tx.tx.SigHash() {
+			self.ethereum.TxPool().RemoveTx(common.HexToHash(args.Tx.Hash))
+			return self.xeth.Transact(args.Tx.From, args.Tx.To, args.Tx.Nonce, args.Tx.Value, args.GasLimit, args.GasPrice, args.Tx.Data)
+		}
+	}
 
-	return ret, nil
+	return nil, fmt.Errorf("Transaction %s not found", args.Tx.Hash)
 }
 
 func (self *ethApi) PendingTransactions(req *shared.Request) (interface{}, error) {
diff --git a/rpc/api/eth_args.go b/rpc/api/eth_args.go
index f63b43334..5d0ec8ec4 100644
--- a/rpc/api/eth_args.go
+++ b/rpc/api/eth_args.go
@@ -888,6 +888,7 @@ type tx struct {
 	Data     string
 	GasLimit string
 	GasPrice string
+	Hash     string
 }
 
 func newTx(t *types.Transaction) *tx {
@@ -906,6 +907,7 @@ func newTx(t *types.Transaction) *tx {
 		Data:     "0x" + common.Bytes2Hex(t.Data()),
 		GasLimit: t.Gas().String(),
 		GasPrice: t.GasPrice().String(),
+		Hash:     t.Hash().Hex(),
 	}
 }
 
@@ -931,6 +933,12 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 		contractCreation = true
 	)
 
+	if val, found := fields["Hash"]; found {
+		if hashVal, ok := val.(string); ok {
+			tx.Hash = hashVal
+		}
+	}
+
 	if val, found := fields["To"]; found {
 		if strVal, ok := val.(string); ok && len(strVal) > 0 {
 			tx.To = strVal
-- 
cgit v1.2.3