|
|
|
@ -133,7 +133,7 @@ func TestStateChangeDuringPoolReset(t *testing.T) { |
|
|
|
|
t.Fatalf("Invalid nonce, want 0, got %d", nonce) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
txpool.AddBatch(types.Transactions{tx0, tx1}) |
|
|
|
|
txpool.AddRemotes(types.Transactions{tx0, tx1}) |
|
|
|
|
|
|
|
|
|
nonce = txpool.State().GetNonce(address) |
|
|
|
|
if nonce != 2 { |
|
|
|
@ -167,31 +167,29 @@ func TestInvalidTransactions(t *testing.T) { |
|
|
|
|
from, _ := deriveSender(tx) |
|
|
|
|
currentState, _ := pool.currentState() |
|
|
|
|
currentState.AddBalance(from, big.NewInt(1)) |
|
|
|
|
if err := pool.Add(tx); err != ErrInsufficientFunds { |
|
|
|
|
if err := pool.AddRemote(tx); err != ErrInsufficientFunds { |
|
|
|
|
t.Error("expected", ErrInsufficientFunds) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
balance := new(big.Int).Add(tx.Value(), new(big.Int).Mul(tx.Gas(), tx.GasPrice())) |
|
|
|
|
currentState.AddBalance(from, balance) |
|
|
|
|
if err := pool.Add(tx); err != ErrIntrinsicGas { |
|
|
|
|
if err := pool.AddRemote(tx); err != ErrIntrinsicGas { |
|
|
|
|
t.Error("expected", ErrIntrinsicGas, "got", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
currentState.SetNonce(from, 1) |
|
|
|
|
currentState.AddBalance(from, big.NewInt(0xffffffffffffff)) |
|
|
|
|
tx = transaction(0, big.NewInt(100000), key) |
|
|
|
|
if err := pool.Add(tx); err != ErrNonceTooLow { |
|
|
|
|
if err := pool.AddRemote(tx); err != ErrNonceTooLow { |
|
|
|
|
t.Error("expected", ErrNonceTooLow) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tx = transaction(1, big.NewInt(100000), key) |
|
|
|
|
pool.gasPrice = big.NewInt(1000) |
|
|
|
|
if err := pool.Add(tx); err != ErrUnderpriced { |
|
|
|
|
if err := pool.AddRemote(tx); err != ErrUnderpriced { |
|
|
|
|
t.Error("expected", ErrUnderpriced, "got", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pool.SetLocal(tx) |
|
|
|
|
if err := pool.Add(tx); err != nil { |
|
|
|
|
if err := pool.AddLocal(tx); err != nil { |
|
|
|
|
t.Error("expected", nil, "got", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -282,7 +280,7 @@ func TestNegativeValue(t *testing.T) { |
|
|
|
|
from, _ := deriveSender(tx) |
|
|
|
|
currentState, _ := pool.currentState() |
|
|
|
|
currentState.AddBalance(from, big.NewInt(1)) |
|
|
|
|
if err := pool.Add(tx); err != ErrNegativeValue { |
|
|
|
|
if err := pool.AddRemote(tx); err != ErrNegativeValue { |
|
|
|
|
t.Error("expected", ErrNegativeValue, "got", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -301,14 +299,14 @@ func TestTransactionChainFork(t *testing.T) { |
|
|
|
|
resetState() |
|
|
|
|
|
|
|
|
|
tx := transaction(0, big.NewInt(100000), key) |
|
|
|
|
if _, err := pool.add(tx); err != nil { |
|
|
|
|
if _, err := pool.add(tx, false); err != nil { |
|
|
|
|
t.Error("didn't expect error", err) |
|
|
|
|
} |
|
|
|
|
pool.RemoveBatch([]*types.Transaction{tx}) |
|
|
|
|
|
|
|
|
|
// reset the pool's internal state
|
|
|
|
|
resetState() |
|
|
|
|
if _, err := pool.add(tx); err != nil { |
|
|
|
|
if _, err := pool.add(tx, false); err != nil { |
|
|
|
|
t.Error("didn't expect error", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -332,10 +330,10 @@ func TestTransactionDoubleNonce(t *testing.T) { |
|
|
|
|
tx3, _ := types.SignTx(types.NewTransaction(0, common.Address{}, big.NewInt(100), big.NewInt(1000000), big.NewInt(1), nil), signer, key) |
|
|
|
|
|
|
|
|
|
// Add the first two transaction, ensure higher priced stays only
|
|
|
|
|
if replace, err := pool.add(tx1); err != nil || replace { |
|
|
|
|
if replace, err := pool.add(tx1, false); err != nil || replace { |
|
|
|
|
t.Errorf("first transaction insert failed (%v) or reported replacement (%v)", err, replace) |
|
|
|
|
} |
|
|
|
|
if replace, err := pool.add(tx2); err != nil || !replace { |
|
|
|
|
if replace, err := pool.add(tx2, false); err != nil || !replace { |
|
|
|
|
t.Errorf("second transaction insert failed (%v) or not reported replacement (%v)", err, replace) |
|
|
|
|
} |
|
|
|
|
state, _ := pool.currentState() |
|
|
|
@ -347,7 +345,7 @@ func TestTransactionDoubleNonce(t *testing.T) { |
|
|
|
|
t.Errorf("transaction mismatch: have %x, want %x", tx.Hash(), tx2.Hash()) |
|
|
|
|
} |
|
|
|
|
// Add the third transaction and ensure it's not saved (smaller price)
|
|
|
|
|
pool.add(tx3) |
|
|
|
|
pool.add(tx3, false) |
|
|
|
|
pool.promoteExecutables(state, []common.Address{addr}) |
|
|
|
|
if pool.pending[addr].Len() != 1 { |
|
|
|
|
t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) |
|
|
|
@ -367,7 +365,7 @@ func TestMissingNonce(t *testing.T) { |
|
|
|
|
currentState, _ := pool.currentState() |
|
|
|
|
currentState.AddBalance(addr, big.NewInt(100000000000000)) |
|
|
|
|
tx := transaction(1, big.NewInt(100000), key) |
|
|
|
|
if _, err := pool.add(tx); err != nil { |
|
|
|
|
if _, err := pool.add(tx, false); err != nil { |
|
|
|
|
t.Error("didn't expect error", err) |
|
|
|
|
} |
|
|
|
|
if len(pool.pending) != 0 { |
|
|
|
@ -390,7 +388,7 @@ func TestNonceRecovery(t *testing.T) { |
|
|
|
|
currentState.AddBalance(addr, big.NewInt(100000000000000)) |
|
|
|
|
pool.resetState() |
|
|
|
|
tx := transaction(n, big.NewInt(100000), key) |
|
|
|
|
if err := pool.Add(tx); err != nil { |
|
|
|
|
if err := pool.AddRemote(tx); err != nil { |
|
|
|
|
t.Error(err) |
|
|
|
|
} |
|
|
|
|
// simulate some weird re-order of transactions and missing nonce(s)
|
|
|
|
@ -598,7 +596,7 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { |
|
|
|
|
|
|
|
|
|
// Keep queuing up transactions and make sure all above a limit are dropped
|
|
|
|
|
for i := uint64(1); i <= DefaultTxPoolConfig.AccountQueue+5; i++ { |
|
|
|
|
if err := pool.Add(transaction(i, big.NewInt(100000), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil { |
|
|
|
|
t.Fatalf("tx %d: failed to add transaction: %v", i, err) |
|
|
|
|
} |
|
|
|
|
if len(pool.pending) != 0 { |
|
|
|
@ -653,7 +651,7 @@ func TestTransactionQueueGlobalLimiting(t *testing.T) { |
|
|
|
|
nonces[addr]++ |
|
|
|
|
} |
|
|
|
|
// Import the batch and verify that limits have been enforced
|
|
|
|
|
pool.AddBatch(txs) |
|
|
|
|
pool.AddRemotes(txs) |
|
|
|
|
|
|
|
|
|
queued := 0 |
|
|
|
|
for addr, list := range pool.queue { |
|
|
|
@ -686,7 +684,7 @@ func TestTransactionQueueTimeLimiting(t *testing.T) { |
|
|
|
|
|
|
|
|
|
// Queue up a batch of transactions
|
|
|
|
|
for i := uint64(1); i <= DefaultTxPoolConfig.AccountQueue; i++ { |
|
|
|
|
if err := pool.Add(transaction(i, big.NewInt(100000), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil { |
|
|
|
|
t.Fatalf("tx %d: failed to add transaction: %v", i, err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -711,7 +709,7 @@ func TestTransactionPendingLimiting(t *testing.T) { |
|
|
|
|
|
|
|
|
|
// Keep queuing up transactions and make sure all above a limit are dropped
|
|
|
|
|
for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { |
|
|
|
|
if err := pool.Add(transaction(i, big.NewInt(100000), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(transaction(i, big.NewInt(100000), key)); err != nil { |
|
|
|
|
t.Fatalf("tx %d: failed to add transaction: %v", i, err) |
|
|
|
|
} |
|
|
|
|
if pool.pending[account].Len() != int(i)+1 { |
|
|
|
@ -739,7 +737,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { |
|
|
|
|
state1.AddBalance(account1, big.NewInt(1000000)) |
|
|
|
|
|
|
|
|
|
for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { |
|
|
|
|
if err := pool1.Add(transaction(origin+i, big.NewInt(100000), key1)); err != nil { |
|
|
|
|
if err := pool1.AddRemote(transaction(origin+i, big.NewInt(100000), key1)); err != nil { |
|
|
|
|
t.Fatalf("tx %d: failed to add transaction: %v", i, err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -753,7 +751,7 @@ func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { |
|
|
|
|
for i := uint64(0); i < DefaultTxPoolConfig.AccountQueue+5; i++ { |
|
|
|
|
txns = append(txns, transaction(origin+i, big.NewInt(100000), key2)) |
|
|
|
|
} |
|
|
|
|
pool2.AddBatch(txns) |
|
|
|
|
pool2.AddRemotes(txns) |
|
|
|
|
|
|
|
|
|
// Ensure the batch optimization honors the same pool mechanics
|
|
|
|
|
if len(pool1.pending) != len(pool2.pending) { |
|
|
|
@ -808,7 +806,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Import the batch and verify that limits have been enforced
|
|
|
|
|
pool.AddBatch(txs) |
|
|
|
|
pool.AddRemotes(txs) |
|
|
|
|
|
|
|
|
|
pending := 0 |
|
|
|
|
for _, list := range pool.pending { |
|
|
|
@ -852,7 +850,7 @@ func TestTransactionCapClearsFromAll(t *testing.T) { |
|
|
|
|
txs = append(txs, transaction(uint64(j), big.NewInt(100000), key)) |
|
|
|
|
} |
|
|
|
|
// Import the batch and verify that limits have been enforced
|
|
|
|
|
pool.AddBatch(txs) |
|
|
|
|
pool.AddRemotes(txs) |
|
|
|
|
if err := validateTxPoolInternals(pool); err != nil { |
|
|
|
|
t.Fatalf("pool internal state corrupted: %v", err) |
|
|
|
|
} |
|
|
|
@ -893,7 +891,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Import the batch and verify that limits have been enforced
|
|
|
|
|
pool.AddBatch(txs) |
|
|
|
|
pool.AddRemotes(txs) |
|
|
|
|
|
|
|
|
|
for addr, list := range pool.pending { |
|
|
|
|
if list.Len() != int(DefaultTxPoolConfig.AccountSlots) { |
|
|
|
@ -937,11 +935,11 @@ func TestTransactionPoolRepricing(t *testing.T) { |
|
|
|
|
txs = append(txs, pricedTransaction(2, big.NewInt(100000), big.NewInt(1), keys[1])) |
|
|
|
|
txs = append(txs, pricedTransaction(3, big.NewInt(100000), big.NewInt(2), keys[1])) |
|
|
|
|
|
|
|
|
|
txs = append(txs, pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[2])) |
|
|
|
|
pool.SetLocal(txs[len(txs)-1]) // prevent this one from ever being dropped
|
|
|
|
|
ltx := pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[2]) |
|
|
|
|
|
|
|
|
|
// Import the batch and that both pending and queued transactions match up
|
|
|
|
|
pool.AddBatch(txs) |
|
|
|
|
pool.AddRemotes(txs) |
|
|
|
|
pool.AddLocal(ltx) |
|
|
|
|
|
|
|
|
|
pending, queued := pool.stats() |
|
|
|
|
if pending != 4 { |
|
|
|
@ -967,10 +965,10 @@ func TestTransactionPoolRepricing(t *testing.T) { |
|
|
|
|
t.Fatalf("pool internal state corrupted: %v", err) |
|
|
|
|
} |
|
|
|
|
// Check that we can't add the old transactions back
|
|
|
|
|
if err := pool.Add(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[0])); err != ErrUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[0])); err != ErrUnderpriced { |
|
|
|
|
t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced { |
|
|
|
|
t.Fatalf("adding underpriced queued transaction error mismatch: have %v, want %v", err, ErrUnderpriced) |
|
|
|
|
} |
|
|
|
|
if err := validateTxPoolInternals(pool); err != nil { |
|
|
|
@ -978,9 +976,7 @@ func TestTransactionPoolRepricing(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
// However we can add local underpriced transactions
|
|
|
|
|
tx := pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[2]) |
|
|
|
|
|
|
|
|
|
pool.SetLocal(tx) // prevent this one from ever being dropped
|
|
|
|
|
if err := pool.Add(tx); err != nil { |
|
|
|
|
if err := pool.AddLocal(tx); err != nil { |
|
|
|
|
t.Fatalf("failed to add underpriced local transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if pending, _ = pool.stats(); pending != 3 { |
|
|
|
@ -1027,11 +1023,11 @@ func TestTransactionPoolUnderpricing(t *testing.T) { |
|
|
|
|
|
|
|
|
|
txs = append(txs, pricedTransaction(1, big.NewInt(100000), big.NewInt(1), keys[1])) |
|
|
|
|
|
|
|
|
|
txs = append(txs, pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[2])) |
|
|
|
|
pool.SetLocal(txs[len(txs)-1]) // prevent this one from ever being dropped
|
|
|
|
|
ltx := pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[2]) |
|
|
|
|
|
|
|
|
|
// Import the batch and that both pending and queued transactions match up
|
|
|
|
|
pool.AddBatch(txs) |
|
|
|
|
pool.AddRemotes(txs) |
|
|
|
|
pool.AddLocal(ltx) |
|
|
|
|
|
|
|
|
|
pending, queued := pool.stats() |
|
|
|
|
if pending != 3 { |
|
|
|
@ -1044,17 +1040,17 @@ func TestTransactionPoolUnderpricing(t *testing.T) { |
|
|
|
|
t.Fatalf("pool internal state corrupted: %v", err) |
|
|
|
|
} |
|
|
|
|
// Ensure that adding an underpriced transaction on block limit fails
|
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), keys[1])); err != ErrUnderpriced { |
|
|
|
|
t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced) |
|
|
|
|
} |
|
|
|
|
// Ensure that adding high priced transactions drops cheap ones, but not own
|
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(3), keys[1])); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(3), keys[1])); err != nil { |
|
|
|
|
t.Fatalf("failed to add well priced transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100000), big.NewInt(4), keys[1])); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(4), keys[1])); err != nil { |
|
|
|
|
t.Fatalf("failed to add well priced transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(3, big.NewInt(100000), big.NewInt(5), keys[1])); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(3, big.NewInt(100000), big.NewInt(5), keys[1])); err != nil { |
|
|
|
|
t.Fatalf("failed to add well priced transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
pending, queued = pool.stats() |
|
|
|
@ -1069,9 +1065,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
// Ensure that adding local transactions can push out even higher priced ones
|
|
|
|
|
tx := pricedTransaction(1, big.NewInt(100000), big.NewInt(0), keys[2]) |
|
|
|
|
|
|
|
|
|
pool.SetLocal(tx) // prevent this one from ever being dropped
|
|
|
|
|
if err := pool.Add(tx); err != nil { |
|
|
|
|
if err := pool.AddLocal(tx); err != nil { |
|
|
|
|
t.Fatalf("failed to add underpriced local transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
pending, queued = pool.stats() |
|
|
|
@ -1106,43 +1100,43 @@ func TestTransactionReplacement(t *testing.T) { |
|
|
|
|
price := int64(100) |
|
|
|
|
threshold := (price * (100 + int64(DefaultTxPoolConfig.PriceBump))) / 100 |
|
|
|
|
|
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(1), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to add original cheap pending transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
t.Fatalf("original cheap pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(2), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(2), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to replace original cheap pending transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(price), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(price), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to add original proper pending transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
t.Fatalf("original proper pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(0, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to replace original proper pending transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
// Add queued transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too)
|
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(1), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to add original queued transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(1), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
t.Fatalf("original queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100000), big.NewInt(2), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(2), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to replace original queued transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100000), big.NewInt(price), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(price), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to add original queued transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100001), big.NewInt(threshold), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100001), big.NewInt(threshold), key)); err != ErrReplaceUnderpriced { |
|
|
|
|
t.Fatalf("original queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) |
|
|
|
|
} |
|
|
|
|
if err := pool.Add(pricedTransaction(2, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { |
|
|
|
|
if err := pool.AddRemote(pricedTransaction(2, big.NewInt(100000), big.NewInt(threshold+1), key)); err != nil { |
|
|
|
|
t.Fatalf("failed to replace original queued transaction: %v", err) |
|
|
|
|
} |
|
|
|
|
if err := validateTxPoolInternals(pool); err != nil { |
|
|
|
@ -1213,7 +1207,7 @@ func BenchmarkPoolInsert(b *testing.B) { |
|
|
|
|
// Benchmark importing the transactions into the queue
|
|
|
|
|
b.ResetTimer() |
|
|
|
|
for _, tx := range txs { |
|
|
|
|
pool.Add(tx) |
|
|
|
|
pool.AddRemote(tx) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1239,6 +1233,6 @@ func benchmarkPoolBatchInsert(b *testing.B, size int) { |
|
|
|
|
// Benchmark importing the transactions into the queue
|
|
|
|
|
b.ResetTimer() |
|
|
|
|
for _, batch := range batches { |
|
|
|
|
pool.AddBatch(batch) |
|
|
|
|
pool.AddRemotes(batch) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|