fireblocks_sdk/client/
transfer.rs1use {
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 sub_type: None,
41 id: Some(String::from(vault_id)),
42 name: None,
43 wallet_id: None,
44 });
45 let uuid = uuid::Uuid::try_from(dest_id)?;
46 req.destination = Some(DestinationTransferPeerPath {
47 r#type: peer,
48 sub_type: None,
49 id: Some(uuid.to_string()),
50 name: None,
51 wallet_id: None,
52 one_time_address: None,
53 });
54 req.asset_id = Some(asset_id.into());
55 req.amount = Some(crate::models::TransactionRequestAmount::String(
56 amount.into(),
57 ));
58 let params = CreateTransactionParams::builder()
59 .transaction_request(req)
60 .build();
61 let response = api
62 .create_transaction(params)
63 .await
64 .map_err(|e| FireblocksError::FetchCreateTransactionError(e.to_string()))?;
65
66 Ok(response)
67 }
68}