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