Skip to content
  • gupnik's avatar
    Adds syntax for marking calls feeless (#1926) · 60c77a2e
    gupnik authored
    
    
    Fixes https://github.com/paritytech/polkadot-sdk/issues/1725
    
    This PR adds the following changes:
    1. An attribute `pallet::feeless_if` that can be optionally attached to
    a call like so:
    ```rust
    #[pallet::feeless_if(|_origin: &OriginFor<T>, something: &u32| -> bool {
    	*something == 0
    })]
    pub fn do_something(origin: OriginFor<T>, something: u32) -> DispatchResult {
         ....
    }
    ```
    The closure passed accepts references to arguments as specified in the
    call fn. It returns a boolean that denotes the conditions required for
    this call to be "feeless".
    
    2. A signed extension `SkipCheckIfFeeless<T: SignedExtension>` that
    wraps a transaction payment processor such as
    `pallet_transaction_payment::ChargeTransactionPayment`. It checks for
    all calls annotated with `pallet::feeless_if` to see if the conditions
    are met. If so, the wrapped signed extension is not called, essentially
    making the call feeless.
    
    In order to use this, you can simply replace your existing signed
    extension that manages transaction payment like so:
    ```diff
    - pallet_transaction_payment::ChargeTransactionPayment<Runtime>,
    + pallet_skip_feeless_payment::SkipCheckIfFeeless<
    +	Runtime,
    +	pallet_transaction_payment::ChargeTransactionPayment<Runtime>,
    + >,
    ```
    
    ### Todo
    - [x] Tests
    - [x] Docs
    - [x] Prdoc
    
    ---------
    
    Co-authored-by: Nikhil Gupta <>
    Co-authored-by: default avatarOliver Tale-Yazdi <[email protected]>
    Co-authored-by: default avatarFrancisco Aguirre <[email protected]>
    Co-authored-by: default avatarLiam Aharon <[email protected]>
    60c77a2e