lib.rs 37 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 runtime_common::{attestations, claims, parachains, registrar, slots,
24
	impls::{CurrencyToVoteHandler, TargetedFeeAdjustment, ToAuthor},
25
	NegativeImbalance, BlockHashCount, MaximumBlockWeight, AvailableBlockRatio,
26
	MaximumBlockLength, BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight,
Gavin Wood's avatar
Gavin Wood committed
27
	MaximumExtrinsicWeight, TransactionCallFilter,
28
};
Gav Wood's avatar
Gav Wood committed
29

30
use sp_std::prelude::*;
31
use sp_core::u32_trait::{_1, _2, _3, _4, _5};
32
use codec::{Encode, Decode};
33
use primitives::{
34
	AccountId, AccountIndex, Balance, BlockNumber, Hash, Nonce, Signature, Moment,
Gavin Wood's avatar
Gavin Wood committed
35
	parachain::{self, ActiveParas, AbridgedCandidateReceipt, SigningContext},
36
};
37
use sp_runtime::{
38
	create_runtime_str, generic, impl_opaque_keys, ModuleId,
39
	ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, Perquintill, PerThing,
40
	transaction_validity::{
Gavin Wood's avatar
Gavin Wood committed
41
		TransactionValidity, TransactionSource, TransactionPriority,
42
	},
43
	curve::PiecewiseLinear,
44
	traits::{
Gavin Wood's avatar
Gavin Wood committed
45
46
		BlakeTwo256, Block as BlockT, OpaqueKeys, ConvertInto, IdentityLookup,
		Extrinsic as ExtrinsicT, SaturatedConversion, Verify,
47
	},
Gav Wood's avatar
Gav Wood committed
48
};
49
50
#[cfg(feature = "runtime-benchmarks")]
use sp_runtime::RuntimeString;
Arkadiy Paronyan's avatar
Arkadiy Paronyan committed
51
use version::RuntimeVersion;
52
use grandpa::{AuthorityId as GrandpaId, fg_primitives};
53
54
#[cfg(any(feature = "std", test))]
use version::NativeVersion;
55
56
use sp_core::OpaqueMetadata;
use sp_staking::SessionIndex;
57
use frame_support::{
58
	parameter_types, construct_runtime, debug,
Gavin Wood's avatar
Gavin Wood committed
59
	traits::{KeyOwnerProofSystem, SplitTwoWays, Randomness, LockIdentifier, Filter},
60
	weights::Weight,
Gavin Wood's avatar
Gavin Wood committed
61
};
thiolliere's avatar
thiolliere committed
62
use im_online::sr25519::AuthorityId as ImOnlineId;
Gavin Wood's avatar
Gavin Wood committed
63
use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId;
Gavin Wood's avatar
Gavin Wood committed
64
use transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;
65
use session::historical as session_historical;
66
use static_assertions::const_assert;
67

Gav Wood's avatar
Gav Wood committed
68
69
#[cfg(feature = "std")]
pub use staking::StakerStatus;
70
#[cfg(any(feature = "std", test))]
71
pub use sp_runtime::BuildStorage;
72
pub use timestamp::Call as TimestampCall;
73
pub use balances::Call as BalancesCall;
74
pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER};
75
pub use parachains::Call as ParachainsCall;
76
77
78

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

81
82
83
84
// Make the WASM binary available.
#[cfg(feature = "std")]
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));

85
// Polkadot version identifier;
86
/// Runtime version (Polkadot).
Arkadiy Paronyan's avatar
Arkadiy Paronyan committed
87
pub const VERSION: RuntimeVersion = RuntimeVersion {
88
89
	spec_name: create_runtime_str!("polkadot"),
	impl_name: create_runtime_str!("parity-polkadot"),
Gavin Wood's avatar
Gavin Wood committed
90
	authoring_version: 0,
91
	spec_version: 2,
92
93
	impl_version: 0,
	apis: RUNTIME_API_VERSIONS,
Gavin Wood's avatar
Gavin Wood committed
94
	transaction_version: 0,
95
};
Arkadiy Paronyan's avatar
Arkadiy Paronyan committed
96

97
98
99
100
101
102
103
104
105
/// Native version.
#[cfg(any(feature = "std", test))]
pub fn native_version() -> NativeVersion {
	NativeVersion {
		runtime_version: VERSION,
		can_author_with: Default::default(),
	}
}

Gavin Wood's avatar
Gavin Wood committed
106
107
108
pub struct IsCallable;
impl Filter<Call> for IsCallable {
	fn filter(call: &Call) -> bool {
109
		match call {
Gavin Wood's avatar
Gavin Wood committed
110
			Call::Parachains(parachains::Call::set_heads(..)) => true,
Gavin Wood's avatar
Gavin Wood committed
111

Gavin Wood's avatar
Gavin Wood committed
112
113
114
115
116
117
			// Governance stuff
			Call::Democracy(_) | Call::Council(_) | Call::TechnicalCommittee(_) |
			Call::ElectionsPhragmen(_) | Call::TechnicalMembership(_) | Call::Treasury(_) |
			// Parachains stuff
			Call::Parachains(_) | Call::Attestations(_) | Call::Slots(_) | Call::Registrar(_) |
			// Balances and Vesting's transfer (which can be used to transfer)
Gavin Wood's avatar
Gavin Wood committed
118
119
			Call::Balances(_) | Call::Vesting(vesting::Call::vested_transfer(..)) |
			Call::Indices(indices::Call::transfer(..)) =>
Gavin Wood's avatar
Gavin Wood committed
120
121
122
123
124
125
126
127
				false,

			// These modules are all allowed to be called by transactions:
			Call::System(_) | Call::Scheduler(_) | Call::Indices(_) |
			Call::Babe(_) | Call::Timestamp(_) |
			Call::Authorship(_) | Call::Staking(_) | Call::Offences(_) |
			Call::Session(_) | Call::FinalityTracker(_) | Call::Grandpa(_) | Call::ImOnline(_) |
			Call::AuthorityDiscovery(_) |
Gavin Wood's avatar
Gavin Wood committed
128
129
			Call::Utility(_) | Call::Claims(_) | Call::Vesting(_) | Call::Sudo(_) |
			Call::Identity(_) =>
Gavin Wood's avatar
Gavin Wood committed
130
				true,
131
132
133
134
		}
	}
}

135
parameter_types! {
136
	pub const Version: RuntimeVersion = VERSION;
137
138
}

139
140
impl system::Trait for Runtime {
	type Origin = Origin;
141
	type Call = Call;
Gav Wood's avatar
Gav Wood committed
142
	type Index = Nonce;
143
144
145
146
	type BlockNumber = BlockNumber;
	type Hash = Hash;
	type Hashing = BlakeTwo256;
	type AccountId = AccountId;
147
	type Lookup = IdentityLookup<AccountId>;
148
	type Header = generic::Header<BlockNumber, BlakeTwo256>;
Gav's avatar
Gav committed
149
	type Event = Event;
150
	type BlockHashCount = BlockHashCount;
151
	type MaximumBlockWeight = MaximumBlockWeight;
152
	type DbWeight = RocksDbWeight;
153
154
	type BlockExecutionWeight = BlockExecutionWeight;
	type ExtrinsicBaseWeight = ExtrinsicBaseWeight;
Tomasz Drwięga's avatar
Tomasz Drwięga committed
155
	type MaximumExtrinsicWeight = MaximumExtrinsicWeight;
156
157
	type MaximumBlockLength = MaximumBlockLength;
	type AvailableBlockRatio = AvailableBlockRatio;
158
	type Version = Version;
159
	type ModuleToIndex = ModuleToIndex;
160
	type AccountData = balances::AccountData<Balance>;
Gavin Wood's avatar
Gavin Wood committed
161
	type OnNewAccount = ();
162
	type OnKilledAccount = ();
163
164
}

Gavin Wood's avatar
Gavin Wood committed
165
166
167
168
169
170
171
impl scheduler::Trait for Runtime {
	type Event = Event;
	type Origin = Origin;
	type Call = Call;
	type MaximumWeight = MaximumBlockWeight;
}

172
parameter_types! {
173
	pub const EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64;
174
175
176
177
178
179
	pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK;
}

impl babe::Trait for Runtime {
	type EpochDuration = EpochDuration;
	type ExpectedBlockTime = ExpectedBlockTime;
180
181
182

	// session module is the trigger
	type EpochChangeTrigger = babe::ExternalTrigger;
183
184
}

Gavin Wood's avatar
Gavin Wood committed
185
parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
186
	pub const IndexDeposit: Balance = 10 * DOLLARS;
Gavin Wood's avatar
Gavin Wood committed
187
188
}

Gav Wood's avatar
Gav Wood committed
189
190
impl indices::Trait for Runtime {
	type AccountIndex = AccountIndex;
191
192
	type Currency = Balances;
	type Deposit = IndexDeposit;
Gav Wood's avatar
Gav Wood committed
193
194
195
	type Event = Event;
}

Gavin Wood's avatar
Gavin Wood committed
196
parameter_types! {
197
	pub const ExistentialDeposit: Balance = 100 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
198
199
200
201
202
}

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

208
impl balances::Trait for Runtime {
Gav's avatar
Gav committed
209
	type Balance = Balance;
210
	type DustRemoval = ();
Gavin Wood's avatar
Gavin Wood committed
211
	type Event = Event;
Gavin Wood's avatar
Gavin Wood committed
212
	type ExistentialDeposit = ExistentialDeposit;
213
	type AccountStore = System;
214
215
216
217
}

parameter_types! {
	pub const TransactionByteFee: Balance = 10 * MILLICENTS;
218
	pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25);
219
220
}

221
222
223
224
225
226
227
// for a sane configuration, this should always be less than `AvailableBlockRatio`.
const_assert!(
	TargetBlockFullness::get().deconstruct() <
	(AvailableBlockRatio::get().deconstruct() as <Perquintill as PerThing>::Inner)
		* (<Perquintill as PerThing>::ACCURACY / <Perbill as PerThing>::ACCURACY as <Perquintill as PerThing>::Inner)
);

228
229
230
impl transaction_payment::Trait for Runtime {
	type Currency = Balances;
	type OnTransactionPayment = DealWithFees;
Gavin Wood's avatar
Gavin Wood committed
231
	type TransactionByteFee = TransactionByteFee;
232
	type WeightToFee = WeightToFee;
233
	type FeeMultiplierUpdate = TargetedFeeAdjustment<TargetBlockFullness, Self>;
Gav's avatar
Gav committed
234
235
}

236
parameter_types! {
237
	pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
238
}
239
impl timestamp::Trait for Runtime {
240
	type Moment = u64;
241
	type OnTimestampSet = Babe;
242
	type MinimumPeriod = MinimumPeriod;
243
244
}

Gavin Wood's avatar
Gavin Wood committed
245
parameter_types! {
246
	pub const UncleGenerations: u32 = 0;
Gavin Wood's avatar
Gavin Wood committed
247
248
249
250
}

// TODO: substrate#2986 implement this properly
impl authorship::Trait for Runtime {
251
	type FindAuthor = session::FindAccountFromAuthorIndex<Self, Babe>;
Gavin Wood's avatar
Gavin Wood committed
252
253
	type UncleGenerations = UncleGenerations;
	type FilterUncle = ();
Gavin Wood's avatar
Gavin Wood committed
254
	type EventHandler = (Staking, ImOnline);
Gavin Wood's avatar
Gavin Wood committed
255
256
}

257
impl_opaque_keys! {
258
	pub struct SessionKeys {
Gavin Wood's avatar
Gavin Wood committed
259
260
261
262
		pub grandpa: Grandpa,
		pub babe: Babe,
		pub im_online: ImOnline,
		pub parachain_validator: Parachains,
Gavin Wood's avatar
Gavin Wood committed
263
		pub authority_discovery: AuthorityDiscovery,
264
	}
265
266
}

thiolliere's avatar
thiolliere committed
267
268
269
270
parameter_types! {
	pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17);
}

271
impl session::Trait for Runtime {
Gav's avatar
Gav committed
272
	type Event = Event;
273
274
	type ValidatorId = AccountId;
	type ValidatorIdOf = staking::StashOf<Self>;
Gavin Wood's avatar
Gavin Wood committed
275
	type ShouldEndSession = Babe;
276
	type NextSessionRotation = Babe;
277
	type SessionManager = session::historical::NoteHistoricalRoot<Self, Staking>;
Gavin Wood's avatar
Gavin Wood committed
278
279
	type SessionHandler = <SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
	type Keys = SessionKeys;
thiolliere's avatar
thiolliere committed
280
	type DisabledValidatorsThreshold = DisabledValidatorsThreshold;
281
282
283
284
}

impl session::historical::Trait for Runtime {
	type FullIdentification = staking::Exposure<AccountId, Balance>;
285
	type FullIdentificationOf = staking::ExposureOf<Runtime>;
286
287
}

288
pallet_staking_reward_curve::build! {
thiolliere's avatar
thiolliere committed
289
290
291
292
293
294
295
296
297
298
	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,
	);
}

299
parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
300
	// Six sessions in an era (24 hours).
301
	pub const SessionsPerEra: SessionIndex = 6;
Gavin Wood's avatar
Gavin Wood committed
302
	// 28 eras for unbonding (28 days).
Gavin Wood's avatar
Gavin Wood committed
303
304
	pub const BondingDuration: staking::EraIndex = 28;
	pub const SlashDeferDuration: staking::EraIndex = 28;
thiolliere's avatar
thiolliere committed
305
	pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
Gavin Wood's avatar
Gavin Wood committed
306
	pub const MaxNominatorRewardedPerValidator: u32 = 64;
307
	// quarter of the last session will be for election.
Gavin Wood's avatar
Gavin Wood committed
308
	pub const ElectionLookahead: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 16;
309
310
	pub const MaxIterations: u32 = 10;
	pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000);
311
}
312

313
impl staking::Trait for Runtime {
Gavin Wood's avatar
Gavin Wood committed
314
	type Currency = Balances;
315
	type UnixTime = Timestamp;
316
	type CurrencyToVote = CurrencyToVoteHandler<Self>;
Gavin Wood's avatar
Gavin Wood committed
317
	type RewardRemainder = Treasury;
Gav's avatar
Gav committed
318
	type Event = Event;
319
	type Slash = Treasury;
320
	type Reward = ();
321
322
	type SessionsPerEra = SessionsPerEra;
	type BondingDuration = BondingDuration;
Gavin Wood's avatar
Gavin Wood committed
323
324
	type SlashDeferDuration = SlashDeferDuration;
	// A super-majority of the council can cancel the slash.
Gavin Wood's avatar
Gavin Wood committed
325
	type SlashCancelOrigin = collective::EnsureProportionAtLeast<_3, _4, AccountId, CouncilCollective>;
326
	type SessionInterface = Self;
thiolliere's avatar
thiolliere committed
327
	type RewardCurve = RewardCurve;
Gavin Wood's avatar
Gavin Wood committed
328
	type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator;
329
330
331
	type NextNewSession = Session;
	type ElectionLookahead = ElectionLookahead;
	type Call = Call;
332
	type UnsignedPriority = StakingUnsignedPriority;
333
	type MaxIterations = MaxIterations;
334
	type MinSolutionScoreBump = MinSolutionScoreBump;
335
336
}

Gavin Wood's avatar
Gavin Wood committed
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
const fn deposit(items: u32, bytes: u32) -> Balance {
	items as Balance * 15 * CENTS + (bytes as Balance) * 6 * CENTS
}

parameter_types! {
	// Minimum 4 CENTS/byte
	pub const BasicDeposit: Balance = deposit(1, 258);
	pub const FieldDeposit: Balance = deposit(0, 66);
	pub const SubAccountDeposit: Balance = deposit(1, 53);
	pub const MaxSubAccounts: u32 = 100;
	pub const MaxAdditionalFields: u32 = 100;
	pub const MaxRegistrars: u32 = 20;
}

impl identity::Trait for Runtime {
	type Event = Event;
	type Currency = Balances;
	type BasicDeposit = BasicDeposit;
	type FieldDeposit = FieldDeposit;
	type SubAccountDeposit = SubAccountDeposit;
	type MaxSubAccounts = MaxSubAccounts;
	type MaxAdditionalFields = MaxAdditionalFields;
	type MaxRegistrars = MaxRegistrars;
	type Slashed = Treasury;
	type ForceOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
	type RegistrarOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
}

365
parameter_types! {
366
367
	pub const LaunchPeriod: BlockNumber = 28 * DAYS;
	pub const VotingPeriod: BlockNumber = 28 * DAYS;
368
	pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS;
369
	pub const MinimumDeposit: Balance = 100 * DOLLARS;
370
371
	pub const EnactmentPeriod: BlockNumber = 8 * DAYS;
	pub const CooloffPeriod: BlockNumber = 7 * DAYS;
Gavin Wood's avatar
Gavin Wood committed
372
373
	// One cent: $10,000 / MB
	pub const PreimageByteDeposit: Balance = 1 * CENTS;
Gavin Wood's avatar
Gavin Wood committed
374
	pub const InstantAllowed: bool = true;
375
	pub const MaxVotes: u32 = 100;
376
377
}

378
379
380
impl democracy::Trait for Runtime {
	type Proposal = Call;
	type Event = Event;
381
	type Currency = Balances;
382
383
384
385
	type EnactmentPeriod = EnactmentPeriod;
	type LaunchPeriod = LaunchPeriod;
	type VotingPeriod = VotingPeriod;
	type MinimumDeposit = MinimumDeposit;
386
387
	/// A straight majority of the council can decide what their next motion is.
	type ExternalOrigin = collective::EnsureProportionAtLeast<_1, _2, AccountId, CouncilCollective>;
388
389
	/// A 60% super-majority can have the next scheduled referendum be a straight majority-carries vote.
	type ExternalMajorityOrigin = collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective>;
390
391
392
393
394
395
	/// 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>;
396
397
398
	type InstantOrigin = collective::EnsureProportionAtLeast<_1, _1, AccountId, TechnicalCollective>;
	type InstantAllowed = InstantAllowed;
	type FastTrackVotingPeriod = FastTrackVotingPeriod;
399
400
401
402
403
	// 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>;
404
	type CooloffPeriod = CooloffPeriod;
Gavin Wood's avatar
Gavin Wood committed
405
	type PreimageByteDeposit = PreimageByteDeposit;
Gavin Wood's avatar
Gavin Wood committed
406
	type OperationalPreimageOrigin = collective::EnsureMember<AccountId, CouncilCollective>;
Gavin Wood's avatar
Gavin Wood committed
407
	type Slash = Treasury;
Gavin Wood's avatar
Gavin Wood committed
408
	type Scheduler = Scheduler;
409
	type MaxVotes = MaxVotes;
410
}
411

412
413
parameter_types! {
	pub const CouncilMotionDuration: BlockNumber = 7 * DAYS;
414
	pub const CouncilMaxProposals: u32 = 100;
415
416
}

417
418
type CouncilCollective = collective::Instance1;
impl collective::Trait<CouncilCollective> for Runtime {
419
420
421
	type Origin = Origin;
	type Proposal = Call;
	type Event = Event;
422
	type MotionDuration = CouncilMotionDuration;
423
	type MaxProposals = CouncilMaxProposals;
424
425
}

Gavin Wood's avatar
Gavin Wood committed
426
parameter_types! {
427
428
	pub const CandidacyBond: Balance = 100 * DOLLARS;
	pub const VotingBond: Balance = 5 * DOLLARS;
429
430
431
	/// Weekly council elections initially, later monthly.
	pub const TermDuration: BlockNumber = 7 * DAYS;
	/// 13 members initially, to be increased to 23 eventually.
432
	pub const DesiredMembers: u32 = 13;
433
	pub const DesiredRunnersUp: u32 = 20;
434
	pub const ElectionsPhragmenModuleId: LockIdentifier = *b"phrelect";
435
}
436
// Make sure that there are no more than MAX_MEMBERS members elected via phragmen.
437
const_assert!(DesiredMembers::get() <= collective::MAX_MEMBERS);
438
439

impl elections_phragmen::Trait for Runtime {
440
	type Event = Event;
Gavin Wood's avatar
Gavin Wood committed
441
	type ModuleId = ElectionsPhragmenModuleId;
442
443
	type Currency = Balances;
	type ChangeMembers = Council;
444
	type InitializeMembers = Council;
445
	type CurrencyToVote = CurrencyToVoteHandler<Self>;
Gavin Wood's avatar
Gavin Wood committed
446
447
	type CandidacyBond = CandidacyBond;
	type VotingBond = VotingBond;
448
449
450
	type LoserCandidate = Treasury;
	type BadReport = Treasury;
	type KickedMember = Treasury;
Gavin Wood's avatar
Gavin Wood committed
451
452
453
	type DesiredMembers = DesiredMembers;
	type DesiredRunnersUp = DesiredRunnersUp;
	type TermDuration = TermDuration;
454
455
}

456
457
parameter_types! {
	pub const TechnicalMotionDuration: BlockNumber = 7 * DAYS;
458
	pub const TechnicalMaxProposals: u32 = 100;
459
460
}

461
462
type TechnicalCollective = collective::Instance2;
impl collective::Trait<TechnicalCollective> for Runtime {
463
464
465
	type Origin = Origin;
	type Proposal = Call;
	type Event = Event;
466
	type MotionDuration = TechnicalMotionDuration;
467
	type MaxProposals = TechnicalMaxProposals;
468
469
}

470
471
472
473
474
475
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>;
476
	type PrimeOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
477
478
479
480
	type MembershipInitialized = TechnicalCommittee;
	type MembershipChanged = TechnicalCommittee;
}

Gavin Wood's avatar
Gavin Wood committed
481
482
parameter_types! {
	pub const ProposalBond: Permill = Permill::from_percent(5);
483
484
485
	pub const ProposalBondMinimum: Balance = 100 * DOLLARS;
	pub const SpendPeriod: BlockNumber = 24 * DAYS;
	pub const Burn: Permill = Permill::from_percent(1);
486
	pub const TreasuryModuleId: ModuleId = ModuleId(*b"py/trsry");
Gavin Wood's avatar
Gavin Wood committed
487
488
489
490
491

	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
492
493
}

494
impl treasury::Trait for Runtime {
Gavin Wood's avatar
Gavin Wood committed
495
	type ModuleId = TreasuryModuleId;
Gavin Wood's avatar
Gavin Wood committed
496
	type Currency = Balances;
497
	type ApproveOrigin = collective::EnsureProportionAtLeast<_3, _5, AccountId, CouncilCollective>;
498
	type RejectOrigin = collective::EnsureProportionMoreThan<_1, _2, AccountId, CouncilCollective>;
Gavin Wood's avatar
Gavin Wood committed
499
500
501
502
503
	type Tippers = ElectionsPhragmen;
	type TipCountdown = TipCountdown;
	type TipFindersFee = TipFindersFee;
	type TipReportDepositBase = TipReportDepositBase;
	type TipReportDepositPerByte = TipReportDepositPerByte;
504
	type Event = Event;
505
	type ProposalRejection = Treasury;
Gavin Wood's avatar
Gavin Wood committed
506
507
508
509
	type ProposalBond = ProposalBond;
	type ProposalBondMinimum = ProposalBondMinimum;
	type SpendPeriod = SpendPeriod;
	type Burn = Burn;
510
}
511

512
parameter_types! {
513
	pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get();
514
515
}

516
517
518
519
impl offences::Trait for Runtime {
	type Event = Event;
	type IdentificationTuple = session::historical::IdentificationTuple<Self>;
	type OnOffenceHandler = Staking;
520
	type WeightSoftLimit = OffencesWeightSoftLimit;
521
522
}

Gavin Wood's avatar
Gavin Wood committed
523
524
impl authority_discovery::Trait for Runtime {}

525
526
527
528
parameter_types! {
	pub const SessionDuration: BlockNumber = EPOCH_DURATION_IN_BLOCKS as _;
}

529
530
531
532
533
parameter_types! {
	pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2;
	pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
}

534
impl im_online::Trait for Runtime {
thiolliere's avatar
thiolliere committed
535
	type AuthorityId = ImOnlineId;
536
	type Event = Event;
537
	type SessionDuration = SessionDuration;
Gavin Wood's avatar
Gavin Wood committed
538
	type ReportUnresponsiveness = Offences;
539
	type UnsignedPriority = ImOnlineUnsignedPriority;
540
541
}

542
543
impl grandpa::Trait for Runtime {
	type Event = Event;
544
545
546
547
548
549
550
551
552
553
	type Call = Call;

	type KeyOwnerProof =
		<Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, GrandpaId)>>::Proof;

	type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
		KeyTypeId,
		GrandpaId,
	)>>::IdentificationTuple;

Gavin Wood's avatar
Gavin Wood committed
554
555
	type KeyOwnerProofSystem = Historical;

556
557
558
559
560
561
	type HandleEquivocation = grandpa::EquivocationHandler<
		Self::KeyOwnerIdentification,
		primitives::fisherman::FishermanAppCrypto,
		Runtime,
		Offences,
	>;
562
563
}

Gavin Wood's avatar
Gavin Wood committed
564
parameter_types! {
565
566
	pub WindowSize: BlockNumber = finality_tracker::DEFAULT_WINDOW_SIZE.into();
	pub ReportLatency: BlockNumber = finality_tracker::DEFAULT_REPORT_LATENCY.into();
Gavin Wood's avatar
Gavin Wood committed
567
568
569
}

impl finality_tracker::Trait for Runtime {
570
	type OnFinalizationStalled = ();
Gavin Wood's avatar
Gavin Wood committed
571
572
573
574
	type WindowSize = WindowSize;
	type ReportLatency = ReportLatency;
}

575
576
577
578
parameter_types! {
	pub const AttestationPeriod: BlockNumber = 50;
}

579
580
581
impl attestations::Trait for Runtime {
	type AttestationPeriod = AttestationPeriod;
	type ValidatorIdentities = parachains::ValidatorIdentities<Runtime>;
582
	type RewardAttestation = Staking;
583
584
}

585
586
587
parameter_types! {
	pub const MaxCodeSize: u32 = 10 * 1024 * 1024; // 10 MB
	pub const MaxHeadDataSize: u32 = 20 * 1024; // 20 KB
588
589
590
591

	pub const ValidationUpgradeFrequency: BlockNumber = 7 * DAYS;
	pub const ValidationUpgradeDelay: BlockNumber = 1 * DAYS;
	pub const SlashPeriod: BlockNumber = 28 * DAYS;
592
593
}

594
impl parachains::Trait for Runtime {
595
	type AuthorityId = primitives::fisherman::FishermanAppCrypto;
596
597
	type Origin = Origin;
	type Call = Call;
598
	type ParachainCurrency = Balances;
599
	type BlockNumberConversion = sp_runtime::traits::Identity;
600
	type Randomness = RandomnessCollectiveFlip;
601
602
	type ActiveParachains = Registrar;
	type Registrar = Registrar;
603
604
	type MaxCodeSize = MaxCodeSize;
	type MaxHeadDataSize = MaxHeadDataSize;
605
606
607
608
609

	type ValidationUpgradeFrequency = ValidationUpgradeFrequency;
	type ValidationUpgradeDelay = ValidationUpgradeDelay;
	type SlashPeriod = SlashPeriod;

610
	type Proof = sp_session::MembershipProof;
611
612
613
	type KeyOwnerProofSystem = session::historical::Module<Self>;
	type IdentificationTuple = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, Vec<u8>)>>::IdentificationTuple;
	type ReportOffence = Offences;
614
	type BlockHashConversion = sp_runtime::traits::Identity;
615
616
}

617
618
/// Submits a transaction with the node's public and signature type. Adheres to the signed extension
/// format of the chain.
619
620
621
622
623
624
625
impl<LocalCall> system::offchain::CreateSignedTransaction<LocalCall> for Runtime where
	Call: From<LocalCall>,
{
	fn create_transaction<C: system::offchain::AppCrypto<Self::Public, Self::Signature>>(
		call: Call,
		public: <Signature as Verify>::Signer,
		account: AccountId,
626
627
		nonce: <Runtime as system::Trait>::Index,
	) -> Option<(Call, <UncheckedExtrinsic as ExtrinsicT>::SignaturePayload)> {
628
		// take the biggest period possible.
629
630
631
632
633
634
635
		let period = BlockHashCount::get()
			.checked_next_power_of_two()
			.map(|c| c / 2)
			.unwrap_or(2) as u64;

		let current_block = System::block_number()
			.saturated_into::<u64>()
636
637
			// The `System::block_number` is initialized with `n+1`,
			// so the actual block number is `n`.
638
639
640
			.saturating_sub(1);
		let tip = 0;
		let extra: SignedExtra = (
Gavin Wood's avatar
Gavin Wood committed
641
			TransactionCallFilter::<IsCallable, Call>::new(),
642
643
			system::CheckSpecVersion::<Runtime>::new(),
			system::CheckTxVersion::<Runtime>::new(),
644
645
646
647
648
649
650
			system::CheckGenesis::<Runtime>::new(),
			system::CheckEra::<Runtime>::from(generic::Era::mortal(period, current_block)),
			system::CheckNonce::<Runtime>::from(nonce),
			system::CheckWeight::<Runtime>::new(),
			transaction_payment::ChargeTransactionPayment::<Runtime>::from(tip),
			registrar::LimitParathreadCommits::<Runtime>::new(),
			parachains::ValidateDoubleVoteReports::<Runtime>::new(),
651
			grandpa::ValidateEquivocationReport::<Runtime>::new(),
652
			claims::PrevalidateAttests::<Runtime>::new(),
653
654
		);
		let raw_payload = SignedPayload::new(call, extra).map_err(|e| {
655
			debug::warn!("Unable to create signed payload: {:?}", e);
656
		}).ok()?;
657
658
659
		let signature = raw_payload.using_encoded(|payload| {
			C::sign(payload, public)
		})?;
660
661
662
		let (call, extra, _) = raw_payload.deconstruct();
		Some((call, (account, signature, extra)))
	}
663
664
}

665
666
667
668
669
impl system::offchain::SigningTypes for Runtime {
	type Public = <Signature as Verify>::Signer;
	type Signature = Signature;
}

Gavin Wood's avatar
Gavin Wood committed
670
impl<C> system::offchain::SendTransactionTypes<C> for Runtime where Call: From<C> {
671
	type Extrinsic = UncheckedExtrinsic;
Gavin Wood's avatar
Gavin Wood committed
672
	type OverarchingCall = Call;
673
674
}

675
676
677
678
679
680
681
682
683
684
685
686
687
688
parameter_types! {
	pub const ParathreadDeposit: Balance = 500 * DOLLARS;
	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;
689
}
690

Gavin Wood's avatar
Gavin Wood committed
691
parameter_types! {
692
	pub const LeasePeriod: BlockNumber = 100_000;
Gavin Wood's avatar
Gavin Wood committed
693
694
695
696
697
	pub const EndingPeriod: BlockNumber = 1000;
}

impl slots::Trait for Runtime {
	type Event = Event;
698
699
	type Currency = Balances;
	type Parachains = Registrar;
Gavin Wood's avatar
Gavin Wood committed
700
	type EndingPeriod = EndingPeriod;
Gavin Wood's avatar
Gavin Wood committed
701
	type LeasePeriod = LeasePeriod;
702
	type Randomness = RandomnessCollectiveFlip;
Gavin Wood's avatar
Gavin Wood committed
703
704
}

Gavin Wood's avatar
Gavin Wood committed
705
parameter_types! {
706
	pub Prefix: &'static [u8] = b"Pay DOTs to the Polkadot account:";
707
708
709
710
}

impl claims::Trait for Runtime {
	type Event = Event;
Gavin Wood's avatar
Gavin Wood committed
711
	type VestingSchedule = Vesting;
712
713
714
	type Prefix = Prefix;
}

715
716
717
718
parameter_types! {
	pub const MinVestedTransfer: Balance = 100 * DOLLARS;
}

Gavin Wood's avatar
Gavin Wood committed
719
720
721
722
impl vesting::Trait for Runtime {
	type Event = Event;
	type Currency = Balances;
	type BlockNumberToBalance = ConvertInto;
723
	type MinVestedTransfer = MinVestedTransfer;
Gavin Wood's avatar
Gavin Wood committed
724
725
}

Gavin Wood's avatar
Gavin Wood committed
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
parameter_types! {
	// One storage item; value is size 4+4+16+32 bytes = 56 bytes.
	pub const MultisigDepositBase: Balance = 30 * CENTS;
	// Additional storage item size of 32 bytes.
	pub const MultisigDepositFactor: Balance = 5 * CENTS;
	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;
	type IsCallable = IsCallable;
}

744
745
impl sudo::Trait for Runtime {
	type Event = Event;
746
	type Call = Call;
747
748
}

Gavin Wood's avatar
Gavin Wood committed
749
construct_runtime! {
750
	pub enum Runtime where
751
		Block = Block,
752
		NodeBlock = primitives::Block,
753
		UncheckedExtrinsic = UncheckedExtrinsic
754
	{
755
		// Basic stuff; balances is uncallable initially.
Gavin Wood's avatar
Gavin Wood committed
756
		System: system::{Module, Call, Storage, Config, Event<T>},
Ashley's avatar
Ashley committed
757
		RandomnessCollectiveFlip: randomness_collective_flip::{Module, Storage},
Gavin Wood's avatar
Gavin Wood committed
758
		Scheduler: scheduler::{Module, Call, Storage, Event<T>},
759
760

		// Must be before session.
761
		Babe: babe::{Module, Call, Storage, Config, Inherent(Timestamp)},
762
763

		Timestamp: timestamp::{Module, Call, Storage, Inherent},
764
		Indices: indices::{Module, Call, Storage, Config<T>, Event<T>},
765
		Balances: balances::{Module, Call, Storage, Config<T>, Event<T>},
766
		TransactionPayment: transaction_payment::{Module, Storage},
767
768
769

		// Consensus support.
		Authorship: authorship::{Module, Call, Storage},
Kian Paimani's avatar
Kian Paimani committed
770
		Staking: staking::{Module, Call, Storage, Config<T>, Event<T>, ValidateUnsigned},
771
		Offences: offences::{Module, Call, Storage, Event},
772
		Historical: session_historical::{Module},
773
		Session: session::{Module, Call, Storage, Event, Config<T>},
774
		FinalityTracker: finality_tracker::{Module, Call, Storage, Inherent},
775
		Grandpa: grandpa::{Module, Call, Storage, Config, Event},
thiolliere's avatar
thiolliere committed
776
		ImOnline: im_online::{Module, Call, Storage, Event<T>, ValidateUnsigned, Config<T>},
Gavin Wood's avatar
Gavin Wood committed
777
		AuthorityDiscovery: authority_discovery::{Module, Call, Config},
778

Gavin Wood's avatar
Gavin Wood committed
779
780
		// Governance stuff; uncallable initially. Calls should be uncommented once we're ready to
		// enable governance.
Gavin Wood's avatar
Gavin Wood committed
781
		Democracy: democracy::{Module, Call, Storage, Config, Event<T>},
782
783
		Council: collective::<Instance1>::{Module, Call, Storage, Origin<T>, Event<T>, Config<T>},
		TechnicalCommittee: collective::<Instance2>::{Module, Call, Storage, Origin<T>, Event<T>, Config<T>},
784
		ElectionsPhragmen: elections_phragmen::{Module, Call, Storage, Event<T>, Config<T>},
785
		TechnicalMembership: membership::<Instance1>::{Module, Call, Storage, Event<T>, Config<T>},
Gavin Wood's avatar
Gavin Wood committed
786
		Treasury: treasury::{Module, Call, Storage, Event<T>},
787
788

		// Parachains stuff; slots are disabled (no auctions initially). The rest are safe as they
Gavin Wood's avatar
Gavin Wood committed
789
790
		// have no public dispatchables. Disabled `Call` on all of them, but this should be
		// uncommented once we're ready to start parachains.
791
		Parachains: parachains::{Module, Call, Storage, Config, Inherent, Origin},
792
		Attestations: attestations::{Module, Call, Storage},
Gavin Wood's avatar
Gavin Wood committed
793
		Slots: slots::{Module, Call, Storage, Event<T>},
794
		Registrar: registrar::{Module, Call, Storage, Event, Config<T>},
Gavin Wood's avatar
Gavin Wood committed
795
796
797
798
799

		// Claims. Usable initially.
		Claims: claims::{Module, Call, Storage, Event<T>, Config<T>, ValidateUnsigned},
		// Vesting. Usable initially, but removed once all vesting is finished.
		Vesting: vesting::{Module, Call, Storage, Event<T>, Config<T>},
Gavin Wood's avatar
Gavin Wood committed
800
801
		// Cunning utilities. Usable initially.
		Utility: utility::{Module, Call, Storage, Event<T>},
Gavin Wood's avatar
Gavin Wood committed
802
803

		// Sudo. Last module. Usable initially, but removed once governance enabled.
804
		Sudo: sudo::{Module, Call, Storage, Config<T>, Event<T>},
Gavin Wood's avatar
Gavin Wood committed
805
806
807

		// Identity. Late addition.
		Identity: identity::{Module, Call, Storage, Event<T>},
Gav's avatar
Gav committed
808
	}
Gavin Wood's avatar
Gavin Wood committed
809
}
810
811

/// The address format for describing accounts.
812
pub type Address = AccountId;
813
/// Block header type as expected by this runtime.
814
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
815
816
817
818
819
820
/// 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>;
821
822
/// The SignedExtension to the basic transaction logic.
pub type SignedExtra = (
Gavin Wood's avatar
Gavin Wood committed
823
	TransactionCallFilter<IsCallable, Call>,
824
825
	system::CheckSpecVersion<Runtime>,
	system::CheckTxVersion<Runtime>,
826
	system::CheckGenesis<Runtime>,
827
828
829
	system::CheckEra<Runtime>,
	system::CheckNonce<Runtime>,
	system::CheckWeight<Runtime>,
830
	transaction_payment::ChargeTransactionPayment<Runtime>,
831
	registrar::LimitParathreadCommits<Runtime>,
832
833
	parachains::ValidateDoubleVoteReports<Runtime>,
	grandpa::ValidateEquivocationReport<Runtime>,
834
	claims::PrevalidateAttests<Runtime>,
835
);
836
/// Unchecked extrinsic type as expected by this runtime.
837
pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;
838
/// Extrinsic type that has already been checked.
Gav Wood's avatar
Gav Wood committed
839
pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Nonce, Call>;
840
/// Executive: handles dispatch to the various modules.
841
pub type Executive = executive::Executive<Runtime, Block, system::ChainContext<Runtime>, Runtime, AllModules>;
842
843
/// The payload being signed in transactions.
pub type SignedPayload = generic::SignedPayload<Call, SignedExtra>;
844