fedimint_wallet_client/
api.rs

1use std::time::Duration;
2
3use bitcoin::{Address, Amount};
4use fedimint_api_client::api::{FederationApiExt, FederationResult, IModuleFederationApi};
5use fedimint_core::envs::BitcoinRpcConfig;
6use fedimint_core::module::{ApiAuth, ApiRequestErased};
7use fedimint_core::task::{MaybeSend, MaybeSync};
8use fedimint_core::{apply, async_trait_maybe_send, PeerId};
9use fedimint_wallet_common::endpoint_constants::{
10    BITCOIN_KIND_ENDPOINT, BITCOIN_RPC_CONFIG_ENDPOINT, BLOCK_COUNT_ENDPOINT,
11    PEG_OUT_FEES_ENDPOINT, WALLET_SUMMARY_ENDPOINT,
12};
13use fedimint_wallet_common::{PegOutFees, WalletSummary};
14
15#[apply(async_trait_maybe_send!)]
16pub trait WalletFederationApi {
17    async fn fetch_consensus_block_count(&self) -> FederationResult<u64>;
18
19    async fn fetch_peg_out_fees(
20        &self,
21        address: &Address,
22        amount: Amount,
23    ) -> FederationResult<Option<PegOutFees>>;
24
25    async fn fetch_bitcoin_rpc_kind(&self, peer_id: PeerId) -> FederationResult<String>;
26
27    async fn fetch_bitcoin_rpc_config(&self, auth: ApiAuth) -> FederationResult<BitcoinRpcConfig>;
28
29    async fn fetch_wallet_summary(&self) -> FederationResult<WalletSummary>;
30}
31
32#[apply(async_trait_maybe_send!)]
33impl<T: ?Sized> WalletFederationApi for T
34where
35    T: IModuleFederationApi + MaybeSend + MaybeSync + 'static,
36{
37    async fn fetch_consensus_block_count(&self) -> FederationResult<u64> {
38        self.request_current_consensus(
39            BLOCK_COUNT_ENDPOINT.to_string(),
40            ApiRequestErased::default(),
41        )
42        .await
43    }
44
45    async fn fetch_peg_out_fees(
46        &self,
47        address: &Address,
48        amount: Amount,
49    ) -> FederationResult<Option<PegOutFees>> {
50        self.request_current_consensus(
51            PEG_OUT_FEES_ENDPOINT.to_string(),
52            ApiRequestErased::new((address, amount.to_sat())),
53        )
54        .await
55    }
56
57    async fn fetch_bitcoin_rpc_kind(&self, peer_id: PeerId) -> FederationResult<String> {
58        self.request_single_peer_federation(
59            Some(Duration::from_secs(10)),
60            BITCOIN_KIND_ENDPOINT.to_string(),
61            ApiRequestErased::default(),
62            peer_id,
63        )
64        .await
65    }
66
67    async fn fetch_bitcoin_rpc_config(&self, auth: ApiAuth) -> FederationResult<BitcoinRpcConfig> {
68        self.request_admin(
69            BITCOIN_RPC_CONFIG_ENDPOINT,
70            ApiRequestErased::default(),
71            auth,
72        )
73        .await
74    }
75
76    async fn fetch_wallet_summary(&self) -> FederationResult<WalletSummary> {
77        self.request_current_consensus(
78            WALLET_SUMMARY_ENDPOINT.to_string(),
79            ApiRequestErased::default(),
80        )
81        .await
82    }
83}