bolt_cw_sdk/oracle/
client.rs1use 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}