bugfix, pending transaction was resend with new gas price/limit but not removed from transaction pool
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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)) | ||||
|   | ||||
| @@ -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) | ||||
|  | ||||
| 	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) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	self.ethereum.TxPool().RemoveTransactions(types.Transactions{args.Tx.tx}) | ||||
|  | ||||
| 	return ret, nil | ||||
| 	return nil, fmt.Errorf("Transaction %s not found", args.Tx.Hash) | ||||
| } | ||||
|  | ||||
| func (self *ethApi) PendingTransactions(req *shared.Request) (interface{}, error) { | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user