fedimint_meta_client/
api.rs

1use fedimint_api_client::api::{FederationApiExt as _, FederationResult, IModuleFederationApi};
2use fedimint_core::module::{ApiAuth, ApiRequestErased};
3use fedimint_core::task::{MaybeSend, MaybeSync};
4use fedimint_core::{apply, async_trait_maybe_send};
5use fedimint_meta_common::endpoint::{
6    GetConsensusRequest, GetSubmissionResponse, GetSubmissionsRequest, SubmitRequest,
7    GET_CONSENSUS_ENDPOINT, GET_CONSENSUS_REV_ENDPOINT, GET_SUBMISSIONS_ENDPOINT, SUBMIT_ENDPOINT,
8};
9use fedimint_meta_common::{MetaConsensusValue, MetaKey, MetaValue};
10
11#[apply(async_trait_maybe_send!)]
12pub trait MetaFederationApi {
13    async fn get_consensus(&self, key: MetaKey) -> FederationResult<Option<MetaConsensusValue>>;
14    async fn get_consensus_rev(&self, key: MetaKey) -> FederationResult<Option<u64>>;
15    async fn get_submissions(
16        &self,
17        key: MetaKey,
18        auth: ApiAuth,
19    ) -> FederationResult<GetSubmissionResponse>;
20    async fn submit(
21        &self,
22        key: MetaKey,
23        value: MetaValue,
24        auth: ApiAuth,
25    ) -> FederationResult<Option<u64>>;
26}
27
28#[apply(async_trait_maybe_send!)]
29impl<T: ?Sized> MetaFederationApi for T
30where
31    T: IModuleFederationApi + MaybeSend + MaybeSync + 'static,
32{
33    async fn get_consensus(&self, key: MetaKey) -> FederationResult<Option<MetaConsensusValue>> {
34        self.request_current_consensus(
35            GET_CONSENSUS_ENDPOINT.to_string(),
36            ApiRequestErased::new(GetConsensusRequest(key)),
37        )
38        .await
39    }
40    async fn get_consensus_rev(&self, key: MetaKey) -> FederationResult<Option<u64>> {
41        self.request_current_consensus(
42            GET_CONSENSUS_REV_ENDPOINT.to_string(),
43            ApiRequestErased::new(GetConsensusRequest(key)),
44        )
45        .await
46    }
47
48    async fn get_submissions(
49        &self,
50        key: MetaKey,
51        auth: ApiAuth,
52    ) -> FederationResult<GetSubmissionResponse> {
53        self.request_admin(
54            GET_SUBMISSIONS_ENDPOINT,
55            ApiRequestErased::new(GetSubmissionsRequest(key)),
56            auth,
57        )
58        .await
59    }
60    async fn submit(
61        &self,
62        key: MetaKey,
63        value: MetaValue,
64        auth: ApiAuth,
65    ) -> FederationResult<Option<u64>> {
66        self.request_admin(
67            SUBMIT_ENDPOINT,
68            ApiRequestErased::new(SubmitRequest { key, value }),
69            auth,
70        )
71        .await
72    }
73}