Charge transaction fee even in case of ProgramError

This commit is contained in:
Pankaj Garg 2019-02-20 09:14:28 -08:00 committed by Grimes
parent 18d48f09f8
commit c142a82ae0
2 changed files with 29 additions and 7 deletions

View File

@ -579,6 +579,12 @@ impl Bank {
parents parents
} }
pub fn withdraw(&self, pubkey: &Pubkey, tokens: u64) {
let mut account = self.get_account(pubkey).unwrap_or_default();
account.tokens -= tokens;
self.accounts.store_slow(true, pubkey, &account);
}
pub fn deposit(&self, pubkey: &Pubkey, tokens: u64) { pub fn deposit(&self, pubkey: &Pubkey, tokens: u64) {
let mut account = self.get_account(pubkey).unwrap_or_default(); let mut account = self.get_account(pubkey).unwrap_or_default();
account.tokens += tokens; account.tokens += tokens;

View File

@ -16,13 +16,21 @@ use std::time::Instant;
pub fn process_entry(bank: &Bank, entry: &Entry) -> (Result<()>, u64) { pub fn process_entry(bank: &Bank, entry: &Entry) -> (Result<()>, u64) {
if !entry.is_tick() { if !entry.is_tick() {
let old_results = bank.process_transactions(&entry.transactions); let old_results = bank.process_transactions(&entry.transactions);
let results = ignore_program_errors(old_results);
let fee = entry let fee = entry
.transactions .transactions
.iter() .iter()
.zip(&results) .zip(&old_results)
.map(|(tx, res)| if res.is_ok() { tx.fee } else { 0 }) .map(|(tx, res)| match res {
Err(BankError::ProgramError(_, _)) => {
// Charge the transaction fee in case of ProgramError
bank.withdraw(&tx.account_keys[0], tx.fee);
tx.fee
}
Ok(()) => tx.fee,
_ => 0,
})
.sum(); .sum();
let results = ignore_program_errors(old_results);
(first_err(&results), fee) (first_err(&results), fee)
} else { } else {
bank.register_tick(&entry.id); bank.register_tick(&entry.id);
@ -63,14 +71,22 @@ fn par_execute_entries(bank: &Bank, entries: &[(&Entry, Vec<Result<()>>)]) -> (R
lock_results.to_vec(), lock_results.to_vec(),
MAX_ENTRY_IDS, MAX_ENTRY_IDS,
); );
let results = ignore_program_errors(old_results);
bank.unlock_accounts(&e.transactions, &results);
let fee = e let fee = e
.transactions .transactions
.iter() .iter()
.zip(&results) .zip(&old_results)
.map(|(tx, res)| if res.is_ok() { tx.fee } else { 0 }) .map(|(tx, res)| match res {
Err(BankError::ProgramError(_, _)) => {
// Charge the transaction fee in case of ProgramError
bank.withdraw(&tx.account_keys[0], tx.fee);
tx.fee
}
Ok(()) => tx.fee,
_ => 0,
})
.sum(); .sum();
let results = ignore_program_errors(old_results);
bank.unlock_accounts(&e.transactions, &results);
(first_err(&results), fee) (first_err(&results), fee)
}) })
.collect(); .collect();