• gupnik's avatar
    Construct Runtime v2 (#1378) · 82f3c3e2
    gupnik authored
    Moved from https://github.com/paritytech/substrate/pull/14788
    
    ----
    
    Fixes https://github.com/paritytech/polkadot-sdk/issues/232
    
    This PR introduces outer-macro approach for `construct_runtime` as
    discussed in the linked issue. It looks like the following:
    ```rust
    #[frame_support::runtime]
    mod runtime {
    	#[runtime::runtime]
            #[runtime::derive(
    		RuntimeCall,
    		RuntimeEvent,
    		RuntimeError,
    		RuntimeOrigin,
    		RuntimeFreezeReason,
    		RuntimeHoldReason,
    		RuntimeSlashReason,
    		RuntimeLockId,
                    RuntimeTask,
    	)]
    	pub struct Runtime;
    
    	#[runtime::pallet_index(0)]
    	pub type System = frame_system;
    
    	#[runtime::pallet_index(1)]
    	pub type Timestamp = pallet_timestamp;
    
    	#[runtime::pallet_index(2)]
    	pub type Aura = pallet_aura;
    
    	#[runtime::pallet_index(3)]
    	pub type Grandpa = pallet_grandpa;
    
    	#[runtime::pallet_index(4)]
    	pub type Balances = pallet_balances;
    
    	#[runtime::pallet_index(5)]
    	pub type TransactionPayment = pallet_transaction_payment;
    
    	#[runtime::pallet_index(6)]
    	pub type Sudo = pallet_sudo;
    
    	// Include the custom logic from the pallet-template in the runtime.
    	#[runtime::pallet_index(7)]
    	pub type TemplateModule = pallet_template;
    }
    ```
    
    ## Features
    - `#[runtime::runtime]` attached to a struct defines the main runtime
    - `#[runtime::derive]` attached to this struct defines the types
    generated by runtime
    - `#[runtime::pallet_index]` must be attached to a pallet to define its
    index
    - `#[runtime::disable_call]` can be optionally attached to a pallet to
    disable its calls
    - `#[runtime::disable_unsigned]` can be optionally attached to a pallet
    to disable unsigned calls
    - A pallet instance can be defined as `TemplateModule:
    pallet_template<Instance>`
    - An optional attribute can be defined as
    `#[frame_support::runtime(legacy_ordering)]` to ensure that the order of
    hooks is same as the order of pallets (and not based on the
    pallet_index). This is to support legacy runtimes and should be avoided
    for new ones.
    
    ## Todo
    - [x] Update the latest syntax in kitchensink and tests
    - [x] Update UI tests
    - [x] Docs
    
    ## Extension
    - Abstract away the Executive similar to
    https://github.com/paritytech/substrate/pull/14742
    
    
    - Optionally avoid the need to specify all runtime types (TBD)
    
    ---------
    
    Co-authored-by: default avatarFrancisco Aguirre <[email protected]>
    Co-authored-by: Nikhil Gupta <>
    82f3c3e2