#[feeless_if]Expand description
Allows defining logic to make an extrinsic call feeless.
Each dispatchable may be annotated with the #[pallet::feeless_if($closure)]
attribute, which explicitly defines the condition for the dispatchable to be feeless.
The arguments for the closure must be the referenced arguments of the dispatchable function.
The closure must return bool.
§Example
#[frame_support::pallet(dev_mode)]
mod pallet {
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::call]
impl<T: Config> Pallet<T> {
#[pallet::call_index(0)]
/// Marks this call as feeless if `foo` is zero.
#[pallet::feeless_if(|_origin: &OriginFor<T>, foo: &u32| -> bool {
*foo == 0
})]
pub fn something(
_: OriginFor<T>,
foo: u32,
) -> DispatchResult {
unimplemented!()
}
}
}Please note that this only works for signed dispatchables and requires a transaction
extension such as pallet_skip_feeless_payment::SkipCheckIfFeeless to wrap the
existing payment extension. Else, this is completely ignored and the dispatchable is
still charged.
Also this will not allow accountless caller to send a transaction if some transaction
extension such as frame_system::CheckNonce is used.
Extensions such as frame_system::CheckNonce require a funded account to validate
the transaction.
§Macro expansion
The macro implements the pallet_skip_feeless_payment::CheckIfFeeless trait on the
dispatchable and calls the corresponding closure in the implementation.
Documentation for this macro can be found at frame_support::pallet_macros::feeless_if.