lib.rs 30 KB
Newer Older
Shawn Tabrizi's avatar
Shawn Tabrizi committed
1
// Copyright 2017-2020 Parity Technologies (UK) Ltd.
Gav's avatar
Gav committed
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// This file is part of Polkadot.

// Polkadot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Polkadot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.

17
//! The Polkadot runtime. This can be compiled with `#[no_std]`, ready for Wasm.
Gav's avatar
Gav committed
18
19

#![cfg_attr(not(feature = "std"), no_std)]
20
21
// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
#![recursion_limit="256"]
Gav Wood's avatar
Gav Wood committed
22

23
use sp_std::prelude::*;
24
use sp_core::u32_trait::{_1, _2, _3, _4, _5};
25
use codec::{Encode, Decode};
26
use primitives::{
27
	AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment,
28
	parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext}, ValidityError,
29
};
30
use runtime_common::{attestations, claims, parachains, registrar, slots,
31
	impls::{CurrencyToVoteHandler, TargetedFeeAdjustment, ToAuthor},
32
33
34
	NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio,
	MaximumBlockLength,
};
35
use sp_runtime::{
Gavin Wood's avatar
Gavin Wood committed
36
	create_runtime_str, generic, impl_opaque_keys,
37
	ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, RuntimeDebug,
38
39
40
	transaction_validity::{
		TransactionValidity, InvalidTransaction, TransactionValidityError, TransactionSource,
	},
41
	curve::PiecewiseLinear,
42
	traits::{BlakeTwo256, Block as BlockT, SignedExtension, OpaqueKeys, ConvertInto, IdentityLookup},
Gav Wood's avatar
Gav Wood committed
43
};
44
45
#[cfg(feature = "runtime-benchmarks")]
use sp_runtime::RuntimeString;
Arkadiy Paronyan's avatar
Arkadiy Paronyan committed
46
use version::RuntimeVersion;
47
use grandpa::{AuthorityId as GrandpaId, fg_primitives};
48
49
#[cfg(any(feature = "std", test))]
use version::NativeVersion;
50
51
use sp_core::OpaqueMetadata;
use sp_staking::SessionIndex;
52
use frame_support::{
53
	parameter_types, construct_runtime, traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness},
54
	weights::DispatchInfo,
Gavin Wood's avatar
Gavin Wood committed
55
};
thiolliere's avatar
thiolliere committed
56
use im_online::sr25519::AuthorityId as ImOnlineId;
Gavin Wood's avatar
Gavin Wood committed
57
use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId;
Gavin Wood's avatar
Gavin Wood committed
58
use system::offchain::TransactionSubmitter;
59
use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;
60
use session::{historical as session_historical};
61

Gav Wood's avatar
Gav Wood committed
62
63
#[cfg(feature = "std")]
pub use staking::StakerStatus;
64
#[cfg(any(feature = "std", test))]
65
pub use sp_runtime::BuildStorage;
66
pub use timestamp::Call as TimestampCall;
67
pub use balances::Call as BalancesCall;
68
pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER};
69
pub use parachains::Call as ParachainsCall;
70
71
72

/// Constant values used within the runtime.
pub mod constants;
73
use constants::{time::*, currency::*, fee::*};
74

75
76
77
78
// Make the WASM binary available.
#[cfg(feature = "std")]
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));

79
80
81
82
/// Runtime version (Kusama).
pub const VERSION: RuntimeVersion = RuntimeVersion {
	spec_name: create_runtime_str!("kusama"),
	impl_name: create_runtime_str!("parity-kusama"),
83
	authoring_version: 2,
84
	spec_version: 1057,
André Silva's avatar
André Silva committed
85
	impl_version: 1,
86
87
	apis: RUNTIME_API_VERSIONS,
};
Arkadiy Paronyan's avatar
Arkadiy Paronyan committed
88

89
90
91
92
93
94
95
96
97
/// Native version.
#[cfg(any(feature = "std", test))]
pub fn native_version() -> NativeVersion {
	NativeVersion {
		runtime_version: VERSION,
		can_author_with: Default::default(),
	}
}

98
/// Avoid processing transactions from slots and parachain registrar.
99
#[derive(Default, Encode, Decode, Clone, Eq, PartialEq, RuntimeDebug)]
100
101
pub struct RestrictFunctionality;
impl SignedExtension for RestrictFunctionality {
Gavin Wood's avatar
Gavin Wood committed
102
	const IDENTIFIER: &'static str = "RestrictFunctionality";
103
104
105
106
	type AccountId = AccountId;
	type Call = Call;
	type AdditionalSigned = ();
	type Pre = ();
107
108
	type DispatchInfo = DispatchInfo;

109
	fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) }
110

111
	fn validate(&self, _: &Self::AccountId, call: &Self::Call, _: DispatchInfo, _: usize)
Gavin Wood's avatar
Gavin Wood committed
112
		-> TransactionValidity
113
114
	{
		match call {
Gavin Wood's avatar
Gavin Wood committed
115
			Call::Slots(_) | Call::Registrar(_)
116
117
				=> Err(InvalidTransaction::Custom(ValidityError::NoPermission.into()).into()),
			_ => Ok(Default::default()),
118
119
120
121
		}
	}
}

122
parameter_types! {
123
	pub const Version: RuntimeVersion = VERSION;
124
125
}

126
127
impl system::Trait for Runtime {
	type Origin = Origin;
128
	type Call = Call;
Gav Wood's avatar
Gav Wood committed
129
	type Index = Nonce;
130
131
132
133
	type BlockNumber = BlockNumber;
	type Hash = Hash;
	type Hashing = BlakeTwo256;
	type AccountId = AccountId;
134
	type Lookup = IdentityLookup<Self::AccountId>;
135
	type Header = generic::Header<BlockNumber, BlakeTwo256>;
Gav's avatar
Gav committed
136
	type Event = Event;
137
	type BlockHashCount = BlockHashCount;
138
139
140
	type MaximumBlockWeight = MaximumBlockWeight;
	type MaximumBlockLength = MaximumBlockLength;
	type AvailableBlockRatio = AvailableBlockRatio;
141
	type Version = Version;
142
	type ModuleToIndex = ModuleToIndex;
143
144
	type AccountData = balances::AccountData<Balance>;
	type OnNewAccount = ();
145
	type OnKilledAccount = ();
146
147
}

148
parameter_types! {
149
	pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64;
150
151
152
153
154
155
	pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK;
}

impl babe::Trait for Runtime {
	type EpochDuration = EpochDuration;
	type ExpectedBlockTime = ExpectedBlockTime;
156
157
158

	// session module is the trigger
	type EpochChangeTrigger = babe::ExternalTrigger;
159
160
}

Gavin Wood's avatar
Gavin Wood committed
161
162
163
164
parameter_types! {
	pub const IndexDeposit: Balance = 1 * DOLLARS;
}

Gav Wood's avatar
Gav Wood committed
165
166
impl indices::Trait for Runtime {
	type AccountIndex = AccountIndex;
167
168
	type Currency = Balances;
	type Deposit = IndexDeposit;
Gav Wood's avatar
Gav Wood committed
169
170
171
	type Event = Event;
}

Gavin Wood's avatar
Gavin Wood committed
172
parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
173
	pub const ExistentialDeposit: Balance = 1 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
174
175
176
177
178
}

/// Splits fees 80/20 between treasury and block author.
pub type DealWithFees = SplitTwoWays<
	Balance,
179
	NegativeImbalance<Runtime>,
180
	_4, Treasury,   // 4 parts (80%) goes to the treasury.
181
	_1, ToAuthor<Runtime>,   // 1 part (20%) goes to the block author.
Gavin Wood's avatar
Gavin Wood committed
182
183
>;

184
impl balances::Trait for Runtime {
Gav's avatar
Gav committed
185
	type Balance = Balance;
186
	type DustRemoval = ();
Gavin Wood's avatar
Gavin Wood committed
187
	type Event = Event;
Gavin Wood's avatar
Gavin Wood committed
188
	type ExistentialDeposit = ExistentialDeposit;
189
	type AccountStore = System;
190
191
192
193
194
}

parameter_types! {
	pub const TransactionBaseFee: Balance = 1 * CENTS;
	pub const TransactionByteFee: Balance = 10 * MILLICENTS;
195
196
	// for a sane configuration, this should always be less than `AvailableBlockRatio`.
	pub const TargetBlockFullness: Perbill = Perbill::from_percent(25);
197
198
199
200
201
}

impl transaction_payment::Trait for Runtime {
	type Currency = Balances;
	type OnTransactionPayment = DealWithFees;
Gavin Wood's avatar
Gavin Wood committed
202
203
	type TransactionBaseFee = TransactionBaseFee;
	type TransactionByteFee = TransactionByteFee;
204
	type WeightToFee = WeightToFee;
205
	type FeeMultiplierUpdate = TargetedFeeAdjustment<TargetBlockFullness, Self>;
Gav's avatar
Gav committed
206
207
}

208
parameter_types! {
209
	pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
210
}
211
impl timestamp::Trait for Runtime {
212
	type Moment = u64;
213
	type OnTimestampSet = Babe;
214
	type MinimumPeriod = MinimumPeriod;
215
216
}

Gavin Wood's avatar
Gavin Wood committed
217
parameter_types! {
218
	pub const UncleGenerations: u32 = 0;
Gavin Wood's avatar
Gavin Wood committed
219
220
221
222
}

// TODO: substrate#2986 implement this properly
impl authorship::Trait for Runtime {
223
	type FindAuthor = session::FindAccountFromAuthorIndex<Self, Babe>;
Gavin Wood's avatar
Gavin Wood committed
224
225
	type UncleGenerations = UncleGenerations;
	type FilterUncle = ();
Gavin Wood's avatar
Gavin Wood committed
226
	type EventHandler = (Staking, ImOnline);
Gavin Wood's avatar
Gavin Wood committed
227
228
}

229
230
231
232
233
234
parameter_types! {
	pub const Period: BlockNumber = 10 * MINUTES;
	pub const Offset: BlockNumber = 0;
}

impl_opaque_keys! {
235
	pub struct SessionKeys {
Gavin Wood's avatar
Gavin Wood committed
236
237
238
239
		pub grandpa: Grandpa,
		pub babe: Babe,
		pub im_online: ImOnline,
		pub parachain_validator: Parachains,
Gavin Wood's avatar
Gavin Wood committed
240
		pub authority_discovery: AuthorityDiscovery,
241
	}
242
243
}

thiolliere's avatar
thiolliere committed
244
245
246
247
parameter_types! {
	pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17);
}

248
impl session::Trait for Runtime {
Gav's avatar
Gav committed
249
	type Event = Event;
250
251
	type ValidatorId = AccountId;
	type ValidatorIdOf = staking::StashOf<Self>;
Gavin Wood's avatar
Gavin Wood committed
252
253
254
255
	type ShouldEndSession = Babe;
	type SessionManager = Staking;
	type SessionHandler = <SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
	type Keys = SessionKeys;
thiolliere's avatar
thiolliere committed
256
	type DisabledValidatorsThreshold = DisabledValidatorsThreshold;
257
258
259
260
}

impl session::historical::Trait for Runtime {
	type FullIdentification = staking::Exposure<AccountId, Balance>;
261
	type FullIdentificationOf = staking::ExposureOf<Runtime>;
262
263
}

264
pallet_staking_reward_curve::build! {
thiolliere's avatar
thiolliere committed
265
266
267
268
269
270
271
272
273
274
	const REWARD_CURVE: PiecewiseLinear<'static> = curve!(
		min_inflation: 0_025_000,
		max_inflation: 0_100_000,
		ideal_stake: 0_500_000,
		falloff: 0_050_000,
		max_piece_count: 40,
		test_precision: 0_005_000,
	);
}

275
parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
276
	// Six sessions in an era (6 hours).
277
	pub const SessionsPerEra: SessionIndex = 6;
Gavin Wood's avatar
Gavin Wood committed
278
	// 28 eras for unbonding (7 days).
Gavin Wood's avatar
Gavin Wood committed
279
	pub const BondingDuration: staking::EraIndex = 28;
Gavin Wood's avatar
Gavin Wood committed
280
	// 28 eras in which slashes can be cancelled (7 days).
Gavin Wood's avatar
Gavin Wood committed
281
	pub const SlashDeferDuration: staking::EraIndex = 28;
thiolliere's avatar
thiolliere committed
282
	pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
Gavin Wood's avatar
Gavin Wood committed
283
	pub const MaxNominatorRewardedPerValidator: u32 = 64;
284
}
285

286
impl staking::Trait for Runtime {
Gavin Wood's avatar
Gavin Wood committed
287
	type Currency = Balances;
288
	type UnixTime = Timestamp;
289
	type CurrencyToVote = CurrencyToVoteHandler<Self>;
Gavin Wood's avatar
Gavin Wood committed
290
	type RewardRemainder = Treasury;
Gav's avatar
Gav committed
291
	type Event = Event;
292
	type Slash = Treasury;
293
	type Reward = ();
294
295
	type SessionsPerEra = SessionsPerEra;
	type BondingDuration = BondingDuration;
Gavin Wood's avatar
Gavin Wood committed
296
	type SlashDeferDuration = SlashDeferDuration;
Gavin Wood's avatar
Gavin Wood committed
297
298
	// A majority of the council can cancel the slash.
	type SlashCancelOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>;
299
	type SessionInterface = Self;
thiolliere's avatar
thiolliere committed
300
	type RewardCurve = RewardCurve;
Gavin Wood's avatar
Gavin Wood committed
301
	type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator;
302
303
}

304
parameter_types! {
305
306
	pub const LaunchPeriod: BlockNumber = 7 * DAYS;
	pub const VotingPeriod: BlockNumber = 7 * DAYS;
307
	pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS;
Gavin Wood's avatar
Gavin Wood committed
308
	pub const MinimumDeposit: Balance = 1 * DOLLARS;
309
310
	pub const EnactmentPeriod: BlockNumber = 8 * DAYS;
	pub const CooloffPeriod: BlockNumber = 7 * DAYS;
Gavin Wood's avatar
Gavin Wood committed
311
	// One cent: $10,000 / MB
Gavin Wood's avatar
Gavin Wood committed
312
	pub const PreimageByteDeposit: Balance = 10 * MILLICENTS;
313
	pub const InstantAllowed: bool = true;
314
315
}

316
317
318
impl democracy::Trait for Runtime {
	type Proposal = Call;
	type Event = Event;
319
	type Currency = Balances;
320
321
322
323
	type EnactmentPeriod = EnactmentPeriod;
	type LaunchPeriod = LaunchPeriod;
	type VotingPeriod = VotingPeriod;
	type MinimumDeposit = MinimumDeposit;
324
325
	/// A straight majority of the council can decide what their next motion is.
	type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>;
326
	/// A majority can have the next scheduled referendum be a straight majority-carries vote.
327
	type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>;
328
329
330
331
332
333
	/// A unanimous council can have the next scheduled referendum be a straight default-carries
	/// (NTB) vote.
	type ExternalDefaultOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, CouncilCollective>;
	/// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote
	/// be tabled immediately and with a shorter voting/enactment period.
	type FastTrackOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, TechnicalCollective>;
334
335
336
	type InstantOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>;
	type InstantAllowed = InstantAllowed;
	type FastTrackVotingPeriod = FastTrackVotingPeriod;
337
338
339
340
341
	// To cancel a proposal which has been passed, 2/3 of the council must agree to it.
	type CancellationOrigin = collective::EnsureProportionAtLeast<_2, _3, AccountId, CouncilCollective>;
	// Any single technical committee member may veto a coming council proposal, however they can
	// only do it once and it lasts only for the cooloff period.
	type VetoOrigin = collective::EnsureMember<AccountId, TechnicalCollective>;
342
	type CooloffPeriod = CooloffPeriod;
Gavin Wood's avatar
Gavin Wood committed
343
344
	type PreimageByteDeposit = PreimageByteDeposit;
	type Slash = Treasury;
345
}
346

347
348
349
350
parameter_types! {
	pub const CouncilMotionDuration: BlockNumber = 3 * DAYS;
}

351
352
type CouncilCollective = collective::Instance1;
impl collective::Trait<CouncilCollective> for Runtime {
353
354
355
	type Origin = Origin;
	type Proposal = Call;
	type Event = Event;
356
	type MotionDuration = CouncilMotionDuration;
357
358
}

Gavin Wood's avatar
Gavin Wood committed
359
parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
360
361
	pub const CandidacyBond: Balance = 1 * DOLLARS;
	pub const VotingBond: Balance = 5 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
362
363
	/// Daily council elections.
	pub const TermDuration: BlockNumber = 24 * HOURS;
Kian Paimani's avatar
Kian Paimani committed
364
365
	pub const DesiredMembers: u32 = 13;
	pub const DesiredRunnersUp: u32 = 7;
366
367
368
}

impl elections_phragmen::Trait for Runtime {
369
	type Event = Event;
370
371
	type Currency = Balances;
	type ChangeMembers = Council;
372
	type CurrencyToVote = CurrencyToVoteHandler<Self>;
Gavin Wood's avatar
Gavin Wood committed
373
374
	type CandidacyBond = CandidacyBond;
	type VotingBond = VotingBond;
375
376
377
	type LoserCandidate = Treasury;
	type BadReport = Treasury;
	type KickedMember = Treasury;
Gavin Wood's avatar
Gavin Wood committed
378
379
380
	type DesiredMembers = DesiredMembers;
	type DesiredRunnersUp = DesiredRunnersUp;
	type TermDuration = TermDuration;
381
382
}

383
384
385
386
parameter_types! {
	pub const TechnicalMotionDuration: BlockNumber = 3 * DAYS;
}

387
388
type TechnicalCollective = collective::Instance2;
impl collective::Trait<TechnicalCollective> for Runtime {
389
390
391
	type Origin = Origin;
	type Proposal = Call;
	type Event = Event;
392
	type MotionDuration = TechnicalMotionDuration;
393
394
}

395
396
397
398
399
400
impl membership::Trait<membership::Instance1> for Runtime {
	type Event = Event;
	type AddOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
	type RemoveOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
	type SwapOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
	type ResetOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
401
	type PrimeOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
402
403
404
405
	type MembershipInitialized = TechnicalCommittee;
	type MembershipChanged = TechnicalCommittee;
}

Gavin Wood's avatar
Gavin Wood committed
406
407
parameter_types! {
	pub const ProposalBond: Permill = Permill::from_percent(5);
Gavin Wood's avatar
Gavin Wood committed
408
	pub const ProposalBondMinimum: Balance = 20 * DOLLARS;
409
	pub const SpendPeriod: BlockNumber = 6 * DAYS;
Gavin Wood's avatar
Gavin Wood committed
410
	pub const Burn: Permill = Permill::from_percent(0);
Gavin Wood's avatar
Gavin Wood committed
411
412
413
414
415

	pub const TipCountdown: BlockNumber = 1 * DAYS;
	pub const TipFindersFee: Percent = Percent::from_percent(20);
	pub const TipReportDepositBase: Balance = 1 * DOLLARS;
	pub const TipReportDepositPerByte: Balance = 1 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
416
417
}

418
impl treasury::Trait for Runtime {
Gavin Wood's avatar
Gavin Wood committed
419
	type Currency = Balances;
420
	type ApproveOrigin = collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective>;
421
	type RejectOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
Gavin Wood's avatar
Gavin Wood committed
422
423
424
425
426
	type Tippers = ElectionsPhragmen;
	type TipCountdown = TipCountdown;
	type TipFindersFee = TipFindersFee;
	type TipReportDepositBase = TipReportDepositBase;
	type TipReportDepositPerByte = TipReportDepositPerByte;
427
	type Event = Event;
428
	type ProposalRejection = Treasury;
Gavin Wood's avatar
Gavin Wood committed
429
430
431
432
	type ProposalBond = ProposalBond;
	type ProposalBondMinimum = ProposalBondMinimum;
	type SpendPeriod = SpendPeriod;
	type Burn = Burn;
433
}
434

435
436
437
438
439
440
impl offences::Trait for Runtime {
	type Event = Event;
	type IdentificationTuple = session::historical::IdentificationTuple<Self>;
	type OnOffenceHandler = Staking;
}

Gavin Wood's avatar
Gavin Wood committed
441
442
impl authority_discovery::Trait for Runtime {}

Gavin Wood's avatar
Gavin Wood committed
443
444
type SubmitTransaction = TransactionSubmitter<ImOnlineId, Runtime, UncheckedExtrinsic>;

445
446
447
448
parameter_types! {
	pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _;
}

449
impl im_online::Trait for Runtime {
thiolliere's avatar
thiolliere committed
450
	type AuthorityId = ImOnlineId;
451
	type Event = Event;
Gavin Wood's avatar
Gavin Wood committed
452
453
	type Call = Call;
	type SubmitTransaction = SubmitTransaction;
454
	type ReportUnresponsiveness = Offences;
455
	type SessionDuration = SessionDuration;
456
457
}

458
459
460
461
impl grandpa::Trait for Runtime {
	type Event = Event;
}

Gavin Wood's avatar
Gavin Wood committed
462
463
464
465
466
467
parameter_types! {
	pub const WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into();
	pub const ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into();
}

impl finality_tracker::Trait for Runtime {
468
	type OnFinalizationStalled = ();
Gavin Wood's avatar
Gavin Wood committed
469
470
471
472
	type WindowSize = WindowSize;
	type ReportLatency = ReportLatency;
}

473
474
475
476
parameter_types! {
	pub const AttestationPeriod: BlockNumber = 50;
}

477
478
479
impl attestations::Trait for Runtime {
	type AttestationPeriod = AttestationPeriod;
	type ValidatorIdentities = parachains::ValidatorIdentities<Runtime>;
480
	type RewardAttestation = Staking;
481
482
}

483
484
485
486
487
parameter_types! {
	pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB
	pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB
}

488
489
490
impl parachains::Trait for Runtime {
	type Origin = Origin;
	type Call = Call;
491
	type ParachainCurrency = Balances;
492
	type Randomness = RandomnessCollectiveFlip;
493
494
	type ActiveParachains = Registrar;
	type Registrar = Registrar;
495
496
	type MaxCodeSize = MaxCodeSize;
	type MaxHeadDataSize = MaxHeadDataSize;
497
498
499
500
	type Proof = session::historical::Proof;
	type KeyOwnerProofSystem = session::historical::Module<Self>;
	type IdentificationTuple = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, Vec<u8>)>>::IdentificationTuple;
	type ReportOffence = Offences;
501
	type BlockHashConversion = sp_runtime::traits::Identity;
502
503
504
}

parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
505
	pub const ParathreadDeposit: Balance = 5 * DOLLARS;
506
507
508
509
510
511
512
513
514
515
516
517
	pub const QueueSize: usize = 2;
	pub const MaxRetries: u32 = 3;
}

impl registrar::Trait for Runtime {
	type Event = Event;
	type Origin = Origin;
	type Currency = Balances;
	type ParathreadDeposit = ParathreadDeposit;
	type SwapAux = Slots;
	type QueueSize = QueueSize;
	type MaxRetries = MaxRetries;
518
}
519

Gavin Wood's avatar
Gavin Wood committed
520
parameter_types! {
521
	pub const LeasePeriod: BlockNumber = 100_000;
Gavin Wood's avatar
Gavin Wood committed
522
523
524
525
526
	pub const EndingPeriod: BlockNumber = 1000;
}

impl slots::Trait for Runtime {
	type Event = Event;
527
528
	type Currency = Balances;
	type Parachains = Registrar;
Gavin Wood's avatar
Gavin Wood committed
529
530
	type LeasePeriod = LeasePeriod;
	type EndingPeriod = EndingPeriod;
531
	type Randomness = RandomnessCollectiveFlip;
Gavin Wood's avatar
Gavin Wood committed
532
533
}

Gavin Wood's avatar
Gavin Wood committed
534
parameter_types! {
535
536
537
538
539
	pub const Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:";
}

impl claims::Trait for Runtime {
	type Event = Event;
Gavin Wood's avatar
Gavin Wood committed
540
	type VestingSchedule = Vesting;
541
542
543
	type Prefix = Prefix;
}

544
parameter_types! {
545
	// Minimum 100 bytes/KSM deposited (1 CENT/byte)
Gavin Wood's avatar
Gavin Wood committed
546
547
548
	pub const BasicDeposit: Balance = 10 * DOLLARS;       // 258 bytes on-chain
	pub const FieldDeposit: Balance = 250 * CENTS;        // 66 bytes on-chain
	pub const SubAccountDeposit: Balance = 2 * DOLLARS;   // 53 bytes on-chain
Gavin Wood's avatar
Gavin Wood committed
549
550
	pub const MaxSubAccounts: u32 = 100;
	pub const MaxAdditionalFields: u32 = 100;
551
552
553
554
555
556
557
558
559
}

impl identity::Trait for Runtime {
	type Event = Event;
	type Currency = Balances;
	type Slashed = Treasury;
	type BasicDeposit = BasicDeposit;
	type FieldDeposit = FieldDeposit;
	type SubAccountDeposit = SubAccountDeposit;
Gavin Wood's avatar
Gavin Wood committed
560
561
	type MaxSubAccounts = MaxSubAccounts;
	type MaxAdditionalFields = MaxAdditionalFields;
562
563
564
565
	type RegistrarOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
	type ForceOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
}

Gavin Wood's avatar
Gavin Wood committed
566
567
parameter_types! {
	// One storage item; value is size 4+4+16+32 bytes = 56 bytes.
Gavin Wood's avatar
Gavin Wood committed
568
	pub const MultisigDepositBase: Balance = 30 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
569
	// Additional storage item size of 32 bytes.
Gavin Wood's avatar
Gavin Wood committed
570
	pub const MultisigDepositFactor: Balance = 5 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
571
572
573
574
575
576
577
578
579
580
581
582
	pub const MaxSignatories: u16 = 100;
}

impl utility::Trait for Runtime {
	type Event = Event;
	type Call = Call;
	type Currency = Balances;
	type MultisigDepositBase = MultisigDepositBase;
	type MultisigDepositFactor = MultisigDepositFactor;
	type MaxSignatories = MaxSignatories;
}

583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
parameter_types! {
	pub const ConfigDepositBase: Balance = 5 * DOLLARS;
	pub const FriendDepositFactor: Balance = 50 * CENTS;
	pub const MaxFriends: u16 = 9;
	pub const RecoveryDeposit: Balance = 5 * DOLLARS;
}

impl recovery::Trait for Runtime {
	type Event = Event;
	type Call = Call;
	type Currency = Balances;
	type ConfigDepositBase = ConfigDepositBase;
	type FriendDepositFactor = FriendDepositFactor;
	type MaxFriends = MaxFriends;
	type RecoveryDeposit = RecoveryDeposit;
}

parameter_types! {
	pub const CandidateDeposit: Balance = 10 * DOLLARS;
	pub const WrongSideDeduction: Balance = 2 * DOLLARS;
	pub const MaxStrikes: u32 = 10;
	pub const RotationPeriod: BlockNumber = 80 * HOURS;
	pub const PeriodSpend: Balance = 500 * DOLLARS;
	pub const MaxLockDuration: BlockNumber = 36 * 30 * DAYS;
	pub const ChallengePeriod: BlockNumber = 7 * DAYS;
}

impl society::Trait for Runtime {
	type Event = Event;
	type Currency = Balances;
	type Randomness = RandomnessCollectiveFlip;
	type CandidateDeposit = CandidateDeposit;
	type WrongSideDeduction = WrongSideDeduction;
	type MaxStrikes = MaxStrikes;
	type PeriodSpend = PeriodSpend;
	type MembershipChanged = ();
	type RotationPeriod = RotationPeriod;
	type MaxLockDuration = MaxLockDuration;
	type FounderSetOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
	type SuspensionJudgementOrigin = society::EnsureFounder<Runtime>;
	type ChallengePeriod = ChallengePeriod;
}

626
627
628
629
parameter_types! {
	pub const MinVestedTransfer: Balance = 100 * DOLLARS;
}

Gavin Wood's avatar
Gavin Wood committed
630
631
632
633
impl vesting::Trait for Runtime {
	type Event = Event;
	type Currency = Balances;
	type BlockNumberToBalance = ConvertInto;
634
	type MinVestedTransfer = MinVestedTransfer;
Gavin Wood's avatar
Gavin Wood committed
635
636
}

Gavin Wood's avatar
Gavin Wood committed
637
construct_runtime! {
638
	pub enum Runtime where
639
		Block = Block,
640
		NodeBlock = primitives::Block,
641
		UncheckedExtrinsic = UncheckedExtrinsic
642
	{
643
		// Basic stuff; balances is uncallable initially.
Gavin Wood's avatar
Gavin Wood committed
644
		System: system::{Module, Call, Storage, Config, Event<T>},
Ashley's avatar
Ashley committed
645
		RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage},
646
647

		// Must be before session.
648
		Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)},
649
650

		Timestamp: timestamp::{Module, Call, Storage, Inherent},
Gavin Wood's avatar
Gavin Wood committed
651
		Indices: indices::{Module, Call, Storage, Config<T>, Event<T>},
652
		Balances: balances::{Module, Call, Storage, Config<T>, Event<T>},
653
		TransactionPayment: transaction_payment::{Module, Storage},
654
655
656

		// Consensus support.
		Authorship: authorship::{Module, Call, Storage},
657
		Staking: staking::{Module, Call, Storage, Config<T>, Event<T>},
658
		Offences: offences::{Module, Call, Storage, Event},
659
		Historical: session_historical::{Module},
660
		Session: session::{Module, Call, Storage, Event, Config<T>},
661
		FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent},
662
		Grandpa: grandpa::{Module, Call, Storage, Config, Event},
thiolliere's avatar
thiolliere committed
663
		ImOnline: im_online::{Module, Call, Storage, Event<T>, ValidateUnsigned, Config<T>},
Gavin Wood's avatar
Gavin Wood committed
664
		AuthorityDiscovery: authority_discovery::{Module, Call, Config},
665
666

		// Governance stuff; uncallable initially.
Gavin Wood's avatar
Gavin Wood committed
667
		Democracy: democracy::{Module, Call, Storage, Config, Event<T>},
668
669
		Council: collective::<Instance1>::{Module, Call, Storage, Origin<T>, Event<T>, Config<T>},
		TechnicalCommittee: collective::<Instance2>::{Module, Call, Storage, Origin<T>, Event<T>, Config<T>},
Kian Paimani's avatar
Kian Paimani committed
670
		ElectionsPhragmen: elections_phragmen::{Module, Call, Storage, Event<T>},
671
		TechnicalMembership: membership::<Instance1>::{Module, Call, Storage, Event<T>, Config<T>},
Gavin Wood's avatar
Gavin Wood committed
672
		Treasury: treasury::{Module, Call, Storage, Event<T>},
673
674
675
676
677
678

		// Claims. Usable initially.
		Claims: claims::{Module, Call, Storage, Event<T>, Config<T>, ValidateUnsigned},

		// Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they
		// have no public dispatchables.
679
		Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin},
680
		Attestations: attestations::{Module, Call, Storage},
Gavin Wood's avatar
Gavin Wood committed
681
		Slots: slots::{Module, Call, Storage, Event<T>},
682
		Registrar: registrar::{Module, Call, Storage, Event, Config<T>},
683

684
685
		// Utility module.
		Utility: utility::{Module, Call, Storage, Event<T>},
686
687
688

		// Less simple identity module.
		Identity: identity::{Module, Call, Storage, Event<T>},
689
690
691
692
693
694

		// Society module.
		Society: society::{Module, Call, Storage, Event<T>},

		// Social recovery module.
		Recovery: recovery::{Module, Call, Storage, Event<T>},
Gavin Wood's avatar
Gavin Wood committed
695
696
697

		// Vesting. Usable initially, but removed once all vesting is finished.
		Vesting: vesting::{Module, Call, Storage, Event<T>, Config<T>},
Gav's avatar
Gav committed
698
	}
Gavin Wood's avatar
Gavin Wood committed
699
}
700
701

/// The address format for describing accounts.
702
pub type Address = AccountId;
703
/// Block header type as expected by this runtime.
704
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
705
706
707
708
709
710
/// Block type as expected by this runtime.
pub type Block = generic::Block<Header, UncheckedExtrinsic>;
/// A Block signed with a Justification
pub type SignedBlock = generic::SignedBlock<Block>;
/// BlockId type as expected by this runtime.
pub type BlockId = generic::BlockId<Block>;
711
712
/// The SignedExtension to the basic transaction logic.
pub type SignedExtra = (
713
	RestrictFunctionality,
714
	system::CheckVersion<Runtime>,
715
	system::CheckGenesis<Runtime>,
716
717
718
	system::CheckEra<Runtime>,
	system::CheckNonce<Runtime>,
	system::CheckWeight<Runtime>,
719
	transaction_payment::ChargeTransactionPayment::<Runtime>,
720
721
	registrar::LimitParathreadCommits<Runtime>,
	parachains::ValidateDoubleVoteReports<Runtime>,
722
);
723
/// Unchecked extrinsic type as expected by this runtime.
724
pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;
725
/// Extrinsic type that has already been checked.
Gav Wood's avatar
Gav Wood committed
726
pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Nonce, Call>;
727
/// Executive: handles dispatch to the various modules.
728
pub type Executive = executive::Executive<Runtime, Block, system::ChainContext<Runtime>, Runtime, AllModules>;
729

730
731
sp_api::impl_runtime_apis! {
	impl sp_api::Core<Block> for Runtime {
732
733
734
735
736
737
738
		fn version() -> RuntimeVersion {
			VERSION
		}

		fn execute_block(block: Block) {
			Executive::execute_block(block)
		}
739

740
741
		fn initialize_block(header: &<Block as BlockT>::Header) {
			Executive::initialize_block(header)
742
743
		}
	}
Gav's avatar
Gav committed
744

745
	impl sp_api::Metadata<Block> for Runtime {
746
747
748
		fn metadata() -> OpaqueMetadata {
			Runtime::metadata().into()
		}
Gav's avatar
Gav committed
749
750
	}

751
	impl block_builder_api::BlockBuilder<Block> for Runtime {
752
		fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult {
753
754
755
			Executive::apply_extrinsic(extrinsic)
		}

756
757
		fn finalize_block() -> <Block as BlockT>::Header {
			Executive::finalize_block()
758
		}
759

Gavin Wood's avatar
Gavin Wood committed
760
		fn inherent_extrinsics(data: inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
761
			data.create_extrinsics()
762
		}
763

Gavin Wood's avatar
Gavin Wood committed
764
765
766
767
		fn check_inherents(
			block: Block,
			data: inherents::InherentData,
		) -> inherents::CheckInherentsResult {
768
			data.check_extrinsics(&block)
769
		}
770

771
		fn random_seed() -> <Block as BlockT>::Hash {
Ashley's avatar
Ashley committed
772
			RandomnessCollectiveFlip::random_seed()
773
		}
774
775
	}

776
	impl tx_pool_api::runtime_api::TaggedTransactionQueue<Block> for Runtime {
777
778
779
780
781
		fn validate_transaction(
			source: TransactionSource,
			tx: <Block as BlockT>::Extrinsic,
		) -> TransactionValidity {
			Executive::validate_transaction(source, tx)
782
		}
Gav's avatar
Gav committed
783
	}
784

785
	impl offchain_primitives::OffchainWorkerApi<Block> for Runtime {
786
787
		fn offchain_worker(header: &<Block as BlockT>::Header) {
			Executive::offchain_worker(header)
788
789
790
		}
	}

791
	impl parachain::ParachainHost<Block> for Runtime {
Gav Wood's avatar
Gav Wood committed
792
		fn validators() -> Vec<parachain::ValidatorId> {
793
			Parachains::authorities()
794
795
		}
		fn duty_roster() -> parachain::DutyRoster {
796
			Parachains::calculate_duty_roster().0
797
		}
798
799
		fn active_parachains() -> Vec<(parachain::Id, Option<(parachain::CollatorId, parachain::Retriable)>)> {
			Registrar::active_paras()
800
		}
801
802
803
804
805
		fn global_validation_schedule() -> parachain::GlobalValidationSchedule {
			Parachains::global_validation_schedule()
		}
		fn local_validation_data(id: parachain::Id) -> Option<parachain::LocalValidationData> {
			Parachains::local_validation_data(&id)
806
807
808
809
		}
		fn parachain_code(id: parachain::Id) -> Option<Vec<u8>> {
			Parachains::parachain_code(&id)
		}
810
811
812
		fn get_heads(extrinsics: Vec<<Block as BlockT>::Extrinsic>)
			-> Option<Vec<AbridgedCandidateReceipt>>
		{
813
814
815
816
817
818
819
820
821
822
823
824
			extrinsics
				.into_iter()
				.find_map(|ex| match UncheckedExtrinsic::decode(&mut ex.encode().as_slice()) {
					Ok(ex) => match ex.function {
						Call::Parachains(ParachainsCall::set_heads(heads)) => {
							Some(heads.into_iter().map(|c| c.candidate).collect())
						}
						_ => None,
					}
					Err(_) => None,
				})
		}
825
826
827
		fn signing_context() -> SigningContext {
			Parachains::signing_context()
		}
828
	}
829
830

	impl fg_primitives::GrandpaApi<Block> for Runtime {
831
		fn grandpa_authorities() -> Vec<(GrandpaId, u64)> {
832
833
834
835
			Grandpa::grandpa_authorities()
		}
	}

836
	impl babe_primitives::BabeApi<Block> for Runtime {
837
		fn configuration() -> babe_primitives::BabeConfiguration {
838
839
840
841
842
843
844
			// The choice of `c` parameter (where `1 - c` represents the
			// probability of a slot being empty), is done in accordance to the
			// slot duration and expected target block time, for safely
			// resisting network delays of maximum two seconds.
			// <https://research.web3.foundation/en/latest/polkadot/BABE/Babe/#6-practical-results>
			babe_primitives::BabeConfiguration {
				slot_duration: Babe::slot_duration(),
845
				epoch_length: EpochDuration::get(),
846
				c: PRIMARY_PROBABILITY,
847
				genesis_authorities: Babe::authorities(),
848
				randomness: Babe::randomness(),
849
				secondary_slots: true,
850
			}
851
		}
852
853
854
855

		fn current_epoch_start() -> babe_primitives::SlotNumber {
			Babe::current_epoch_start()
		}
856
857
	}

Gavin Wood's avatar
Gavin Wood committed
858
859
860
861
862
863
	impl authority_discovery_primitives::AuthorityDiscoveryApi<Block> for Runtime {
		fn authorities() -> Vec<AuthorityDiscoveryId> {
			AuthorityDiscovery::authorities()
		}
	}

Gavin Wood's avatar
Gavin Wood committed
864
	impl sp_session::SessionKeys<Block> for Runtime {
865
866
867
		fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {
			SessionKeys::generate(seed)
		}
Gavin Wood's avatar
Gavin Wood committed
868
869
870
871
872
873

		fn decode_session_keys(
			encoded: Vec<u8>,
		) -> Option<Vec<(Vec<u8>, sp_core::crypto::KeyTypeId)>> {
			SessionKeys::decode_into_raw_public_keys(&encoded)
		}
874
	}
875
876
877
878
879
880

	impl system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime {
		fn account_nonce(account: AccountId) -> Nonce {
			System::account_nonce(account)
		}
	}
Kian Paimani's avatar
Kian Paimani committed
881

882
	impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<
Kian Paimani's avatar
Kian Paimani committed
883
884
885
886
887
888
889
890
		Block,
		Balance,
		UncheckedExtrinsic,
	> for Runtime {
		fn query_info(uxt: UncheckedExtrinsic, len: u32) -> RuntimeDispatchInfo<Balance> {
			TransactionPayment::query_info(uxt, len)
		}
	}
891
892

	#[cfg(feature = "runtime-benchmarks")]
Gavin Wood's avatar
Gavin Wood committed
893
	impl frame_benchmarking::Benchmark<Block> for Runtime {
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
		fn dispatch_benchmark(
			module: Vec<u8>,
			extrinsic: Vec<u8>,
			lowest_range_values: Vec<u32>,
			highest_range_values: Vec<u32>,
			steps: Vec<u32>,
			repeat: u32,
		) -> Result<Vec<frame_benchmarking::BenchmarkResults>, RuntimeString> {
			use frame_benchmarking::Benchmarking;

			let result = match module.as_slice() {
				b"claims" => Claims::run_benchmark(
					extrinsic,
					lowest_range_values,
					highest_range_values,
					steps,