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
This commit is contained in:
@@ -10,11 +10,13 @@ pub mod parse_stake;
|
||||
pub mod parse_system;
|
||||
pub mod parse_token;
|
||||
pub mod parse_vote;
|
||||
pub mod token_balances;
|
||||
|
||||
use crate::{
|
||||
parse_accounts::{parse_accounts, ParsedAccount},
|
||||
parse_instruction::{parse, ParsedInstruction},
|
||||
};
|
||||
use solana_account_decoder::parse_token::UiTokenAmount;
|
||||
pub use solana_runtime::bank::RewardType;
|
||||
use solana_sdk::{
|
||||
clock::{Slot, UnixTimestamp},
|
||||
@@ -27,7 +29,6 @@ use solana_sdk::{
|
||||
transaction::{Result, Transaction, TransactionError},
|
||||
};
|
||||
use std::fmt;
|
||||
|
||||
/// A duplicate representation of an Instruction for pretty JSON serialization
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase", untagged)]
|
||||
@@ -115,6 +116,31 @@ pub struct UiInnerInstructions {
|
||||
pub instructions: Vec<UiInstruction>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub struct TransactionTokenBalance {
|
||||
pub account_index: u8,
|
||||
pub mint: String,
|
||||
pub ui_token_amount: UiTokenAmount,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct UiTransactionTokenBalance {
|
||||
pub account_index: u8,
|
||||
pub mint: String,
|
||||
pub ui_token_amount: UiTokenAmount,
|
||||
}
|
||||
|
||||
impl From<TransactionTokenBalance> for UiTransactionTokenBalance {
|
||||
fn from(token_balance: TransactionTokenBalance) -> Self {
|
||||
Self {
|
||||
account_index: token_balance.account_index,
|
||||
mint: token_balance.mint,
|
||||
ui_token_amount: token_balance.ui_token_amount,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl UiInnerInstructions {
|
||||
fn parse(inner_instructions: InnerInstructions, message: &Message) -> Self {
|
||||
Self {
|
||||
@@ -152,6 +178,10 @@ pub struct TransactionStatusMeta {
|
||||
pub inner_instructions: Option<Vec<InnerInstructions>>,
|
||||
#[serde(deserialize_with = "default_on_eof")]
|
||||
pub log_messages: Option<Vec<String>>,
|
||||
#[serde(deserialize_with = "default_on_eof")]
|
||||
pub pre_token_balances: Option<Vec<TransactionTokenBalance>>,
|
||||
#[serde(deserialize_with = "default_on_eof")]
|
||||
pub post_token_balances: Option<Vec<TransactionTokenBalance>>,
|
||||
}
|
||||
|
||||
impl Default for TransactionStatusMeta {
|
||||
@@ -163,6 +193,8 @@ impl Default for TransactionStatusMeta {
|
||||
post_balances: vec![],
|
||||
inner_instructions: None,
|
||||
log_messages: None,
|
||||
pre_token_balances: None,
|
||||
post_token_balances: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -178,6 +210,8 @@ pub struct UiTransactionStatusMeta {
|
||||
pub post_balances: Vec<u64>,
|
||||
pub inner_instructions: Option<Vec<UiInnerInstructions>>,
|
||||
pub log_messages: Option<Vec<String>>,
|
||||
pub pre_token_balances: Option<Vec<UiTransactionTokenBalance>>,
|
||||
pub post_token_balances: Option<Vec<UiTransactionTokenBalance>>,
|
||||
}
|
||||
|
||||
impl UiTransactionStatusMeta {
|
||||
@@ -194,6 +228,12 @@ impl UiTransactionStatusMeta {
|
||||
.collect()
|
||||
}),
|
||||
log_messages: meta.log_messages,
|
||||
pre_token_balances: meta
|
||||
.pre_token_balances
|
||||
.map(|balance| balance.into_iter().map(|balance| balance.into()).collect()),
|
||||
post_token_balances: meta
|
||||
.post_token_balances
|
||||
.map(|balance| balance.into_iter().map(|balance| balance.into()).collect()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -210,6 +250,12 @@ impl From<TransactionStatusMeta> for UiTransactionStatusMeta {
|
||||
.inner_instructions
|
||||
.map(|ixs| ixs.into_iter().map(|ix| ix.into()).collect()),
|
||||
log_messages: meta.log_messages,
|
||||
pre_token_balances: meta
|
||||
.pre_token_balances
|
||||
.map(|balance| balance.into_iter().map(|balance| balance.into()).collect()),
|
||||
post_token_balances: meta
|
||||
.post_token_balances
|
||||
.map(|balance| balance.into_iter().map(|balance| balance.into()).collect()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user