* SPL token balance in transaction metadata (#13673)
* feat: store pre / post token balances
* move helper functions into separate include
* move token balance functionality to transaction-status crate
* fix blockstore processor test
* fix bigtable legacy test
* add caching to decimals
(cherry picked from commit 13db3eca9f
)
# Conflicts:
# core/src/banking_stage.rs
# storage-proto/Cargo.toml
# storage-proto/src/convert.rs
* resolve merges storage-proto banking_stage
* fix bpf tests with token deltas
Co-authored-by: Josh <josh.hundley@gmail.com>
This commit is contained in:
@@ -41,8 +41,13 @@ use solana_sdk::{
|
||||
timing::{duration_as_ms, timestamp},
|
||||
transaction::{self, Transaction, TransactionError},
|
||||
};
|
||||
use solana_transaction_status::token_balances::{
|
||||
collect_token_balances, TransactionTokenBalancesSet,
|
||||
};
|
||||
use std::{
|
||||
cmp, env,
|
||||
cmp,
|
||||
collections::HashMap,
|
||||
env,
|
||||
net::UdpSocket,
|
||||
sync::atomic::AtomicBool,
|
||||
sync::mpsc::Receiver,
|
||||
@@ -535,6 +540,14 @@ impl BankingStage {
|
||||
};
|
||||
|
||||
let mut execute_timings = ExecuteTimings::default();
|
||||
let mut mint_decimals: HashMap<Pubkey, u8> = HashMap::new();
|
||||
|
||||
let pre_token_balances = if transaction_status_sender.is_some() {
|
||||
collect_token_balances(&bank, &batch, &mut mint_decimals)
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
|
||||
let (
|
||||
mut loaded_accounts,
|
||||
results,
|
||||
@@ -581,12 +594,14 @@ impl BankingStage {
|
||||
bank_utils::find_and_send_votes(txs, &tx_results, Some(gossip_vote_sender));
|
||||
if let Some(sender) = transaction_status_sender {
|
||||
let post_balances = bank.collect_balances(batch);
|
||||
let post_token_balances = collect_token_balances(&bank, &batch, &mut mint_decimals);
|
||||
send_transaction_status_batch(
|
||||
bank.clone(),
|
||||
batch.transactions(),
|
||||
batch.iteration_order_vec(),
|
||||
tx_results.execution_results,
|
||||
TransactionBalancesSet::new(pre_balances, post_balances),
|
||||
TransactionTokenBalancesSet::new(pre_token_balances, post_token_balances),
|
||||
inner_instructions,
|
||||
transaction_logs,
|
||||
sender,
|
||||
|
@@ -54,6 +54,7 @@ impl TransactionStatusService {
|
||||
iteration_order,
|
||||
statuses,
|
||||
balances,
|
||||
token_balances,
|
||||
inner_instructions,
|
||||
transaction_logs,
|
||||
} = write_transaction_status_receiver.recv_timeout(Duration::from_secs(1))?;
|
||||
@@ -64,6 +65,8 @@ impl TransactionStatusService {
|
||||
(status, nonce_rollback),
|
||||
pre_balances,
|
||||
post_balances,
|
||||
pre_token_balances,
|
||||
post_token_balances,
|
||||
inner_instructions,
|
||||
log_messages,
|
||||
) in izip!(
|
||||
@@ -71,6 +74,8 @@ impl TransactionStatusService {
|
||||
statuses,
|
||||
balances.pre_balances,
|
||||
balances.post_balances,
|
||||
token_balances.pre_token_balances,
|
||||
token_balances.post_token_balances,
|
||||
inner_instructions,
|
||||
transaction_logs
|
||||
) {
|
||||
@@ -98,6 +103,8 @@ impl TransactionStatusService {
|
||||
});
|
||||
|
||||
let log_messages = Some(log_messages);
|
||||
let pre_token_balances = Some(pre_token_balances);
|
||||
let post_token_balances = Some(post_token_balances);
|
||||
|
||||
blockstore
|
||||
.write_transaction_status(
|
||||
@@ -112,6 +119,8 @@ impl TransactionStatusService {
|
||||
post_balances,
|
||||
inner_instructions,
|
||||
log_messages,
|
||||
pre_token_balances,
|
||||
post_token_balances,
|
||||
},
|
||||
)
|
||||
.expect("Expect database write to succeed");
|
||||
|
Reference in New Issue
Block a user