1use crate::{
4 ByNameParamsBuilder, OgmiosClient, OgmiosClientError, OgmiosParams,
5 types::{OgmiosBytesSize, OgmiosUtxo, OgmiosValue, SlotLength, TimeSeconds},
6};
7use serde::Deserialize;
8
9pub trait QueryLedgerState {
11 #[allow(async_fn_in_trait)]
12 async fn get_tip(&self) -> Result<OgmiosTip, OgmiosClientError>;
14
15 #[allow(async_fn_in_trait)]
16 async fn era_summaries(&self) -> Result<Vec<EraSummary>, OgmiosClientError>;
18
19 #[allow(async_fn_in_trait)]
20 async fn query_utxos(&self, addresses: &[String])
23 -> Result<Vec<OgmiosUtxo>, OgmiosClientError>;
24
25 #[allow(async_fn_in_trait)]
26 async fn query_protocol_parameters(
28 &self,
29 ) -> Result<ProtocolParametersResponse, OgmiosClientError>;
30}
31
32pub trait QueryUtxoByUtxoId {
34 #[allow(async_fn_in_trait)]
35 async fn query_utxo_by_id(
41 &self,
42 utxo: sidechain_domain::UtxoId,
43 ) -> Result<Option<OgmiosUtxo>, OgmiosClientError>;
44}
45
46impl<T: OgmiosClient> QueryLedgerState for T {
47 async fn get_tip(&self) -> Result<OgmiosTip, OgmiosClientError> {
48 self.request("queryLedgerState/tip", OgmiosParams::empty_positional()).await
49 }
50
51 async fn era_summaries(&self) -> Result<Vec<EraSummary>, OgmiosClientError> {
52 self.request("queryLedgerState/eraSummaries", OgmiosParams::empty_positional())
53 .await
54 }
55
56 async fn query_utxos(
57 &self,
58 addresses: &[String],
59 ) -> Result<Vec<OgmiosUtxo>, OgmiosClientError> {
60 let params = ByNameParamsBuilder::new().insert("addresses", addresses)?.build();
61 self.request("queryLedgerState/utxo", params).await
62 }
63
64 async fn query_protocol_parameters(
65 &self,
66 ) -> Result<ProtocolParametersResponse, OgmiosClientError> {
67 self.request("queryLedgerState/protocolParameters", OgmiosParams::empty_by_name())
68 .await
69 }
70}
71
72impl<T: OgmiosClient> QueryUtxoByUtxoId for T {
73 async fn query_utxo_by_id(
74 &self,
75 utxo: sidechain_domain::UtxoId,
76 ) -> Result<Option<OgmiosUtxo>, OgmiosClientError> {
77 let reference = serde_json::json!({
78 "transaction": {"id": hex::encode(utxo.tx_hash.0)},
79 "index": utxo.index.0,
80 });
81 let params =
82 ByNameParamsBuilder::new().insert("outputReferences", vec![reference])?.build();
83 let utxos: Vec<OgmiosUtxo> = self.request("queryLedgerState/utxo", params).await?;
85 Ok(utxos.first().cloned())
86 }
87}
88
89#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
90#[serde(rename_all = "camelCase")]
91pub struct EraSummary {
93 pub start: EpochBoundary,
95 pub end: EpochBoundary,
97 pub parameters: EpochParameters,
99}
100
101#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
102pub struct EpochBoundary {
104 pub time: TimeSeconds,
105 pub slot: u64,
106 pub epoch: u32,
107}
108
109#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
110#[serde(rename_all = "camelCase")]
111pub struct EpochParameters {
113 pub epoch_length: u32,
115 pub slot_length: SlotLength,
117 pub safe_zone: u32,
119}
120
121#[derive(Clone, Debug, Deserialize, PartialEq, Default)]
122#[serde(rename_all = "camelCase")]
123pub struct ReferenceScriptsCosts {
125 pub base: f64,
127}
128
129#[derive(Clone, Debug, Deserialize, PartialEq, Default)]
130#[serde(rename_all = "camelCase")]
131pub struct ProtocolParametersResponse {
133 pub min_fee_coefficient: u32,
135 pub min_fee_constant: OgmiosValue,
137 pub stake_pool_deposit: OgmiosValue,
139 pub stake_credential_deposit: OgmiosValue,
141 pub max_value_size: OgmiosBytesSize,
143 pub max_transaction_size: OgmiosBytesSize,
145 pub min_utxo_deposit_coefficient: u64,
147 pub script_execution_prices: ScriptExecutionPrices,
149 pub plutus_cost_models: PlutusCostModels,
151 pub max_collateral_inputs: u32,
153 pub collateral_percentage: u32,
155 pub min_fee_reference_scripts: ReferenceScriptsCosts,
157}
158
159#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Default)]
160pub struct ScriptExecutionPrices {
162 #[serde(deserialize_with = "crate::types::parse_fraction_ratio_u64")]
163 pub memory: fraction::Ratio<u64>,
165 #[serde(deserialize_with = "crate::types::parse_fraction_ratio_u64")]
166 pub cpu: fraction::Ratio<u64>,
168}
169
170#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Default)]
171pub struct PlutusCostModels {
173 #[serde(rename = "plutus:v1")]
174 pub plutus_v1: Vec<i128>,
176 #[serde(rename = "plutus:v2")]
177 pub plutus_v2: Vec<i128>,
179 #[serde(rename = "plutus:v3")]
180 pub plutus_v3: Vec<i128>,
182}
183
184#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Default)]
185pub struct OgmiosTip {
187 pub slot: u64,
189}