referrerpolicy=no-referrer-when-downgrade

Attribute Macro frame_support::pallet_macros::feeless_if

source ·
#[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.