Skip to main content

bolt_cw_sdk/oracle/
client.rs

1use std::sync::Arc;
2
3use crate::chain_config::ChainConfig;
4use crate::cosmos_client::query_contract::QueryContractResponse;
5use crate::cosmos_client::CosmosClient;
6use crate::oracle::error::OracleError;
7use crate::tx_builder::TxBuilder;
8use cosmrs::proto::cosmos::auth::v1beta1::BaseAccount;
9use cosmrs::AccountId;
10use serde::{Deserialize, Serialize};
11use tendermint_rpc::endpoint::broadcast::tx_commit::Response;
12use tendermint_rpc::endpoint::status;
13
14#[derive(Debug)]
15pub struct OracleAdminClient {
16    pub(crate) public_oracle_client: OracleClient,
17    pub(crate) chain_config: ChainConfig,
18}
19
20impl OracleAdminClient {
21    pub fn new(
22        cosmos_client: Arc<CosmosClient>,
23        chain_config: ChainConfig,
24    ) -> Result<Self, OracleError> {
25        let public_oracle_client =
26            OracleClient::new(cosmos_client, chain_config.oracle_contract_address.clone())?;
27        Ok(OracleAdminClient {
28            public_oracle_client,
29            chain_config,
30        })
31    }
32
33    #[cfg(any(test, feature = "test_scenario"))]
34    pub fn from_scenario(
35        scenario: &crate::test_utils::test_scenario::TestScenario,
36        oracle_contract: &str,
37    ) -> Result<Self, OracleError> {
38        let chain_config = scenario.get_chain_config(oracle_contract);
39        Self::new(scenario.cosmos_client.clone(), chain_config)
40    }
41
42    pub async fn execute_tx(&self, builder: TxBuilder) -> Result<Response, OracleError> {
43        self.public_oracle_client
44            .cosmos_client
45            .execute_tx(builder)
46            .await
47            .map_err(OracleError::CosmosClientError)
48    }
49
50    pub async fn broadcast_tx(&self, signed_bytes: Vec<u8>) -> Result<Response, OracleError> {
51        self.public_oracle_client
52            .cosmos_client
53            .broadcast_tx(signed_bytes)
54            .await
55            .map_err(OracleError::CosmosClientError)
56    }
57
58    pub async fn account(&self, account_address: String) -> Result<BaseAccount, OracleError> {
59        self.public_oracle_client.account(account_address).await
60    }
61}
62
63#[derive(Debug)]
64pub struct OracleClient {
65    pub(crate) cosmos_client: Arc<CosmosClient>,
66    pub(crate) oracle_contract_address: AccountId,
67}
68impl OracleClient {
69    pub fn new(
70        cosmos_client: Arc<CosmosClient>,
71        oracle_contract_address: AccountId,
72    ) -> Result<Self, OracleError> {
73        Ok(OracleClient {
74            cosmos_client,
75            oracle_contract_address,
76        })
77    }
78
79    pub async fn status(&self) -> Result<status::Response, OracleError> {
80        self.cosmos_client
81            .status()
82            .await
83            .map_err(OracleError::CosmosClientError)
84    }
85
86    pub async fn account(&self, account_address: String) -> Result<BaseAccount, OracleError> {
87        self.cosmos_client
88            .account(account_address)
89            .await
90            .map_err(OracleError::CosmosClientError)
91    }
92
93    pub(crate) async fn query_contract<QUERY, RESPONSE>(
94        &self,
95        contract_address: String,
96        query: &QUERY,
97        height: Option<u64>,
98    ) -> Result<QueryContractResponse<RESPONSE>, OracleError>
99    where
100        QUERY: Serialize,
101        for<'de> RESPONSE: Deserialize<'de>,
102    {
103        self.cosmos_client
104            .query_contract(contract_address, query, height)
105            .await
106            .map_err(OracleError::CosmosClientError)
107    }
108}
109
110#[cfg(test)]
111mod tests {
112    use serial_test::serial;
113
114    use super::*;
115
116    use crate::test_utils::test_scenario::TestScenario;
117
118    #[tokio::test]
119    #[serial]
120    async fn test_oracle_admin_client() {
121        let test_scenario = TestScenario::new_from_config("config.json".to_string()).await;
122        let oracle_contract_address =
123            "archway1706lywddqxu24ff6426puftkfaw20tyhdkun30pljux7e9alv2fql0q0ca".to_string();
124
125        let client = OracleAdminClient::from_scenario(&test_scenario, &oracle_contract_address);
126        assert!(client.is_ok());
127        let client = client.unwrap();
128        let status = client.public_oracle_client.cosmos_client.status().await;
129        assert!(status.is_ok());
130    }
131
132    #[tokio::test]
133    #[serial]
134    async fn test_oracle_client() {
135        let test_scenario = TestScenario::new_from_config("config.json".to_string()).await;
136        let oracle_contract_address =
137            "archway1706lywddqxu24ff6426puftkfaw20tyhdkun30pljux7e9alv2fql0q0ca".to_string();
138
139        let client = OracleClient::new(
140            test_scenario.cosmos_client,
141            oracle_contract_address.parse().unwrap(),
142        )
143        .unwrap();
144        client.cosmos_client.status().await.unwrap();
145    }
146}