fireblocks_sdk/client/
transfer.rs

1use {
2    super::Client,
3    crate::{
4        WalletType,
5        apis::{Api, transactions_api::CreateTransactionParams},
6        error::FireblocksError,
7        models::{
8            CreateTransactionResponse,
9            DestinationTransferPeerPath,
10            SourceTransferPeerPath,
11            TransactionRequest,
12            TransferPeerPathType,
13            transaction_request::FeeLevel,
14        },
15    },
16};
17
18impl Client {
19    pub async fn vault_whitelist_transfer(
20        &self,
21        vault_id: &str,
22        asset_id: impl Into<String>,
23        amount: impl Into<String>,
24        dest_type: WalletType,
25        dest_id: &str,
26        fee_level: Option<FeeLevel>,
27    ) -> crate::Result<CreateTransactionResponse> {
28        let api = self.api_client.transactions_api();
29        let mut req = TransactionRequest::default();
30        let peer: TransferPeerPathType = match dest_type {
31            WalletType::Internal => TransferPeerPathType::InternalWallet,
32            WalletType::External => TransferPeerPathType::ExternalWallet,
33            WalletType::Contract => TransferPeerPathType::Contract,
34        };
35        if fee_level.is_some() {
36            req.fee_level = fee_level;
37        }
38        req.source = Some(SourceTransferPeerPath {
39            r#type: TransferPeerPathType::VaultAccount,
40            id: Some(String::from(vault_id)),
41            ..Default::default()
42        });
43        let uuid = uuid::Uuid::try_from(dest_id)?;
44        req.destination = Some(DestinationTransferPeerPath {
45            r#type: peer,
46            id: Some(uuid.to_string()),
47            ..Default::default()
48        });
49        req.asset_id = Some(asset_id.into());
50        req.amount = Some(crate::models::TransactionRequestAmount::String(
51            amount.into(),
52        ));
53        let params = CreateTransactionParams::builder()
54            .transaction_request(req)
55            .build();
56        let response = api
57            .create_transaction(params)
58            .await
59            .map_err(|e| FireblocksError::FetchCreateTransactionError(e.to_string()))?;
60
61        Ok(response)
62    }
63}