diff --git a/eth/api_backend.go b/eth/api_backend.go index b331ae1434bb..74db91130cb2 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -314,6 +314,10 @@ func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) return b.eth.txPool.Add([]*types.Transaction{signedTx}, true, false)[0] } +func (b *EthAPIBackend) RemoveTx(txHash common.Hash) { + b.eth.txPool.RemoveTx(txHash, true, true) +} + func (b *EthAPIBackend) GetPoolTransactions() (types.Transactions, error) { pending := b.eth.txPool.Pending(false) var txs types.Transactions diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index a7fb71f65de1..f5a41c333dce 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -237,6 +237,11 @@ func (s *TxPoolAPI) Status() map[string]hexutil.Uint { } } +// RemoveTransactionByHash evicts a transaction from the pool. +func (s *TxPoolAPI) RemoveTransactionByHash(ctx context.Context, hash common.Hash) { + s.b.RemoveTx(hash) +} + // Inspect retrieves the content of the transaction pool and flattens it into an // easily inspectable list. func (s *TxPoolAPI) Inspect() map[string]map[string]map[string]string { diff --git a/internal/ethapi/api_test.go b/internal/ethapi/api_test.go index 6cc8433c18f9..9df3a6d787a0 100644 --- a/internal/ethapi/api_test.go +++ b/internal/ethapi/api_test.go @@ -601,6 +601,7 @@ func (b testBackend) ServiceFilter(ctx context.Context, session *bloombits.Match func (b testBackend) StateAt(root common.Hash) (*state.StateDB, error) { return b.chain.StateAt(root) } +func (b testBackend) RemoveTx(txHash common.Hash) {} func TestEstimateGas(t *testing.T) { t.Parallel() diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 6030b98e15d6..19945e0ddc55 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -76,6 +76,7 @@ type Backend interface { // Transaction pool API SendTx(ctx context.Context, signedTx *types.Transaction) error + RemoveTx(txHash common.Hash) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) GetPoolTransactions() (types.Transactions, error) GetPoolTransaction(txHash common.Hash) *types.Transaction diff --git a/internal/ethapi/transaction_args_test.go b/internal/ethapi/transaction_args_test.go index 41b3160ff1cd..3616da0e9063 100644 --- a/internal/ethapi/transaction_args_test.go +++ b/internal/ethapi/transaction_args_test.go @@ -362,3 +362,5 @@ func (b *backendMock) Engine() consensus.Engine { return nil } func (b *backendMock) StateAt(root common.Hash) (*state.StateDB, error) { return nil, nil } + +func (b *backendMock) RemoveTx(txHash common.Hash) {} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 3e6110e4b031..dc0c95ef6c23 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -800,6 +800,11 @@ web3._extend({ call: 'txpool_contentFrom', params: 1, }), + new web3._extend.Method({ + name: 'removeTransactionByHash', + call: 'txpool_removeTransactionByHash', + params: 1 + }), ] }); `