//! [`frame_support::traits::fungible`] traits, therefore you should read and understand those docs
//! * **Admin**: An account ID uniquely privileged to be able to unfreeze (thaw) an account and its
//! * **Asset issuance/minting**: The creation of a new asset, whose total supply will belong to the
//! * **Asset destruction**: The process of reducing the balance of an asset of one account. This is
//! * **Issuer**: An account ID uniquely privileged to be able to mint a particular class of assets.
//! * **Owner**: An account ID uniquely privileged to be able to destroy a particular asset class,
//! * **Approval**: The act of allowing an account the permission to transfer some balance of asset
//! * Allow administrative activities by specially privileged accounts including freezing account
//! * `transfer_keep_alive`: Transfer sender's assets to another account, keeping the sender alive.
//! * `refund`: Return the deposit (if any) of the caller's asset account or a consumer reference
//! * `force_transfer`: Transfers between arbitrary accounts; called by the asset class's Admin.
//! * `freeze`: Disallows further `transfer`s from an account; called by the asset class's Freezer.
//! * `thaw`: Allows further `transfer`s to and from an account; called by the asset class's Admin.
//! * `set_team`: Changes an asset class's Admin, Freezer and Issuer; called by the asset class's
//! * `clear_metadata`: Remove the metadata of an asset class; called by the asset class's Owner.
//! * `touch_other`: Create an asset account for specified account. Caller must place a deposit;
//! * `block`: Disallows further `transfer`s to and from an account; called by the asset class's
//! Using `CallbackHandle` associated type, user can configure custom callback functions which are
// This recursion limit is needed because we have too many benchmarks and benchmarking will fail if
sp_core::generate_feature_enabled_macro!(runtime_benchmarks_enabled, feature = "runtime-benchmarks", $);