use crate::{api::Api, rpc::Request};
use ac_compose_macros::compose_extrinsic;
use ac_primitives::{
config::Config, extrinsic_params::ExtrinsicParams, extrinsics::CallIndex, SignExtrinsic,
UncheckedExtrinsic,
};
#[cfg(all(not(feature = "sync-api"), not(feature = "std")))]
use alloc::boxed::Box;
use codec::{Compact, Encode};
pub const BALANCES_MODULE: &str = "Balances";
pub const TRANSFER_ALLOW_DEATH: &str = "transfer_allow_death";
pub const TRANSFER_KEEP_ALIVE: &str = "transfer_keep_alive";
pub const FORCE_SET_BALANCE: &str = "force_set_balance";
pub type TransferAllowDeathCall<Address, Balance> = (CallIndex, Address, Compact<Balance>);
pub type TransferKeepAliveCall<Address, Balance> = (CallIndex, Address, Compact<Balance>);
pub type ForceSetBalanceCall<Address, Balance> = (CallIndex, Address, Compact<Balance>);
#[maybe_async::maybe_async(?Send)]
pub trait BalancesExtrinsics {
type Balance;
type Address;
type Extrinsic<Call>;
#[allow(clippy::type_complexity)]
async fn balance_transfer_allow_death(
&self,
to: Self::Address,
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferAllowDeathCall<Self::Address, Self::Balance>>>;
#[allow(clippy::type_complexity)]
async fn balance_transfer_keep_alive(
&self,
to: Self::Address,
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferKeepAliveCall<Self::Address, Self::Balance>>>;
#[allow(clippy::type_complexity)]
async fn balance_force_set_balance(
&self,
who: Self::Address,
free_balance: Self::Balance,
) -> Option<Self::Extrinsic<ForceSetBalanceCall<Self::Address, Self::Balance>>>;
}
#[maybe_async::maybe_async(?Send)]
impl<T, Client> BalancesExtrinsics for Api<T, Client>
where
T: Config,
Client: Request,
Compact<T::Balance>: Encode,
{
type Balance = T::Balance;
type Address = <T::ExtrinsicSigner as SignExtrinsic<T::AccountId>>::ExtrinsicAddress;
type Extrinsic<Call> = UncheckedExtrinsic<
Self::Address,
Call,
<T::ExtrinsicSigner as SignExtrinsic<T::AccountId>>::Signature,
<T::ExtrinsicParams as ExtrinsicParams<T::Index, T::Hash>>::TxExtension,
>;
async fn balance_transfer_allow_death(
&self,
to: Self::Address,
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferAllowDeathCall<Self::Address, Self::Balance>>> {
compose_extrinsic!(self, BALANCES_MODULE, TRANSFER_ALLOW_DEATH, to, Compact(amount))
}
#[allow(clippy::type_complexity)]
async fn balance_transfer_keep_alive(
&self,
to: Self::Address,
amount: Self::Balance,
) -> Option<Self::Extrinsic<TransferKeepAliveCall<Self::Address, Self::Balance>>> {
compose_extrinsic!(self, BALANCES_MODULE, TRANSFER_KEEP_ALIVE, to, Compact(amount))
}
async fn balance_force_set_balance(
&self,
who: Self::Address,
free_balance: Self::Balance,
) -> Option<Self::Extrinsic<ForceSetBalanceCall<Self::Address, Self::Balance>>> {
compose_extrinsic!(self, BALANCES_MODULE, FORCE_SET_BALANCE, who, Compact(free_balance))
}
}