diff --git a/Cargo.lock b/Cargo.lock index ce4babd..1b34d10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7382,6 +7382,7 @@ dependencies = [ "pallet-collator-selection", "pallet-multisig", "pallet-parachain-template", + "pallet-proxy", "pallet-session", "pallet-sudo", "pallet-timestamp", diff --git a/Cargo.toml b/Cargo.toml index e7c44ec..138eaa2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["node", "pallets/template", "runtime"] +members = [ "node", "pallets/template", "runtime"] package.edition = "2021" package.repository = "https://github.com/paritytech/polkadot-sdk" resolver = "2" diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs index 73a05da..e352738 100644 --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -1,5 +1,7 @@ use cumulus_primitives_core::ParaId; -use parachain_template_runtime::{AccountId, AuraId, Signature, EXISTENTIAL_DEPOSIT}; +use parachain_template_runtime::{ + constants::currency::EXISTENTIAL_DEPOSIT, AccountId, AuraId, Signature, +}; use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; use sc_service::ChainType; use serde::{Deserialize, Serialize}; diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 30436bd..e165a39 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -41,6 +41,7 @@ pallet-authorship = { git = "https://github.com/paritytech/polkadot-sdk", branch pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } pallet-multisig = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } pallet-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } +pallet-proxy = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } pallet-sudo = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } pallet-timestamp = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } pallet-transaction-payment = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.3.0", default-features = false } diff --git a/runtime/src/constants.rs b/runtime/src/constants.rs index f1833cf..b3a1690 100644 --- a/runtime/src/constants.rs +++ b/runtime/src/constants.rs @@ -1,10 +1,13 @@ pub mod currency { use crate::Balance; + pub const MICROCENTS: Balance = 1_000_000; pub const MILLICENTS: Balance = 1_000_000_000; pub const CENTS: Balance = 1_000 * MILLICENTS; // assume this is worth about a cent. pub const DOLLARS: Balance = 100 * CENTS; + pub const EXISTENTIAL_DEPOSIT: Balance = MILLICENTS; + pub const fn deposit(items: u32, bytes: u32) -> Balance { items as Balance * 15 * CENTS + (bytes as Balance) * 6 * CENTS } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index b5a98d8..37611d9 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -7,10 +7,10 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod constants; -use constants::currency::*; mod weights; pub mod xcm_config; +use codec::{Decode, Encode, MaxEncodedLen}; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::ParaId; use frame_support::{ @@ -18,7 +18,7 @@ use frame_support::{ dispatch::DispatchClass, genesis_builder_helper::{build_config, create_default_config}, parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, InstanceFilter}, weights::{ constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, @@ -36,6 +36,7 @@ use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery; // Polkadot imports use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use scale_info::TypeInfo; use smallvec::smallvec; use sp_api::impl_runtime_apis; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -46,19 +47,23 @@ use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify}, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiSignature, + ApplyExtrinsicResult, MultiSignature, RuntimeDebug, }; pub use sp_runtime::{MultiAddress, Perbill, Permill}; use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; // XCM Imports use xcm::latest::prelude::BodyId; -use xcm_config::{RelayLocation, XcmConfig, XcmOriginToTransactDispatchOrigin}; use xcm_executor::XcmExecutor; +use crate::{ + constants::currency::{deposit, EXISTENTIAL_DEPOSIT, MICROCENTS, MILLICENTS}, + weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}, + xcm_config::{RelayLocation, XcmConfig, XcmOriginToTransactDispatchOrigin}, +}; + /// Alias to 512-bit hash when used in the context of a transaction signature on /// the chain. pub type Signature = MultiSignature; @@ -138,7 +143,7 @@ impl WeightToFeePolynomial for WeightToFee { fn polynomial() -> WeightToFeeCoefficients { // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1 // MILLIUNIT: in our template, we map to 1/10 of that, or 1/10 MILLIUNIT - let p = MILLIUNIT / 10; + let p = MILLICENTS / 10; let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); smallvec![WeightToFeeCoefficient { degree: 1, @@ -207,14 +212,6 @@ pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); pub const HOURS: BlockNumber = MINUTES * 60; pub const DAYS: BlockNumber = HOURS * 24; -// Unit = the base number of indivisible units for balances -pub const UNIT: Balance = 1_000_000_000_000; -pub const MILLIUNIT: Balance = 1_000_000_000; -pub const MICROUNIT: Balance = 1_000_000; - -/// The existential deposit. Set to 1/10 of the Connected Relay Chain. -pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT; - /// We assume that ~5% of the block weight is consumed by `on_initialize` /// handlers. This is used to limit the maximal weight of a single extrinsic. const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); @@ -341,6 +338,74 @@ impl pallet_authorship::Config for Runtime { type FindAuthor = pallet_session::FindAccountFromAuthorIndex; } +parameter_types! { + pub const MaxProxies: u32 = 32; + pub const MaxPending: u32 = 32; + pub const ProxyDepositBase: Balance = deposit(1, 40); + pub const AnnouncementDepositBase: Balance = deposit(1, 48); + pub const ProxyDepositFactor: Balance = deposit(0, 33); + pub const AnnouncementDepositFactor: Balance = deposit(0, 66); +} + +/// The type used to represent the kinds of proxying allowed. +/// If you are adding new pallets, consider adding new ProxyType variant +#[derive( + Copy, + Clone, + Decode, + Default, + Encode, + Eq, + MaxEncodedLen, + Ord, + PartialEq, + PartialOrd, + RuntimeDebug, + TypeInfo, +)] +pub enum ProxyType { + /// Allows to proxy all calls + #[default] + Any, + /// Allows all non-transfer calls + NonTransfer, + /// Allows to finish the proxy + CancelProxy, + /// Allows to operate with collators list (invulnerables, candidates, etc.) + Collator, +} + +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => !matches!(c, RuntimeCall::Balances { .. }), + ProxyType::CancelProxy => matches!( + c, + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) + | RuntimeCall::Multisig { .. } + ), + ProxyType::Collator => + matches!(c, RuntimeCall::CollatorSelection { .. } | RuntimeCall::Multisig { .. }), + } + } +} + +impl pallet_proxy::Config for Runtime { + type AnnouncementDepositBase = AnnouncementDepositBase; + type AnnouncementDepositFactor = AnnouncementDepositFactor; + type CallHasher = BlakeTwo256; + type Currency = Balances; + type MaxPending = MaxPending; + type MaxProxies = MaxProxies; + type ProxyDepositBase = ProxyDepositBase; + type ProxyDepositFactor = ProxyDepositFactor; + type ProxyType = ProxyType; + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; +} + parameter_types! { pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; } @@ -366,7 +431,7 @@ impl pallet_balances::Config for Runtime { parameter_types! { /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 10 * MICROUNIT; + pub const TransactionByteFee: Balance = 10 * MICROCENTS; } impl pallet_transaction_payment::Config for Runtime { @@ -520,6 +585,7 @@ construct_runtime!( ParachainSystem: cumulus_pallet_parachain_system = 1, Timestamp: pallet_timestamp = 2, ParachainInfo: parachain_info = 3, + Proxy: pallet_proxy = 4, // Monetary stuff. Balances: pallet_balances = 10,