solana_banks_interface/
lib.rs

1#![cfg_attr(
2    not(feature = "agave-unstable-api"),
3    deprecated(
4        since = "3.1.0",
5        note = "This crate has been marked for formal inclusion in the Agave Unstable API. From \
6                v4.0.0 onward, the `agave-unstable-api` crate feature must be specified to \
7                acknowledge use of an interface that may break without warning."
8    )
9)]
10#![allow(deprecated)]
11
12use {
13    serde::{Deserialize, Serialize},
14    solana_account::Account,
15    solana_clock::Slot,
16    solana_commitment_config::CommitmentLevel,
17    solana_hash::Hash,
18    solana_message::{inner_instruction::InnerInstructions, Message},
19    solana_pubkey::Pubkey,
20    solana_signature::Signature,
21    solana_transaction::versioned::VersionedTransaction,
22    solana_transaction_context::TransactionReturnData,
23    solana_transaction_error::TransactionError,
24};
25
26mod transaction {
27    pub use solana_transaction_error::TransactionResult as Result;
28}
29
30#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
31pub enum TransactionConfirmationStatus {
32    Processed,
33    Confirmed,
34    Finalized,
35}
36
37#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
38pub struct TransactionStatus {
39    pub slot: Slot,
40    pub confirmations: Option<usize>, // None = rooted
41    pub err: Option<TransactionError>,
42    pub confirmation_status: Option<TransactionConfirmationStatus>,
43}
44
45#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
46#[serde(rename_all = "camelCase")]
47pub struct TransactionSimulationDetails {
48    pub logs: Vec<String>,
49    pub units_consumed: u64,
50    pub loaded_accounts_data_size: u32,
51    pub return_data: Option<TransactionReturnData>,
52    pub inner_instructions: Option<Vec<InnerInstructions>>,
53}
54
55#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
56#[serde(rename_all = "camelCase")]
57pub struct TransactionMetadata {
58    pub log_messages: Vec<String>,
59    pub compute_units_consumed: u64,
60    pub return_data: Option<TransactionReturnData>,
61}
62
63#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
64pub struct BanksTransactionResultWithSimulation {
65    pub result: Option<transaction::Result<()>>,
66    pub simulation_details: Option<TransactionSimulationDetails>,
67}
68
69#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
70pub struct BanksTransactionResultWithMetadata {
71    pub result: transaction::Result<()>,
72    pub metadata: Option<TransactionMetadata>,
73}
74
75#[tarpc::service]
76pub trait Banks {
77    async fn send_transaction_with_context(transaction: VersionedTransaction);
78    async fn get_transaction_status_with_context(signature: Signature)
79        -> Option<TransactionStatus>;
80    async fn get_slot_with_context(commitment: CommitmentLevel) -> Slot;
81    async fn get_block_height_with_context(commitment: CommitmentLevel) -> u64;
82    async fn process_transaction_with_preflight_and_commitment_and_context(
83        transaction: VersionedTransaction,
84        commitment: CommitmentLevel,
85    ) -> BanksTransactionResultWithSimulation;
86    async fn process_transaction_with_commitment_and_context(
87        transaction: VersionedTransaction,
88        commitment: CommitmentLevel,
89    ) -> Option<transaction::Result<()>>;
90    async fn process_transaction_with_metadata_and_context(
91        transaction: VersionedTransaction,
92    ) -> BanksTransactionResultWithMetadata;
93    async fn simulate_transaction_with_commitment_and_context(
94        transaction: VersionedTransaction,
95        commitment: CommitmentLevel,
96    ) -> BanksTransactionResultWithSimulation;
97    async fn get_account_with_commitment_and_context(
98        address: Pubkey,
99        commitment: CommitmentLevel,
100    ) -> Option<Account>;
101    async fn get_latest_blockhash_with_context() -> Hash;
102    async fn get_latest_blockhash_with_commitment_and_context(
103        commitment: CommitmentLevel,
104    ) -> Option<(Hash, u64)>;
105    async fn get_fee_for_message_with_commitment_and_context(
106        message: Message,
107        commitment: CommitmentLevel,
108    ) -> Option<u64>;
109}
110
111#[cfg(test)]
112mod tests {
113    use {
114        super::*,
115        tarpc::{client, transport},
116    };
117
118    #[test]
119    fn test_banks_client_new() {
120        let (client_transport, _server_transport) = transport::channel::unbounded();
121        BanksClient::new(client::Config::default(), client_transport);
122    }
123}