Skip to main content

solana_banks_interface/
lib.rs

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