pub trait SuiClientInner: Send + Sync {
    type Error: Into<Error> + Send + Sync + Error + 'static;
    // Required methods
    fn query_events<'life0, 'async_trait>(
        &'life0 self,
        query: EventFilter,
        cursor: Option<EventID>,
    ) -> Pin<Box<dyn Future<Output = Result<EventPage, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_events_by_tx_digest<'life0, 'async_trait>(
        &'life0 self,
        tx_digest: TransactionDigest,
    ) -> Pin<Box<dyn Future<Output = Result<Vec<SuiEvent>, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_chain_identifier<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<String, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_reference_gas_price<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<u64, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_latest_checkpoint_sequence_number<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<u64, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_mutable_bridge_object_arg<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<ObjectArg, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_bridge_summary<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<BridgeSummary, Self::Error>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn execute_transaction_block_with_effects<'life0, 'async_trait>(
        &'life0 self,
        tx: Transaction,
    ) -> Pin<Box<dyn Future<Output = Result<SuiTransactionBlockResponse, BridgeError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_token_transfer_action_onchain_status<'life0, 'async_trait>(
        &'life0 self,
        bridge_object_arg: ObjectArg,
        source_chain_id: u8,
        seq_number: u64,
    ) -> Pin<Box<dyn Future<Output = Result<BridgeActionStatus, BridgeError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_token_transfer_action_onchain_signatures<'life0, 'async_trait>(
        &'life0 self,
        bridge_object_arg: ObjectArg,
        source_chain_id: u8,
        seq_number: u64,
    ) -> Pin<Box<dyn Future<Output = Result<Option<Vec<Vec<u8>>>, BridgeError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_parsed_token_transfer_message<'life0, 'async_trait>(
        &'life0 self,
        bridge_object_arg: ObjectArg,
        source_chain_id: u8,
        seq_number: u64,
    ) -> Pin<Box<dyn Future<Output = Result<Option<MoveTypeParsedTokenTransferMessage>, BridgeError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn get_gas_data_panic_if_not_gas<'life0, 'async_trait>(
        &'life0 self,
        gas_object_id: ObjectID,
    ) -> Pin<Box<dyn Future<Output = (GasCoin, ObjectRef, Owner)> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
}Expand description
Use a trait to abstract over the SuiSDKClient and SuiMockClient for testing.