use frame_support::{
parameter_types,
traits::WithdrawReasons,
weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight},
};
use sp_runtime::{Perbill, Percent, Perquintill};
use parachain_staking::InflationInfo;
use crate::{Balance, BlockNumber};
pub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1;
pub const BLOCK_PROCESSING_VELOCITY: u32 = 1;
pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000;
pub const MILLISECS_PER_BLOCK: u64 = 12_000;
pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;
pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber);
pub const HOURS: BlockNumber = MINUTES * 60;
pub const DAYS: BlockNumber = HOURS * 24;
pub const BLOCKS_PER_YEAR: BlockNumber = DAYS * 36525 / 100;
pub const MAX_COLLATOR_STAKE: Balance = 200_000 * KILT;
pub const KILT: Balance = 10u128.pow(15);
pub const MILLI_KILT: Balance = 10u128.pow(12);
pub const MICRO_KILT: Balance = 10u128.pow(9);
pub const EXISTENTIAL_DEPOSIT: Balance = 10 * MILLI_KILT;
pub const DEPOSIT_STORAGE_ITEM: Balance = 56 * MILLI_KILT;
pub const DEPOSIT_STORAGE_BYTE: Balance = 50 * MICRO_KILT;
pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4);
pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10);
pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
pub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(
WEIGHT_REF_TIME_PER_SECOND.saturating_div(2),
cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64,
);
pub const INFLATION_CONFIG: (Perquintill, Perquintill, Perquintill, Perquintill) = (
Perquintill::from_percent(40),
Perquintill::from_percent(10),
Perquintill::from_percent(10),
Perquintill::from_percent(8),
);
pub fn kilt_inflation_config() -> InflationInfo {
InflationInfo::new(
BLOCKS_PER_YEAR,
Perquintill::from_percent(40),
Perquintill::from_percent(10),
Perquintill::from_percent(10),
Perquintill::from_percent(8),
)
}
pub const fn deposit(items: u32, bytes: u32) -> Balance {
items as Balance * DEPOSIT_STORAGE_ITEM + (bytes as Balance) * DEPOSIT_STORAGE_BYTE
}
pub const MAX_INDICES_BYTE_LENGTH: u32 = 49;
pub const MAX_VESTING_SCHEDULES: u32 = 28;
parameter_types! {
pub const MinVestedTransfer: Balance = 100 * MILLI_KILT;
pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons =
WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE);
pub const ByteDeposit: Balance = deposit(0, 1);
pub const IndicesDeposit: Balance = deposit(1, MAX_INDICES_BYTE_LENGTH);
pub const CtypeFee: Balance = MILLI_KILT;
}
pub mod attestation {
use super::*;
pub const MAX_ATTESTATION_BYTE_LENGTH: u32 = 179;
pub const ATTESTATION_DEPOSIT: Balance = deposit(2, MAX_ATTESTATION_BYTE_LENGTH);
parameter_types! {
pub const MaxDelegatedAttestations: u32 = 1000;
pub const AttestationDeposit: Balance = ATTESTATION_DEPOSIT;
}
}
pub mod assets {
use super::*;
pub const APPROVAL_DEPOSIT: u128 = 0;
pub const ASSET_ACCOUNT_DEPOSIT: u128 = 0;
pub const ASSET_DEPOSIT: u128 = 0;
pub const META_DEPOSIT_BASE: u128 = 0;
pub const META_DEPOSIT_PER_BYTE: u128 = 0;
pub const REMOVE_ITEMS_LIMIT: u32 = 1000;
pub const STRING_LIMIT: u32 = 4;
parameter_types! {
pub const ApprovalDeposit: u128 = APPROVAL_DEPOSIT;
pub const AssetAccountDeposit: u128 = ASSET_ACCOUNT_DEPOSIT;
pub const AssetDeposit: u128 = ASSET_DEPOSIT;
pub const MetaDepositBase: u128 = META_DEPOSIT_BASE;
pub const MetaDepositPerByte: u128 = META_DEPOSIT_PER_BYTE;
pub const RemoveItemsLimit: u32 = REMOVE_ITEMS_LIMIT;
pub const StringLimit: u32 = STRING_LIMIT;
}
}
pub mod delegation {
use scale_info::TypeInfo;
use super::*;
pub const DELEGATION_DEPOSIT: Balance = KILT;
pub const MAX_SIGNATURE_BYTE_LENGTH: u16 = 64;
pub const MAX_PARENT_CHECKS: u32 = 5;
pub const MAX_REVOCATIONS: u32 = 5;
pub const MAX_REMOVALS: u32 = MAX_REVOCATIONS;
pub const MAX_CHILDREN: u32 = 1000;
parameter_types! {
pub const MaxSignatureByteLength: u16 = MAX_SIGNATURE_BYTE_LENGTH;
pub const MaxParentChecks: u32 = MAX_PARENT_CHECKS;
pub const MaxRevocations: u32 = MAX_REVOCATIONS;
pub const MaxRemovals: u32 = MAX_REMOVALS;
#[derive(Clone, TypeInfo)]
pub const MaxChildren: u32 = MAX_CHILDREN;
pub const DelegationDeposit: Balance = DELEGATION_DEPOSIT;
}
}
pub mod deposit_storage {
pub const MAX_DEPOSIT_PALLET_KEY_LENGTH: u32 = 35;
}
pub mod dip_provider {
use super::*;
pub const MAX_LINKED_ACCOUNTS: u32 = 10;
pub const MAX_COMMITMENT_BYTE_LENGTH: u32 = 32;
pub const COMMITMENT_DEPOSIT: Balance = deposit(1, MAX_COMMITMENT_BYTE_LENGTH);
}
pub mod staking {
use super::*;
#[cfg(feature = "fast-gov")]
pub const MIN_BLOCKS_PER_ROUND: BlockNumber = 10;
#[cfg(not(feature = "fast-gov"))]
pub const MIN_BLOCKS_PER_ROUND: BlockNumber = HOURS;
#[cfg(feature = "fast-gov")]
pub const DEFAULT_BLOCKS_PER_ROUND: BlockNumber = 20;
#[cfg(not(feature = "fast-gov"))]
pub const DEFAULT_BLOCKS_PER_ROUND: BlockNumber = 2 * HOURS;
#[cfg(feature = "fast-gov")]
pub const STAKE_DURATION: BlockNumber = 30;
#[cfg(not(feature = "fast-gov"))]
pub const STAKE_DURATION: BlockNumber = 7 * DAYS;
#[cfg(feature = "fast-gov")]
pub const MIN_COLLATORS: u32 = 4;
#[cfg(not(feature = "fast-gov"))]
pub const MIN_COLLATORS: u32 = 16;
#[cfg(feature = "fast-gov")]
pub const MAX_CANDIDATES: u32 = 16;
#[cfg(not(feature = "fast-gov"))]
pub const MAX_CANDIDATES: u32 = 75;
pub const MAX_DELEGATORS_PER_COLLATOR: u32 = 35;
pub const MIN_DELEGATOR_STAKE: Balance = 20 * KILT;
pub const NETWORK_REWARD_RATE: Perquintill = Perquintill::from_percent(10);
parameter_types! {
pub const MinBlocksPerRound: BlockNumber = MIN_BLOCKS_PER_ROUND;
pub const DefaultBlocksPerRound: BlockNumber = DEFAULT_BLOCKS_PER_ROUND;
pub const StakeDuration: BlockNumber = STAKE_DURATION;
pub const ExitQueueDelay: u32 = 2;
pub const MinCollators: u32 = MIN_COLLATORS;
pub const MinRequiredCollators: u32 = 4;
pub const MaxDelegationsPerRound: u32 = 1;
#[derive(Debug, Eq, PartialEq)]
pub const MaxDelegatorsPerCollator: u32 = MAX_DELEGATORS_PER_COLLATOR;
pub const MinCollatorStake: Balance = 10_000 * KILT;
pub const MinDelegatorStake: Balance = MIN_DELEGATOR_STAKE;
#[derive(Debug, Eq, PartialEq)]
pub const MaxCollatorCandidates: u32 = MAX_CANDIDATES;
pub const MaxUnstakeRequests: u32 = 10;
pub const NetworkRewardStart: BlockNumber = super::treasury::INITIAL_PERIOD_LENGTH;
pub const NetworkRewardRate: Perquintill = NETWORK_REWARD_RATE;
}
}
pub mod governance {
use super::*;
pub const MIN_DEPOSIT: Balance = KILT;
#[cfg(feature = "fast-gov")]
pub const LAUNCH_PERIOD: BlockNumber = 7 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const LAUNCH_PERIOD: BlockNumber = 7 * DAYS;
#[cfg(feature = "fast-gov")]
pub const VOTING_PERIOD: BlockNumber = 7 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const VOTING_PERIOD: BlockNumber = 7 * DAYS;
#[cfg(feature = "fast-gov")]
pub const FAST_TRACK_VOTING_PERIOD: BlockNumber = 3 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const FAST_TRACK_VOTING_PERIOD: BlockNumber = 3 * HOURS;
#[cfg(feature = "fast-gov")]
pub const ENACTMENT_PERIOD: BlockNumber = 8 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const ENACTMENT_PERIOD: BlockNumber = DAYS;
#[cfg(feature = "fast-gov")]
pub const COOLOFF_PERIOD: BlockNumber = 7 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const COOLOFF_PERIOD: BlockNumber = 7 * DAYS;
#[cfg(feature = "fast-gov")]
pub const SPEND_PERIOD: BlockNumber = 6 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const SPEND_PERIOD: BlockNumber = 6 * DAYS;
#[cfg(feature = "fast-gov")]
pub const ROTATION_PERIOD: BlockNumber = 80 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const ROTATION_PERIOD: BlockNumber = 80 * HOURS;
#[cfg(feature = "fast-gov")]
pub const TERM_DURATION: BlockNumber = 15 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const TERM_DURATION: BlockNumber = DAYS;
#[cfg(feature = "fast-gov")]
pub const COUNCIL_MOTION_DURATION: BlockNumber = 4 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const COUNCIL_MOTION_DURATION: BlockNumber = 7 * DAYS;
#[cfg(feature = "fast-gov")]
pub const TECHNICAL_MOTION_DURATION: BlockNumber = 4 * MINUTES;
#[cfg(not(feature = "fast-gov"))]
pub const TECHNICAL_MOTION_DURATION: BlockNumber = 7 * DAYS;
parameter_types! {
pub const LaunchPeriod: BlockNumber = LAUNCH_PERIOD;
pub const VotingPeriod: BlockNumber = VOTING_PERIOD;
pub const FastTrackVotingPeriod: BlockNumber = FAST_TRACK_VOTING_PERIOD;
pub const MinimumDeposit: Balance = MIN_DEPOSIT;
pub const EnactmentPeriod: BlockNumber = ENACTMENT_PERIOD;
pub const CooloffPeriod: BlockNumber = COOLOFF_PERIOD;
pub const CouncilMotionDuration: BlockNumber = COUNCIL_MOTION_DURATION;
pub const CouncilMaxProposals: u32 = 100;
pub const CouncilMaxMembers: u32 = 100;
pub const TechnicalMotionDuration: BlockNumber = TECHNICAL_MOTION_DURATION;
pub const TechnicalMaxProposals: u32 = 100;
pub const TechnicalMaxMembers: u32 = 100;
pub const TipperMaxMembers: u32 = 21;
}
}
pub mod multisig {
use super::*;
parameter_types! {
pub const MaxSignitors: u32 = 64;
pub const DepositBase: Balance = DEPOSIT_STORAGE_ITEM;
pub const DepositFactor: Balance = DEPOSIT_STORAGE_BYTE;
}
}
pub mod pallet_migration {
use super::*;
parameter_types! {
pub const MaxMigrationsPerPallet: u32 = 100;
}
}
pub mod did {
use parity_scale_codec::{Decode, Encode};
use scale_info::TypeInfo;
use super::*;
pub const MAX_KEY_LENGTH: u32 = 35;
pub const MAX_SERVICE_ENDPOINT_BYTE_LENGTH: u32 = MAX_SERVICE_ID_LENGTH
+ MAX_NUMBER_OF_TYPES_PER_SERVICE * MAX_SERVICE_TYPE_LENGTH
+ MAX_NUMBER_OF_URLS_PER_SERVICE * MAX_SERVICE_URL_LENGTH
+ 8;
pub const DID_BASE_DEPOSIT: Balance = 2 * KILT;
pub const KEY_DEPOSIT: Balance = deposit(0, MAX_KEY_LENGTH);
pub const SERVICE_ENDPOINT_DEPOSIT: Balance = deposit(1, MAX_SERVICE_ENDPOINT_BYTE_LENGTH);
pub const DID_FEE: Balance = 50 * MILLI_KILT;
pub const MAX_KEY_AGREEMENT_KEYS: u32 = 10;
pub const MAX_PUBLIC_KEYS_PER_DID: u32 = 20;
pub const MAX_TOTAL_KEY_AGREEMENT_KEYS: u32 = MAX_PUBLIC_KEYS_PER_DID - 1;
pub const MAX_BLOCKS_TX_VALIDITY: BlockNumber = HOURS;
pub const MAX_NUMBER_OF_SERVICES_PER_DID: u32 = 25;
pub const MAX_SERVICE_ID_LENGTH: u32 = 50;
pub const MAX_SERVICE_TYPE_LENGTH: u32 = 50;
pub const MAX_NUMBER_OF_TYPES_PER_SERVICE: u32 = 1;
pub const MAX_SERVICE_URL_LENGTH: u32 = 2_000;
pub const MAX_NUMBER_OF_URLS_PER_SERVICE: u32 = 2;
parameter_types! {
#[derive(Debug, Clone, Eq, PartialEq, TypeInfo, Decode, Encode)]
pub const MaxNewKeyAgreementKeys: u32 = MAX_KEY_AGREEMENT_KEYS;
#[derive(Clone)]
pub const MaxPublicKeysPerDid: u32 = MAX_PUBLIC_KEYS_PER_DID;
#[derive(Debug, Clone, Eq, PartialEq)]
pub const MaxTotalKeyAgreementKeys: u32 = MAX_TOTAL_KEY_AGREEMENT_KEYS;
pub const MaxBlocksTxValidity: BlockNumber = MAX_BLOCKS_TX_VALIDITY;
pub const DidBaseDeposit: Balance = DID_BASE_DEPOSIT;
pub const KeyDeposit: Balance = KEY_DEPOSIT;
pub const ServiceEndpointDeposit: Balance = SERVICE_ENDPOINT_DEPOSIT;
pub const DidFee: Balance = DID_FEE;
pub const MaxNumberOfServicesPerDid: u32 = MAX_NUMBER_OF_SERVICES_PER_DID;
pub const MaxServiceIdLength: u32 = MAX_SERVICE_ID_LENGTH;
pub const MaxServiceTypeLength: u32 = MAX_SERVICE_TYPE_LENGTH;
pub const MaxServiceUrlLength: u32 = MAX_SERVICE_URL_LENGTH;
pub const MaxNumberOfTypesPerService: u32 = MAX_NUMBER_OF_TYPES_PER_SERVICE;
pub const MaxNumberOfUrlsPerService: u32 = MAX_NUMBER_OF_URLS_PER_SERVICE;
}
}
pub mod did_lookup {
use super::*;
pub const MAX_CONNECTION_BYTE_LENGTH: u32 = 80;
pub const DID_CONNECTION_DEPOSIT: Balance = deposit(1, MAX_CONNECTION_BYTE_LENGTH);
parameter_types! {
pub const DidLookupDeposit: Balance = DID_CONNECTION_DEPOSIT;
}
}
pub mod treasury {
use super::*;
pub const INITIAL_PERIOD_LENGTH: BlockNumber = BLOCKS_PER_YEAR.saturating_mul(5);
const YEARLY_REWARD: Balance = 2_000_000u128 * KILT;
pub const INITIAL_PERIOD_REWARD_PER_BLOCK: Balance = YEARLY_REWARD / (BLOCKS_PER_YEAR as Balance);
parameter_types! {
pub const InitialPeriodLength: BlockNumber = INITIAL_PERIOD_LENGTH;
pub const InitialPeriodReward: Balance = INITIAL_PERIOD_REWARD_PER_BLOCK;
pub const PayoutPeriod: BlockNumber = DAYS * 30;
}
}
pub mod proxy {
use super::*;
parameter_types! {
pub const ProxyDepositBase: Balance = deposit(1, 8);
pub const ProxyDepositFactor: Balance = deposit(0, 33);
pub const MaxProxies: u16 = 10;
pub const AnnouncementDepositBase: Balance = deposit(1, 8);
pub const AnnouncementDepositFactor: Balance = deposit(0, 66);
pub const MaxPending: u16 = 10;
}
}
pub mod web3_names {
use super::*;
pub const MIN_LENGTH: u32 = 3;
pub const MAX_LENGTH: u32 = 32;
pub const MAX_NAME_BYTE_LENGTH: u32 = 121;
pub const DEPOSIT: Balance = deposit(2, MAX_NAME_BYTE_LENGTH);
parameter_types! {
pub const Web3NameDeposit: Balance = DEPOSIT;
pub const MinNameLength: u32 = MIN_LENGTH;
pub const MaxNameLength: u32 = MAX_LENGTH;
}
}
pub mod preimage {
use super::*;
parameter_types! {
pub const PreimageBaseDeposit: Balance = deposit(2, 64);
}
}
pub mod tips {
use super::*;
parameter_types! {
pub const MaximumReasonLength: u32 = 16384;
pub const TipCountdown: BlockNumber = DAYS;
pub const TipFindersFee: Percent = Percent::from_percent(0);
pub const TipReportDepositBase: Balance = deposit(1, 1);
pub const MaxTipAmount: Balance = 100_000 * KILT;
}
}
pub mod fee {
use super::*;
parameter_types! {
pub const OperationalFeeMultiplier: u8 = 5;
pub const TransactionByteFee: Balance = MICRO_KILT;
}
}
pub mod public_credentials {
use super::*;
pub const MAX_PUBLIC_CREDENTIAL_STORAGE_LENGTH: u32 = 419;
pub const PUBLIC_CREDENTIAL_DEPOSIT: Balance = deposit(1, MAX_PUBLIC_CREDENTIAL_STORAGE_LENGTH);
parameter_types! {
pub const Deposit: Balance = PUBLIC_CREDENTIAL_DEPOSIT;
pub const MaxEncodedClaimsLength: u32 = 100_000; pub const MaxSubjectIdLength: u32 = kilt_asset_dids::MAXIMUM_ASSET_DID_LENGTH as u32;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[allow(clippy::assertions_on_constants)]
#[test]
fn blocks_per_year_saturation() {
assert!(BLOCKS_PER_YEAR < u64::MAX);
}
}