address grumbles
This commit is contained in:
parent
4f1afccf97
commit
e911fc2db9
@ -111,6 +111,8 @@ impl TransactionQueue {
|
|||||||
let hash = tx.hash();
|
let hash = tx.hash();
|
||||||
let nonce = tx.nonce;
|
let nonce = tx.nonce;
|
||||||
|
|
||||||
|
if self.by_hash.contains_key(&hash) { return Err(TransactionError::AlreadyImported) }
|
||||||
|
|
||||||
let res = match self.by_account.entry(sender) {
|
let res = match self.by_account.entry(sender) {
|
||||||
Entry::Vacant(entry) => {
|
Entry::Vacant(entry) => {
|
||||||
entry.insert(AccountTransactions {
|
entry.insert(AccountTransactions {
|
||||||
@ -138,7 +140,8 @@ impl TransactionQueue {
|
|||||||
trace!(target: "txqueue", "Replacing existing transaction from {} with nonce {}",
|
trace!(target: "txqueue", "Replacing existing transaction from {} with nonce {}",
|
||||||
sender, nonce);
|
sender, nonce);
|
||||||
|
|
||||||
acct_txs.current[idx] = tx.clone();
|
let old = ::std::mem::replace(&mut acct_txs.current[idx], tx.clone());
|
||||||
|
self.by_hash.remove(&old.hash());
|
||||||
|
|
||||||
TransactionImportResult::Current
|
TransactionImportResult::Current
|
||||||
}
|
}
|
||||||
@ -149,7 +152,7 @@ impl TransactionQueue {
|
|||||||
// current is sorted with one tx per nonce,
|
// current is sorted with one tx per nonce,
|
||||||
// so if a tx with given nonce wasn't found that means it is either
|
// so if a tx with given nonce wasn't found that means it is either
|
||||||
// earlier in nonce than all other "current" transactions or later.
|
// earlier in nonce than all other "current" transactions or later.
|
||||||
debug_assert!(idx == 0 || idx == cur_len);
|
assert!(idx == 0 || idx == cur_len);
|
||||||
|
|
||||||
if idx == 0 && acct_txs.current.first().map_or(false, |f| f.nonce != incr_nonce) {
|
if idx == 0 && acct_txs.current.first().map_or(false, |f| f.nonce != incr_nonce) {
|
||||||
let old_cur = ::std::mem::replace(&mut acct_txs.current, vec![tx.clone()]);
|
let old_cur = ::std::mem::replace(&mut acct_txs.current, vec![tx.clone()]);
|
||||||
@ -418,4 +421,24 @@ mod tests {
|
|||||||
|
|
||||||
assert!(txq.import(tx_b.fake_sign(sender).into()).is_err())
|
assert!(txq.import(tx_b.fake_sign(sender).into()).is_err())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn replace_is_removed() {
|
||||||
|
let sender = Address::default();
|
||||||
|
let mut txq = TransactionQueue::default();
|
||||||
|
|
||||||
|
let tx_b: PendingTransaction = Transaction::default().fake_sign(sender).into();
|
||||||
|
let tx_a: PendingTransaction = {
|
||||||
|
let mut tx_a = Transaction::default();
|
||||||
|
tx_a.gas_price = tx_b.gas_price + 1.into();
|
||||||
|
tx_a.fake_sign(sender).into()
|
||||||
|
};
|
||||||
|
|
||||||
|
let hash = tx_a.hash();
|
||||||
|
|
||||||
|
txq.import(tx_a).unwrap();
|
||||||
|
txq.import(tx_b).unwrap();
|
||||||
|
|
||||||
|
assert!(txq.transaction(&hash).is_none());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user