feat: FRAME umbrella crate. (#1337)

### Original PR https://github.com/paritytech/substrate/pull/14137

This PR brings in the first version of the "_`frame` umbrella crate_".
This crate is intended to serve two purposes:

1. documentation
2. easier development with frame. Ideally, we want most users to be able
to build a frame-based pallet and runtime using just `frame` (plus
`scale-codec` and `scale-info`).

The crate is not finalized and is not yet intended for external use.
Therefore, the version is set to `0.0.1-dev`, this PR is `silent`, and
the entire crate is hidden behind the `experimental` flag. The main
intention in merging it early on is to be able to iterate on it in the
rest of
[`developer-hub`](https://github.com/paritytech/polkadot-sdk-docs/)
efforts.

The public API of the `frame` crate is at the moment as follows: 

```
pub mod frame
pub use frame::log
pub use frame::pallet
pub mod frame::arithmetic
pub use frame::arithmetic::<<sp_arithmetic::*>>
pub use frame::arithmetic::<<sp_arithmetic::traits::*>>
pub mod frame::deps
pub use frame::deps::codec
pub use frame::deps::frame_executive
pub use frame::deps::frame_support
pub use frame::deps::frame_system
pub use frame::deps::scale_info
pub use frame::deps::sp_api
pub use frame::deps::sp_arithmetic
pub use frame::deps::sp_block_builder
pub use frame::deps::sp_consensus_aura
pub use frame::deps::sp_consensus_grandpa
pub use frame::deps::sp_core
pub use frame::deps::sp_inherents
pub use frame::deps::sp_io
pub use frame::deps::sp_offchain
pub use frame::deps::sp_runtime
pub use frame::deps::sp_std
pub use frame::deps::sp_version
pub mod frame::derive
pub use frame::derive::CloneNoBound
pub use frame::derive::Debug
pub use frame::derive::Debug
pub use frame::derive::DebugNoBound
pub use frame::derive::Decode
pub use frame::derive::Decode
pub use frame::derive::DefaultNoBound
pub use frame::derive::Encode
pub use frame::derive::Encode
pub use frame::derive::EqNoBound
pub use frame::derive::PartialEqNoBound
pub use frame::derive::RuntimeDebug
pub use frame::derive::RuntimeDebugNoBound
pub use frame::derive::TypeInfo
pub use frame::derive::TypeInfo
pub mod frame::prelude
pub use frame::prelude::<<frame_support::pallet_prelude::*>>
pub use frame::prelude::<<frame_system::pallet_prelude::*>>
pub use frame::prelude::<<sp_std::prelude::*>>
pub use frame::prelude::CloneNoBound
pub use frame::prelude::Debug
pub use frame::prelude::Debug
pub use frame::prelude::DebugNoBound
pub use frame::prelude::Decode
pub use frame::prelude::Decode
pub use frame::prelude::DefaultNoBound
pub use frame::prelude::Encode
pub use frame::prelude::Encode
pub use frame::prelude::EqNoBound
pub use frame::prelude::PartialEqNoBound
pub use frame::prelude::RuntimeDebug
pub use frame::prelude::RuntimeDebugNoBound
pub use frame::prelude::TypeInfo
pub use frame::prelude::TypeInfo
pub use frame::prelude::frame_system
pub mod frame::primitives
pub use frame::primitives::BlakeTwo256
pub use frame::primitives::H160
pub use frame::primitives::H256
pub use frame::primitives::H512
pub use frame::primitives::Hash
pub use frame::primitives::Keccak256
pub use frame::primitives::U256
pub use frame::primitives::U512
pub mod frame::runtime
pub mod frame::runtime::apis
pub use frame::runtime::apis::<<frame_system_rpc_runtime_api::*>>
pub use frame::runtime::apis::<<sp_api::*>>
pub use frame::runtime::apis::<<sp_block_builder::*>>
pub use frame::runtime::apis::<<sp_consensus_aura::*>>
pub use frame::runtime::apis::<<sp_consensus_grandpa::*>>
pub use frame::runtime::apis::<<sp_offchain::*>>
pub use frame::runtime::apis::<<sp_session::runtime_api::*>>
pub use frame::runtime::apis::<<sp_transaction_pool::runtime_api::*>>
pub use frame::runtime::apis::ApplyExtrinsicResult
pub use frame::runtime::apis::CheckInherentsResult
pub use frame::runtime::apis::InherentData
pub use frame::runtime::apis::OpaqueMetadata
pub use frame::runtime::apis::impl_runtime_apis
pub use frame::runtime::apis::sp_api
pub mod frame::runtime::prelude
pub use frame::runtime::prelude::<<frame_executive::*>>
pub use frame::runtime::prelude::ConstBool
pub use frame::runtime::prelude::ConstI128
pub use frame::runtime::prelude::ConstI16
pub use frame::runtime::prelude::ConstI32
pub use frame::runtime::prelude::ConstI64
pub use frame::runtime::prelude::ConstI8
pub use frame::runtime::prelude::ConstU128
pub use frame::runtime::prelude::ConstU16
pub use frame::runtime::prelude::ConstU32
pub use frame::runtime::prelude::ConstU64
pub use frame::runtime::prelude::ConstU8
pub use frame::runtime::prelude::NativeVersion
pub use frame::runtime::prelude::RuntimeVersion
pub use frame::runtime::prelude::construct_runtime
pub use frame::runtime::prelude::create_runtime_str
pub use frame::runtime::prelude::derive_impl
pub use frame::runtime::prelude::frame_support
pub use frame::runtime::prelude::ord_parameter_types
pub use frame::runtime::prelude::parameter_types
pub use frame::runtime::prelude::runtime_version
pub mod frame::runtime::testing_prelude
pub use frame::runtime::testing_prelude::BuildStorage
pub use frame::runtime::testing_prelude::Storage
pub mod frame::runtime::types_common
pub type frame::runtime::types_common::AccountId = <<frame::runtime::types_common::Signature as sp_runtime::traits::Verify>::Signer as sp_runtime::traits::IdentifyAccount>::AccountId
pub type frame::runtime::types_common::BlockNumber = u32
pub type frame::runtime::types_common::BlockOf<T, Extra> = sp_runtime::generic::block::Block<sp_runtime::generic::header::Header<frame::runtime::types_common::BlockNumber, sp_runtime::traits::BlakeTwo256>, sp_runtime::generic::unchecked_extrinsic::UncheckedExtrinsic<sp_runtime::multiaddress::MultiAddress<frame::runtime::types_common::AccountId, ()>, <T as frame_system::pallet::Config>::RuntimeCall, frame::runtime::types_common::Signature, Extra>>
pub type frame::runtime::types_common::OpaqueBlock = sp_runtime::generic::block::Block<sp_runtime::generic::header::Header<frame::runtime::types_common::BlockNumber, sp_runtime::traits::BlakeTwo256>, sp_runtime::OpaqueExtrinsic>
pub type frame::runtime::types_common::Signature = sp_runtime::MultiSignature
pub type frame::runtime::types_common::SystemSignedExtensionsOf<T> = (frame_system::extensions::check_non_zero_sender::CheckNonZeroSender<T>, frame_system::extensions::check_spec_version::CheckSpecVersion<T>, frame_system::extensions::check_tx_version::CheckTxVersion<T>, frame_system::extensions::check_genesis::CheckGenesis<T>, frame_system::extensions::check_mortality::CheckMortality<T>, frame_system::extensions::check_nonce::CheckNonce<T>, frame_system::extensions::check_weight::CheckWeight<T>)
pub mod frame::testing_prelude
pub use frame::testing_prelude::<<frame_executive::*>>
pub use frame::testing_prelude::<<frame_system::mocking::*>>
pub use frame::testing_prelude::BuildStorage
pub use frame::testing_prelude::ConstBool
pub use frame::testing_prelude::ConstI128
pub use frame::testing_prelude::ConstI16
pub use frame::testing_prelude::ConstI32
pub use frame::testing_prelude::ConstI64
pub use frame::testing_prelude::ConstI8
pub use frame::testing_prelude::ConstU128
pub use frame::testing_prelude::ConstU16
pub use frame::testing_prelude::ConstU32
pub use frame::testing_prelude::ConstU64
pub use frame::testing_prelude::ConstU8
pub use frame::testing_prelude::NativeVersion
pub use frame::testing_prelude::RuntimeVersion
pub use frame::testing_prelude::Storage
pub use frame::testing_prelude::TestState
pub use frame::testing_prelude::assert_err
pub use frame::testing_prelude::assert_err_ignore_postinfo
pub use frame::testing_prelude::assert_error_encoded_size
pub use frame::testing_prelude::assert_noop
pub use frame::testing_prelude::assert_ok
pub use frame::testing_prelude::assert_storage_noop
pub use frame::testing_prelude::construct_runtime
pub use frame::testing_prelude::create_runtime_str
pub use frame::testing_prelude::derive_impl
pub use frame::testing_prelude::frame_support
pub use frame::testing_prelude::frame_system
pub use frame::testing_prelude::if_std
pub use frame::testing_prelude::ord_parameter_types
pub use frame::testing_prelude::parameter_types
pub use frame::testing_prelude::runtime_version
pub use frame::testing_prelude::storage_alias
pub mod frame::traits
pub use frame::traits::<<frame_support::traits::*>>
pub use frame::traits::<<sp_runtime::traits::*>>
```

---

The road to full stabilization is

- [ ] https://github.com/paritytech/polkadot-sdk/issues/127
- [ ] have a more intentional version bump, as opposed to the current bi
weekly force-major-bump
- [ ] revise the internal API of `frame`, especially what goes into the
`prelude`s.
- [ ] migrate all internal pallets and runtime to use `frame`

---------

Co-authored-by: kianenigma <kian@parity.io>
Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com>
This commit is contained in:
Juan Girini
2023-10-27 11:38:16 +02:00
committed by GitHub
parent 6ca5789db8
commit 43415ef58c
48 changed files with 2019 additions and 192 deletions
+91
View File
@@ -0,0 +1,91 @@
[package]
name = "frame"
version = "0.0.1-dev"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2021"
license = "Apache-2.0"
homepage = "paritytech.github.io"
repository.workspace = true
description = "The single package to get you started with building frame pallets and runtimes"
[package.metadata.docs.rs]
# enable `experimental` feature for docs
features = ["experimental"]
targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
# external deps
parity-scale-codec = { version = "3.2.2", default-features = false, features = ["derive"] }
scale-info = { version = "2.6.0", default-features = false, features = ["derive"] }
# primitive deps, used for developing FRAME pallets.
sp-runtime = { default-features = false, path = "../primitives/runtime" }
sp-std = { default-features = false, path = "../primitives/std" }
sp-io = { default-features = false, path = "../primitives/io" }
sp-core = { default-features = false, path = "../primitives/core" }
sp-arithmetic = { default-features = false, path = "../primitives/arithmetic" }
# frame deps, for developing FRAME pallets.
frame-support = { default-features = false, path = "support" }
frame-system = { default-features = false, path = "system" }
# primitive types used for developing FRAME runtimes.
sp-version = { default-features = false, path = "../primitives/version", optional = true }
sp-api = { default-features = false, path = "../primitives/api", optional = true }
sp-block-builder = { default-features = false, path = "../primitives/block-builder", optional = true }
sp-transaction-pool = { default-features = false, path = "../primitives/transaction-pool", optional = true }
sp-offchain = { default-features = false, path = "../primitives/offchain", optional = true }
sp-session = { default-features = false, path = "../primitives/session", optional = true }
sp-consensus-aura = { default-features = false, path = "../primitives/consensus/aura", optional = true }
sp-consensus-grandpa = { default-features = false, path = "../primitives/consensus/grandpa", optional = true }
sp-inherents = { default-features = false, path = "../primitives/inherents", optional = true }
frame-executive = { default-features = false, path = "../frame/executive", optional = true }
frame-system-rpc-runtime-api = { default-features = false, path = "../frame/system/rpc/runtime-api", optional = true }
docify = "0.2.0"
simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" }
log = { version = "0.4.20", default-features = false }
[dev-dependencies]
pallet-examples = { path = "./examples" }
[features]
default = [ "runtime", "std" ]
experimental = [ "frame-support/experimental", "frame-system/experimental" ]
runtime = [
"frame-executive",
"frame-system-rpc-runtime-api",
"sp-api",
"sp-block-builder",
"sp-consensus-aura",
"sp-consensus-grandpa",
"sp-inherents",
"sp-offchain",
"sp-session",
"sp-transaction-pool",
"sp-version",
]
std = [
"frame-executive?/std",
"frame-support/std",
"frame-system-rpc-runtime-api?/std",
"frame-system/std",
"log/std",
"parity-scale-codec/std",
"scale-info/std",
"sp-api?/std",
"sp-arithmetic/std",
"sp-block-builder?/std",
"sp-consensus-aura?/std",
"sp-consensus-grandpa?/std",
"sp-core/std",
"sp-inherents?/std",
"sp-io/std",
"sp-offchain?/std",
"sp-runtime/std",
"sp-session?/std",
"sp-std/std",
"sp-transaction-pool?/std",
"sp-version?/std",
]
+5 -3
View File
@@ -12,11 +12,12 @@ description = "The single package with examples of various types of FRAME pallet
targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
pallet-example-basic = { path = "basic", default-features = false}
pallet-default-config-example = { path = "default-config", default-features = false}
pallet-example-offchain-worker = { path = "offchain-worker", default-features = false}
pallet-example-kitchensink = { path = "kitchensink", default-features = false}
pallet-dev-mode = { path = "dev-mode", default-features = false}
pallet-example-basic = { path = "basic", default-features = false}
pallet-example-frame-crate = { path = "frame-crate", default-features = false }
pallet-example-kitchensink = { path = "kitchensink", default-features = false}
pallet-example-offchain-worker = { path = "offchain-worker", default-features = false}
pallet-example-split = { path = "split", default-features = false}
[features]
@@ -25,6 +26,7 @@ std = [
"pallet-default-config-example/std",
"pallet-dev-mode/std",
"pallet-example-basic/std",
"pallet-example-frame-crate/std",
"pallet-example-kitchensink/std",
"pallet-example-offchain-worker/std",
"pallet-example-split/std",
@@ -0,0 +1,24 @@
[package]
name = "pallet-example-frame-crate"
version = "0.0.1"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2021"
license = "MIT-0"
homepage = "https://substrate.io"
repository.workspace = true
description = "FRAME example pallet with umbrella crate"
readme = "README.md"
[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false }
scale-info = { version = "2.5.0", default-features = false, features = ["derive"] }
frame = { path = "../..", default-features = false, features = ["runtime", "experimental"] }
[features]
default = [ "std" ]
std = [ "codec/std", "frame/std", "scale-info/std" ]
@@ -0,0 +1,66 @@
// This file is part of Substrate.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use frame::prelude::*;
#[frame::pallet(dev_mode)]
pub mod pallet {
use super::*;
#[pallet::config]
pub trait Config: frame_system::Config {
type RuntimeEvent: IsType<<Self as frame_system::Config>::RuntimeEvent> + From<Event<Self>>;
}
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::event]
pub enum Event<T: Config> {}
#[pallet::storage]
pub type Value<T> = StorageValue<Value = u32>;
#[pallet::call]
impl<T: Config> Pallet<T> {
pub fn some_dispatchable(_origin: OriginFor<T>) -> DispatchResult {
Ok(())
}
}
}
#[cfg(test)]
mod tests {
use crate::pallet as my_pallet;
use frame::testing_prelude::*;
construct_runtime!(
pub struct Runtime {
System: frame_system,
MyPallet: my_pallet,
}
);
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)]
impl frame_system::Config for Runtime {
type Block = MockBlock<Self>;
}
impl my_pallet::Config for Runtime {
type RuntimeEvent = RuntimeEvent;
}
}
+3
View File
@@ -40,4 +40,7 @@
//! - [`pallet_example_split`]: A simple example of a FRAME pallet demonstrating the ability to
//! split sections across multiple files.
//!
//! - [`pallet_example_frame_crate`]: Example pallet showcasing how one can be
//! built using only the `frame` umbrella crate.
//!
//! **Tip**: Use `cargo doc --package <pallet-name> --open` to view each pallet's documentation.
+347
View File
@@ -0,0 +1,347 @@
// This file is part of Substrate.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! > Made for [![polkadot]](https://polkadot.network)
//!
//! [polkadot]: https://img.shields.io/badge/polkadot-E6007A?style=for-the-badge&logo=polkadot&logoColor=white
//!
//! # FRAME
//!
//! ```no_compile
//! ______ ______ ________ ___ __ __ ______
//! /_____/\ /_____/\ /_______/\ /__//_//_/\ /_____/\
//! \::::_\/_\:::_ \ \ \::: _ \ \\::\| \| \ \\::::_\/_
//! \:\/___/\\:(_) ) )_\::(_) \ \\:. \ \\:\/___/\
//! \:::._\/ \: __ `\ \\:: __ \ \\:.\-/\ \ \\::___\/_
//! \:\ \ \ \ `\ \ \\:.\ \ \ \\. \ \ \ \\:\____/\
//! \_\/ \_\/ \_\/ \__\/\__\/ \__\/ \__\/ \_____\/
//! ```
//!
//! > **F**ramework for **R**untime **A**ggregation of **M**odularized **E**ntities: Substrate's
//! > State Transition Function (Runtime) Framework.
//!
//! ## Warning: Experimental
//!
//! This crate and all of its content is experimental, and should not yet be used in production.
//!
//! ## Getting Started
//!
//! TODO: link to `developer_hub::polkadot_sdk::frame`. The `developer_hub` hasn't been published
//! yet, this can be updated once it is linkable.
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg(feature = "experimental")]
/// Exports the main pallet macro. This can wrap a `mod pallet` and will transform it into
/// being a pallet, eg `#[frame::pallet] mod pallet { .. }`.
///
/// Note that this is not part of the prelude, in order to make it such that the common way to
/// define a macro is `#[frame::pallet] mod pallet { .. }`, followed by `#[pallet::foo]`,
/// `#[pallet::bar]` inside the mod.
pub use frame_support::pallet;
/// The logging library of the runtime. Can normally be the classic `log` crate.
pub use log;
/// The main prelude of FRAME.
///
/// This prelude should almost always be the first line of code in any pallet or runtime.
///
/// ```
/// use frame::prelude::*;
///
/// // rest of your pallet..
/// mod pallet {}
/// ```
pub mod prelude {
/// `frame_system`'s parent crate, which is mandatory in all pallets build with this crate.
///
/// Conveniently, the keyword `frame_system` is in scope as one uses `use
/// frame::prelude::*`
#[doc(inline)]
pub use frame_system;
/// Pallet prelude of `frame-support`.
///
/// Note: this needs to revised once `frame-support` evolves.
// `frame-support` will be break down https://github.com/paritytech/polkadot-sdk/issues/127 and its reexports will
// most likely change. These wildcard reexportings can be optimized once `frame-support` has
// changed.
#[doc(no_inline)]
pub use frame_support::pallet_prelude::*;
/// Pallet prelude of `frame-system`.
#[doc(no_inline)]
pub use frame_system::pallet_prelude::*;
/// All of the std alternative types.
#[doc(no_inline)]
pub use sp_std::prelude::*;
/// All FRAME-relevant derive macros.
#[doc(no_inline)]
pub use super::derive::*;
}
/// The main testing prelude of FRAME.
///
/// A test setup typically starts with:
///
/// ```
/// use frame::testing_prelude::*;
/// // rest of your test setup.
/// ```
#[cfg(feature = "std")]
pub mod testing_prelude {
pub use super::prelude::*;
/// Testing includes building a runtime, so we bring in all preludes related to runtimes as
/// well.
pub use super::runtime::testing_prelude::*;
/// Other helper macros from `frame_support` that help with asserting in tests.
pub use frame_support::{
assert_err, assert_err_ignore_postinfo, assert_error_encoded_size, assert_noop, assert_ok,
assert_storage_noop, storage_alias,
};
pub use frame_system::{self, mocking::*};
pub use sp_io::TestExternalities as TestState;
pub use sp_std::if_std;
}
/// All of the types and tools needed to build FRAME-based runtimes.
#[cfg(any(feature = "runtime", feature = "std"))]
pub mod runtime {
/// The main prelude of `FRAME` for building runtimes.
///
/// A runtime typically starts with:
///
/// ```
/// use frame::{prelude::*, runtime::prelude::*};
/// ```
pub mod prelude {
/// All of the types related to the FRAME runtime executive.
pub use frame_executive::*;
/// Macro to amalgamate the runtime into `struct Runtime`.
pub use frame_support::construct_runtime;
/// Macro to easily derive the `Config` trait of various pallet for `Runtime`.
pub use frame_support::derive_impl;
/// Macros to easily impl traits such as `Get` for types.
// TODO: using linking in the Get in the line above triggers an ICE :/
pub use frame_support::{ord_parameter_types, parameter_types};
/// Const types that can easily be used in conjuncture with `Get`.
pub use frame_support::traits::{
ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, ConstU16,
ConstU32, ConstU64, ConstU8,
};
/// Types to define your runtime version.
pub use sp_version::{create_runtime_str, runtime_version, RuntimeVersion};
#[cfg(feature = "std")]
pub use sp_version::NativeVersion;
}
/// Types and traits for runtimes that implement runtime APIs.
///
/// A testing runtime should not need this.
///
/// A non-testing runtime should have this enabled, as such:
///
/// ```
/// use frame::runtime::{prelude::*, apis::{*,}};
/// ```
// TODO: This is because of wildcard imports, and it should be not needed once we can avoid
// that. Imports like that are needed because we seem to need some unknown types in the macro
// expansion. See `sp_session::runtime_api::*;` as one example. All runtime api decls should be
// moved to file similarly.
#[allow(ambiguous_glob_reexports)]
pub mod apis {
// Types often used in the runtime APIs.
pub use sp_core::OpaqueMetadata;
pub use sp_inherents::{CheckInherentsResult, InherentData};
pub use sp_runtime::ApplyExtrinsicResult;
/// Macro to implement runtime APIs.
pub use sp_api::impl_runtime_apis;
pub use frame_system_rpc_runtime_api::*;
pub use sp_api::{self, *};
pub use sp_block_builder::*;
pub use sp_consensus_aura::*;
pub use sp_consensus_grandpa::*;
pub use sp_offchain::*;
pub use sp_session::runtime_api::*;
pub use sp_transaction_pool::runtime_api::*;
}
/// A set of opinionated types aliases commonly used in runtimes.
///
/// This is one set of opinionated types. They are compatible with one another, but are not
/// guaranteed to work if you start tweaking a portion.
///
/// Some note-worthy opinions in this prelude:
///
/// - `u32` block number.
/// - [`sp_runtime::MultiAddress`] and [`sp_runtime::MultiSignature`] are used as the account id
/// and signature types. This implies that this prelude can possibly used with an
/// "account-index" system (eg `pallet-indices`). And, in any case, it should be paired with
/// `AccountIdLookup` in [`frame_system::Config::Lookup`].
pub mod types_common {
use frame_system::Config as SysConfig;
use sp_runtime::{generic, traits, OpaqueExtrinsic};
/// A signature type compatible capably of handling multiple crypto-schemes.
pub type Signature = sp_runtime::MultiSignature;
/// The corresponding account-id type of [`Signature`].
pub type AccountId =
<<Signature as traits::Verify>::Signer as traits::IdentifyAccount>::AccountId;
/// The block-number type, which should be fed into [`frame_system::Config`].
pub type BlockNumber = u32;
/// TODO: Ideally we want the hashing type to be equal to SysConfig::Hashing?
type HeaderInner = generic::Header<BlockNumber, traits::BlakeTwo256>;
// NOTE: `AccountIndex` is provided for future compatibility, if you want to introduce
// something like `pallet-indices`.
type ExtrinsicInner<T, Extra, AccountIndex = ()> = generic::UncheckedExtrinsic<
sp_runtime::MultiAddress<AccountId, AccountIndex>,
<T as SysConfig>::RuntimeCall,
Signature,
Extra,
>;
/// The block type, which should be fed into [`frame_system::Config`].
///
/// Should be parameterized with `T: frame_system::Config` and a tuple of `SignedExtension`.
/// When in doubt, use [`SystemSignedExtensionsOf`].
// Note that this cannot be dependent on `T` for block-number because it would lead to a
// circular dependency (self-referential generics).
pub type BlockOf<T, Extra = ()> = generic::Block<HeaderInner, ExtrinsicInner<T, Extra>>;
/// The opaque block type. This is the same [`BlockOf`], but it has
/// [`sp_runtime::OpaqueExtrinsic`] as its final extrinsic type.
///
/// This should be provided to the client side as the extrinsic type.
pub type OpaqueBlock = generic::Block<HeaderInner, OpaqueExtrinsic>;
/// Default set of signed extensions exposed from the `frame_system`.
///
/// crucially, this does NOT contain any tx-payment extension.
pub type SystemSignedExtensionsOf<T> = (
frame_system::CheckNonZeroSender<T>,
frame_system::CheckSpecVersion<T>,
frame_system::CheckTxVersion<T>,
frame_system::CheckGenesis<T>,
frame_system::CheckEra<T>,
frame_system::CheckNonce<T>,
frame_system::CheckWeight<T>,
);
}
/// The main prelude of FRAME for building runtimes, and in the context of testing.
///
/// counter part of `runtime::prelude`.
#[cfg(feature = "std")]
pub mod testing_prelude {
pub use super::prelude::*;
pub use sp_core::storage::Storage;
pub use sp_runtime::BuildStorage;
}
}
/// All traits often used in FRAME pallets.
///
/// Note that types implementing these traits can also be found in this module.
// TODO: `Hash` and `Bounded` are defined multiple times; should be fixed once these two crates are
// cleaned up.
#[allow(ambiguous_glob_reexports)]
pub mod traits {
pub use frame_support::traits::*;
pub use sp_runtime::traits::*;
}
/// The arithmetic types used for safe math.
pub mod arithmetic {
pub use sp_arithmetic::{traits::*, *};
}
/// Low level primitive types used in FRAME pallets.
pub mod primitives {
pub use sp_core::{H160, H256, H512, U256, U512};
pub use sp_runtime::traits::{BlakeTwo256, Hash, Keccak256};
}
/// All derive macros used in frame.
///
/// This is already part of the [`prelude`].
pub mod derive {
pub use frame_support::{
CloneNoBound, DebugNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound,
RuntimeDebugNoBound,
};
pub use parity_scale_codec::{Decode, Encode};
pub use scale_info::TypeInfo;
pub use sp_runtime::RuntimeDebug;
pub use sp_std::fmt::Debug;
}
/// Access to all of the dependencies of this crate. In case the re-exports are not enough, this
/// module can be used.
///
/// Any time one uses this module to access a dependency, you can have a moment to think about
/// whether this item could have been placed in any of the other modules and preludes in this crate.
/// In most cases, hopefully the answer is yes.
pub mod deps {
// TODO: It would be great to somehow instruct RA to prefer *not* suggesting auto-imports from
// these. For example, we prefer `frame::derive::CloneNoBound` rather than
// `frame::deps::frame_support::CloneNoBound`.
pub use frame_support;
pub use frame_system;
pub use sp_arithmetic;
pub use sp_core;
pub use sp_io;
pub use sp_runtime;
pub use sp_std;
pub use parity_scale_codec as codec;
pub use scale_info;
#[cfg(feature = "runtime")]
pub use frame_executive;
#[cfg(feature = "runtime")]
pub use sp_api;
#[cfg(feature = "runtime")]
pub use sp_block_builder;
#[cfg(feature = "runtime")]
pub use sp_consensus_aura;
#[cfg(feature = "runtime")]
pub use sp_consensus_grandpa;
#[cfg(feature = "runtime")]
pub use sp_inherents;
#[cfg(feature = "runtime")]
pub use sp_offchain;
#[cfg(feature = "runtime")]
pub use sp_version;
}
+23 -1
View File
@@ -148,12 +148,34 @@ pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
#[pallet::config]
/// Default preludes for [`Config`].
pub mod config_preludes {
use super::*;
use frame_support::derive_impl;
/// Default prelude sensible to be used in a testing environment.
pub struct TestDefaultConfig;
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
impl frame_system::DefaultConfig for TestDefaultConfig {}
#[frame_support::register_default_impl(TestDefaultConfig)]
impl DefaultConfig for TestDefaultConfig {
type WeightInfo = ();
#[inject_runtime_type]
type RuntimeEvent = ();
#[inject_runtime_type]
type RuntimeCall = ();
}
}
#[pallet::config(with_default)]
pub trait Config: frame_system::Config {
/// The overarching event type.
#[pallet::no_default_bounds]
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
/// A sudo-able call.
#[pallet::no_default_bounds]
type RuntimeCall: Parameter
+ UnfilteredDispatchable<RuntimeOrigin = Self::RuntimeOrigin>
+ GetDispatchInfo;
+2 -2
View File
@@ -19,8 +19,8 @@
use super::*;
use crate as sudo;
use frame_support::traits::{ConstU32, ConstU64, Contains};
use sp_core::H256;
use frame_support::traits::{ConstU32, Contains};
use sp_core::{ConstU64, H256};
use sp_io;
use sp_runtime::{
traits::{BlakeTwo256, IdentityLookup},
+4
View File
@@ -802,16 +802,20 @@ pub mod testing_prelude {
/// Prelude to be used alongside pallet macro, for ease of use.
pub mod pallet_prelude {
pub use crate::{
defensive, defensive_assert,
dispatch::{DispatchClass, DispatchResult, DispatchResultWithPostInfo, Parameter, Pays},
ensure,
inherent::{InherentData, InherentIdentifier, ProvideInherent},
storage,
storage::{
bounded_btree_map::BoundedBTreeMap,
bounded_btree_set::BoundedBTreeSet,
bounded_vec::BoundedVec,
types::{
CountedStorageMap, CountedStorageNMap, Key as NMapKey, OptionQuery, ResultQuery,
StorageDoubleMap, StorageMap, StorageNMap, StorageValue, ValueQuery,
},
weak_bounded_vec::WeakBoundedVec,
StorageList,
},
traits::{
@@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] }
frame = { path = "frame", default-features = false}
frame = { path = "../../..", default-features = false, features = ["runtime", "experimental"]}
scale-info = { version = "2.10.0", default-features = false, features = ["derive"] }
[features]
@@ -1,20 +0,0 @@
[package]
name = "frame"
version = "0.1.0"
authors.workspace = true
edition.workspace = true
license = "Apache-2.0"
publish = false
homepage = "https://substrate.io"
repository.workspace = true
[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
frame-system = { path = "../../../../system", default-features = false}
frame-support = { path = "../../..", default-features = false}
[features]
default = [ "std" ]
std = [ "frame-support/std", "frame-system/std" ]
@@ -15,7 +15,31 @@
// See the License for the specific language governing permissions and
// limitations under the License.
pub mod deps {
pub use frame_support;
pub use frame_system;
#[frame_support::pallet]
mod pallet {
use frame::deps::frame_system::pallet_prelude::BlockNumberFor;
use frame_support::pallet_prelude::{Hooks, IsType};
#[pallet::config]
pub trait Config: frame::deps::frame_system::Config {
type Bar: Clone + std::fmt::Debug + Eq;
type RuntimeEvent: IsType<<Self as frame::deps::frame_system::Config>::RuntimeEvent>
+ From<Event<Self>>;
}
#[pallet::pallet]
pub struct Pallet<T>(core::marker::PhantomData<T>);
#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {}
#[pallet::call]
impl<T: Config> Pallet<T> {}
#[pallet::event]
pub enum Event<T: Config> {
B { b: T::Bar },
}
}
fn main() {}
@@ -0,0 +1,5 @@
error: Invalid `type RuntimeEvent`, associated type `RuntimeEvent` is reserved and must bound: `IsType<<Self as frame_system::Config>::RuntimeEvent>`
--> tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs:26:3
|
26 | type RuntimeEvent: IsType<<Self as frame::deps::frame_system::Config>::RuntimeEvent>
| ^^^^
+1
View File
@@ -52,6 +52,7 @@ runtime-benchmarks = [
"sp-runtime/runtime-benchmarks",
]
try-runtime = [ "frame-support/try-runtime", "sp-runtime/try-runtime" ]
experimental = []
[[bench]]
name = "bench"
+54
View File
@@ -244,6 +244,53 @@ pub mod pallet {
type BlockHashCount = frame_support::traits::ConstU64<10>;
type OnSetCode = ();
}
/// Default configurations of this pallet in a solo-chain environment.
///
/// ## Considerations:
///
/// By default, this type makes the following choices:
///
/// * Use a normal 32 byte account id, with a [`DefaultConfig::Lookup`] that implies no
/// 'account-indexing' pallet is being used.
/// * Given that we don't know anything about the existence of a currency system in scope,
/// an [`DefaultConfig::AccountData`] is chosen that has no addition data. Overwrite this
/// if you use `pallet-balances` or similar.
/// * Make sure to overwrite [`DefaultConfig::Version`].
/// * 2s block time, and a default 5mb block size is used.
#[cfg(feature = "experimental")]
pub struct SolochainDefaultConfig;
#[cfg(feature = "experimental")]
#[frame_support::register_default_impl(SolochainDefaultConfig)]
impl DefaultConfig for SolochainDefaultConfig {
type Nonce = u32;
type Hash = sp_core::hash::H256;
type Hashing = sp_runtime::traits::BlakeTwo256;
type AccountId = sp_runtime::AccountId32;
type Lookup = sp_runtime::traits::AccountIdLookup<Self::AccountId, ()>;
type MaxConsumers = frame_support::traits::ConstU32<128>;
type AccountData = crate::AccountInfo<Self::Nonce, ()>;
type OnNewAccount = ();
type OnKilledAccount = ();
type SystemWeightInfo = ();
type SS58Prefix = ();
type Version = ();
type BlockWeights = ();
type BlockLength = ();
type DbWeight = ();
#[inject_runtime_type]
type RuntimeEvent = ();
#[inject_runtime_type]
type RuntimeOrigin = ();
#[inject_runtime_type]
type RuntimeCall = ();
#[inject_runtime_type]
type PalletInfo = ();
type BaseCallFilter = frame_support::traits::Everything;
type BlockHashCount = frame_support::traits::ConstU32<256>;
type OnSetCode = ();
}
}
/// System configuration trait. Implemented by runtime.
@@ -1817,4 +1864,11 @@ pub mod pallet_prelude {
/// Type alias for the `BlockNumber` associated type of system config.
pub type BlockNumberFor<T> = <HeaderFor<T> as sp_runtime::traits::Header>::Number;
/// Type alias for the `Extrinsic` associated type of system config.
pub type ExtrinsicFor<T> =
<<T as crate::Config>::Block as sp_runtime::traits::Block>::Extrinsic;
/// Type alias for the `RuntimeCall` associated type of system config.
pub type RuntimeCallFor<T> = <T as crate::Config>::RuntimeCall;
}
+24 -3
View File
@@ -31,7 +31,7 @@
//!
//! See the [`pallet`] module for more information about the interfaces this pallet exposes,
//! including its configuration trait, dispatchables, storage items, events and errors.
//!
//!
//! ## Overview
//!
//! The Timestamp pallet is designed to create a consensus-based time source. This helps ensure that
@@ -144,12 +144,33 @@ pub use pallet::*;
#[frame_support::pallet]
pub mod pallet {
use super::*;
use frame_support::pallet_prelude::*;
use frame_support::{derive_impl, pallet_prelude::*};
use frame_system::pallet_prelude::*;
#[pallet::config]
/// Default preludes for [`Config`].
pub mod config_preludes {
use super::*;
/// Default prelude sensible to be used in a testing environment.
pub struct TestDefaultConfig;
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
impl frame_system::DefaultConfig for TestDefaultConfig {}
#[frame_support::register_default_impl(TestDefaultConfig)]
impl DefaultConfig for TestDefaultConfig {
type Moment = u64;
type OnTimestampSet = ();
type MinimumPeriod = frame_support::traits::ConstU64<1>;
type WeightInfo = ();
}
}
/// The pallet configuration trait
#[pallet::config(with_default)]
pub trait Config: frame_system::Config {
/// Type used for expressing a timestamp.
#[pallet::no_default_bounds]
type Moment: Parameter
+ Default
+ AtLeast32Bit
+35 -12
View File
@@ -319,9 +319,29 @@ pub mod pallet {
#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::config]
pub mod config_preludes {
use super::*;
use frame_support::derive_impl;
/// Default prelude sensible to be used in a testing environment.
pub struct TestDefaultConfig;
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
impl frame_system::DefaultConfig for TestDefaultConfig {}
#[frame_support::register_default_impl(TestDefaultConfig)]
impl DefaultConfig for TestDefaultConfig {
#[inject_runtime_type]
type RuntimeEvent = ();
type FeeMultiplierUpdate = ();
type OperationalFeeMultiplier = ();
}
}
#[pallet::config(with_default)]
pub trait Config: frame_system::Config {
/// The overarching event type.
#[pallet::no_default_bounds]
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
/// Handler for withdrawing, refunding and depositing the transaction fee.
@@ -330,12 +350,24 @@ pub mod pallet {
/// adjusted, depending on the used resources by the transaction. If the
/// transaction weight is lower than expected, parts of the transaction fee
/// might be refunded. In the end the fees can be deposited.
#[pallet::no_default]
type OnChargeTransaction: OnChargeTransaction<Self>;
/// A fee mulitplier for `Operational` extrinsics to compute "virtual tip" to boost their
/// Convert a weight value into a deductible fee based on the currency type.
#[pallet::no_default]
type WeightToFee: WeightToFee<Balance = BalanceOf<Self>>;
/// Convert a length value into a deductible fee based on the currency type.
#[pallet::no_default]
type LengthToFee: WeightToFee<Balance = BalanceOf<Self>>;
/// Update the multiplier of the next block, based on the previous block's weight.
type FeeMultiplierUpdate: MultiplierUpdate;
/// A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their
/// `priority`
///
/// This value is multipled by the `final_fee` to obtain a "virtual tip" that is later
/// This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later
/// added to a tip component in regular `priority` calculations.
/// It means that a `Normal` transaction can front-run a similarly-sized `Operational`
/// extrinsic (with no tip), by including a tip value greater than the virtual tip.
@@ -355,15 +387,6 @@ pub mod pallet {
/// transactions.
#[pallet::constant]
type OperationalFeeMultiplier: Get<u8>;
/// Convert a weight value into a deductible fee based on the currency type.
type WeightToFee: WeightToFee<Balance = BalanceOf<Self>>;
/// Convert a length value into a deductible fee based on the currency type.
type LengthToFee: WeightToFee<Balance = BalanceOf<Self>>;
/// Update the multiplier of the next block, based on the previous block's weight.
type FeeMultiplierUpdate: MultiplierUpdate;
}
#[pallet::type_value]