|
|
@@ -381,28 +381,32 @@ func (s *TxByPrice) Pop() interface{} {
|
|
|
// transactions in a profit-maximising sorted order, while supporting removing
|
|
|
// entire batches of transactions for non-executable accounts.
|
|
|
type TransactionsByPriceAndNonce struct {
|
|
|
- txs map[common.Address]Transactions // Per account nonce-sorted list of transactions
|
|
|
- heads TxByPrice // Next transaction for each unique account (price heap)
|
|
|
+ txs map[common.Address]Transactions // Per account nonce-sorted list of transactions
|
|
|
+ heads TxByPrice // Next transaction for each unique account (price heap)
|
|
|
+ signer Signer // Signer for the set of transactions
|
|
|
}
|
|
|
|
|
|
// NewTransactionsByPriceAndNonce creates a transaction set that can retrieve
|
|
|
// price sorted transactions in a nonce-honouring way.
|
|
|
//
|
|
|
// Note, the input map is reowned so the caller should not interact any more with
|
|
|
-// if after providng it to the constructor.
|
|
|
-func NewTransactionsByPriceAndNonce(txs map[common.Address]Transactions) *TransactionsByPriceAndNonce {
|
|
|
+// if after providing it to the constructor.
|
|
|
+func NewTransactionsByPriceAndNonce(signer Signer, txs map[common.Address]Transactions) *TransactionsByPriceAndNonce {
|
|
|
// Initialize a price based heap with the head transactions
|
|
|
heads := make(TxByPrice, 0, len(txs))
|
|
|
- for acc, accTxs := range txs {
|
|
|
+ for _, accTxs := range txs {
|
|
|
heads = append(heads, accTxs[0])
|
|
|
+ // Ensure the sender address is from the signer
|
|
|
+ acc, _ := Sender(signer, accTxs[0])
|
|
|
txs[acc] = accTxs[1:]
|
|
|
}
|
|
|
heap.Init(&heads)
|
|
|
|
|
|
// Assemble and return the transaction set
|
|
|
return &TransactionsByPriceAndNonce{
|
|
|
- txs: txs,
|
|
|
- heads: heads,
|
|
|
+ txs: txs,
|
|
|
+ heads: heads,
|
|
|
+ signer: signer,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -416,9 +420,7 @@ func (t *TransactionsByPriceAndNonce) Peek() *Transaction {
|
|
|
|
|
|
// Shift replaces the current best head with the next one from the same account.
|
|
|
func (t *TransactionsByPriceAndNonce) Shift() {
|
|
|
- signer := deriveSigner(t.heads[0].data.V)
|
|
|
- // derive signer but don't cache.
|
|
|
- acc, _ := Sender(signer, t.heads[0]) // we only sort valid txs so this cannot fail
|
|
|
+ acc, _ := Sender(t.signer, t.heads[0])
|
|
|
if txs, ok := t.txs[acc]; ok && len(txs) > 0 {
|
|
|
t.heads[0], t.txs[acc] = txs[0], txs[1:]
|
|
|
heap.Fix(&t.heads, 0)
|