Skip to content

Commit

Permalink
feat: account allowance delete transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
PRei-A committed Jul 8, 2022
1 parent c8b820f commit 7c3c33c
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 1 deletion.
92 changes: 92 additions & 0 deletions sdk/rust/src/account/account_allowance_delete_transaction.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
use async_trait::async_trait;
use hedera_proto::services;
use hedera_proto::services::crypto_service_client::CryptoServiceClient;
use serde_with::skip_serializing_none;
use tonic::transport::Channel;

use crate::protobuf::ToProtobuf;
use crate::transaction::{AnyTransactionData, ToTransactionDataProtobuf, TransactionExecute};
use crate::{AccountAddress, AccountId, TokenId, Transaction};

/// Mark an account as deleted, moving all its current hbars to another account.
///
/// It will remain in the ledger, marked as deleted, until it expires.
/// Transfers into it a deleted account will fail.
///
pub type AccountDeleteAllowanceTransaction = Transaction<AccountDeleteAllowanceTransactionData>;

#[skip_serializing_none]
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountDeleteAllowanceTransactionData {
pub nft_allowances: Vec<NftRemoveAllowanceData>,
}

#[skip_serializing_none]
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NftRemoveAllowanceData {
/// token that the allowance pertains to
pub token_id: Option<TokenId>,

/// The account ID that owns token.
pub owner: Option<AccountAddress>,

/// The list of serial numbers to remove allowances from.
pub serial_numbers: Vec<i64>,

}

impl AccountDeleteAllowanceTransaction {
/// Sets the account ID which should be deleted.
pub fn nft_allowances(&mut self, id: impl Into<Vec<NftRemoveAllowanceData>>) -> &mut Self {
self.body.data.nft_allowances = id.into();
self
}
}

#[async_trait]
impl TransactionExecute for AccountDeleteAllowanceTransactionData {
async fn execute(
&self,
channel: Channel,
request: services::Transaction,
) -> Result<tonic::Response<services::TransactionResponse>, tonic::Status> {
CryptoServiceClient::new(channel).delete_allowances(request).await
}
}

impl ToTransactionDataProtobuf for AccountDeleteAllowanceTransactionData {
fn to_transaction_data_protobuf(
&self,
_node_account_id: AccountId,
_transaction_id: &crate::TransactionId,
) -> services::transaction_body::Data {
let nft_allowances = self
.nft_allowances
.iter()
.map(|allowance| allowance.to_protobuf())
.collect::<Vec<_>>();
services::transaction_body::Data::CryptoDeleteAllowance(services::CryptoDeleteAllowanceTransactionBody {
nft_allowances,
})
}
}

impl From<AccountDeleteAllowanceTransactionData> for AnyTransactionData {
fn from(transaction: AccountDeleteAllowanceTransactionData) -> Self {
Self::AccountDeleteAllowance(transaction)
}
}

impl ToProtobuf for NftRemoveAllowanceData {
type Protobuf = services::NftRemoveAllowance;

fn to_protobuf(&self) -> Self::Protobuf {
Self::Protobuf{
token_id: self.token_id.as_ref().map(|id| id.to_protobuf()),
owner: self.owner.as_ref().map(|id| id.to_protobuf()),
serial_numbers: self.serial_numbers.clone(),
}
}
}
3 changes: 3 additions & 0 deletions sdk/rust/src/account/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod account_id;
mod account_info;
mod account_info_query;
mod account_update_transaction;
mod account_allowance_delete_transaction;

pub use account_balance::AccountBalanceResponse;
pub use account_balance_query::AccountBalanceQuery;
Expand All @@ -20,3 +21,5 @@ pub use account_info_query::AccountInfoQuery;
pub(crate) use account_info_query::AccountInfoQueryData;
pub use account_update_transaction::AccountUpdateTransaction;
pub(crate) use account_update_transaction::AccountUpdateTransactionData;
pub use account_allowance_delete_transaction::AccountDeleteAllowanceTransaction;
pub(crate) use account_allowance_delete_transaction::AccountDeleteAllowanceTransactionData;
9 changes: 8 additions & 1 deletion sdk/rust/src/transaction/any.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use tonic::transport::Channel;
use tonic::{Response, Status};

use crate::account::{
AccountCreateTransactionData, AccountDeleteTransactionData, AccountUpdateTransactionData
AccountCreateTransactionData, AccountDeleteTransactionData, AccountUpdateTransactionData, AccountDeleteAllowanceTransactionData
};
use crate::contract::{
ContractCreateTransactionData, ContractDeleteTransactionData, ContractExecuteTransactionData, ContractUpdateTransactionData
Expand All @@ -34,6 +34,7 @@ pub enum AnyTransactionData {
AccountCreate(AccountCreateTransactionData),
AccountUpdate(AccountUpdateTransactionData),
AccountDelete(AccountDeleteTransactionData),
AccountDeleteAllowance(AccountDeleteAllowanceTransactionData),
ContractCreate(ContractCreateTransactionData),
ContractUpdate(ContractUpdateTransactionData),
ContractDelete(ContractDeleteTransactionData),
Expand Down Expand Up @@ -87,6 +88,10 @@ impl ToTransactionDataProtobuf for AnyTransactionData {
transaction.to_transaction_data_protobuf(node_account_id, transaction_id)
}

Self::AccountDeleteAllowance(transaction) => {
transaction.to_transaction_data_protobuf(node_account_id, transaction_id)
}

Self::ContractCreate(transaction) => {
transaction.to_transaction_data_protobuf(node_account_id, transaction_id)
}
Expand Down Expand Up @@ -206,6 +211,7 @@ impl TransactionExecute for AnyTransactionData {
Self::AccountCreate(transaction) => transaction.default_max_transaction_fee(),
Self::AccountUpdate(transaction) => transaction.default_max_transaction_fee(),
Self::AccountDelete(transaction) => transaction.default_max_transaction_fee(),
Self::AccountDeleteAllowance(transaction) => transaction.default_max_transaction_fee(),
Self::ContractCreate(transaction) => transaction.default_max_transaction_fee(),
Self::ContractUpdate(transaction) => transaction.default_max_transaction_fee(),
Self::ContractDelete(transaction) => transaction.default_max_transaction_fee(),
Expand Down Expand Up @@ -246,6 +252,7 @@ impl TransactionExecute for AnyTransactionData {
Self::AccountCreate(transaction) => transaction.execute(channel, request).await,
Self::AccountUpdate(transaction) => transaction.execute(channel, request).await,
Self::AccountDelete(transaction) => transaction.execute(channel, request).await,
Self::AccountDeleteAllowance(transaction) => transaction.execute(channel, request).await,
Self::ContractCreate(transaction) => transaction.execute(channel, request).await,
Self::ContractUpdate(transaction) => transaction.execute(channel, request).await,
Self::ContractDelete(transaction) => transaction.execute(channel, request).await,
Expand Down

0 comments on commit 7c3c33c

Please sign in to comment.