lib.rs 51.3 KB
Newer Older
ddorgan's avatar
ddorgan committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Copyright 2017-2020 Parity Technologies (UK) Ltd.
// 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/>.

//! The Polkadot runtime. This can be compiled with `#[no_std]`, ready for Wasm.

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

Albrecht's avatar
Albrecht committed
23
use pallet_transaction_payment::CurrencyAdapter;
24
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
25
use primitives::v1::{
26
	AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt,
27
28
29
	CoreState, GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, InboundHrmpMessage,
	Moment, Nonce, OccupiedCoreAssumption, PersistedValidationData, SessionInfo, Signature,
	ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex,
ddorgan's avatar
ddorgan committed
30
};
31
use runtime_common::{
32
33
34
35
36
37
38
39
40
41
42
43
44
	auctions, crowdloan, impls::ToAuthor, paras_registrar, paras_sudo_wrapper, slots, xcm_sender,
	BlockHashCount, BlockLength, BlockWeights, CurrencyToVote, OffchainSolutionLengthLimit,
	OffchainSolutionWeightLimit, RocksDbWeight, SlowAdjustingFeeUpdate,
};
use sp_std::{collections::btree_map::BTreeMap, prelude::*};

use runtime_parachains::{
	configuration as parachains_configuration, dmp as parachains_dmp, hrmp as parachains_hrmp,
	inclusion as parachains_inclusion, initializer as parachains_initializer,
	origin as parachains_origin, paras as parachains_paras,
	paras_inherent as parachains_paras_inherent, reward_points as parachains_reward_points,
	runtime_api_impl::v1 as parachains_runtime_api_impl, scheduler as parachains_scheduler,
	session_info as parachains_session_info, shared as parachains_shared, ump as parachains_ump,
ddorgan's avatar
ddorgan committed
45
};
46

Gavin Wood's avatar
Gavin Wood committed
47
use xcm::latest::prelude::*;
48
use xcm_builder::{
49
50
51
52
53
	AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom,
	ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser,
	CurrencyAdapter as XcmCurrencyAdapter, FixedWeightBounds, IsChildSystemParachain, IsConcrete,
	LocationInverter, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation,
	TakeWeightCredit, UsingComponents,
54
};
55
use xcm_executor::XcmExecutor;
56

57
58
59
60
use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId;
use beefy_primitives::crypto::AuthorityId as BeefyId;
use frame_support::{
	construct_runtime, parameter_types,
61
62
63
	traits::{
		Contains, Everything, InstanceFilter, KeyOwnerProofSystem, Nothing, OnRuntimeUpgrade,
	},
64
65
66
67
68
69
70
71
72
73
	weights::Weight,
	PalletId, RuntimeDebug,
};
use frame_system::EnsureRoot;
use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId};
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
use pallet_mmr_primitives as mmr;
use pallet_session::historical as session_historical;
use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo};
use sp_core::OpaqueMetadata;
ddorgan's avatar
ddorgan committed
74
use sp_runtime::{
75
76
77
	create_runtime_str,
	curve::PiecewiseLinear,
	generic, impl_opaque_keys,
ddorgan's avatar
ddorgan committed
78
	traits::{
79
80
		AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto, Extrinsic as ExtrinsicT,
		OpaqueKeys, SaturatedConversion, Verify,
ddorgan's avatar
ddorgan committed
81
	},
82
83
	transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity},
	ApplyExtrinsicResult, KeyTypeId, Perbill,
ddorgan's avatar
ddorgan committed
84
};
85
use sp_staking::SessionIndex;
ddorgan's avatar
ddorgan committed
86
#[cfg(any(feature = "std", test))]
87
use sp_version::NativeVersion;
88
use sp_version::RuntimeVersion;
ddorgan's avatar
ddorgan committed
89

90
91
pub use pallet_balances::Call as BalancesCall;
pub use pallet_election_provider_multi_phase::Call as EPMCall;
ddorgan's avatar
ddorgan committed
92
#[cfg(feature = "std")]
93
pub use pallet_staking::StakerStatus;
94
pub use pallet_timestamp::Call as TimestampCall;
ddorgan's avatar
ddorgan committed
95
96
97
98
99
#[cfg(any(feature = "std", test))]
pub use sp_runtime::BuildStorage;

/// Constant values used within the runtime.
pub mod constants;
100
use constants::{currency::*, fee::*, time::*};
ddorgan's avatar
ddorgan committed
101

102
103
104
// Weights used in the runtime
mod weights;

105
106
107
#[cfg(test)]
mod tests;

ddorgan's avatar
ddorgan committed
108
109
110
111
// Make the WASM binary available.
#[cfg(feature = "std")]
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));

112
/// Runtime version (Westend).
ddorgan's avatar
ddorgan committed
113
114
115
116
pub const VERSION: RuntimeVersion = RuntimeVersion {
	spec_name: create_runtime_str!("westend"),
	impl_name: create_runtime_str!("parity-westend"),
	authoring_version: 2,
117
	spec_version: 9100,
118
	impl_version: 0,
119
	#[cfg(not(feature = "disable-runtime-api"))]
ddorgan's avatar
ddorgan committed
120
	apis: RUNTIME_API_VERSIONS,
121
	#[cfg(feature = "disable-runtime-api")]
122
	apis: version::create_apis_vec![[]],
123
	transaction_version: 5,
ddorgan's avatar
ddorgan committed
124
125
};

126
127
128
129
/// The BABE epoch configuration at genesis.
pub const BABE_GENESIS_EPOCH_CONFIG: babe_primitives::BabeEpochConfiguration =
	babe_primitives::BabeEpochConfiguration {
		c: PRIMARY_PROBABILITY,
130
		allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryVRFSlots,
131
132
	};

ddorgan's avatar
ddorgan committed
133
134
135
/// Native version.
#[cfg(any(feature = "std", test))]
pub fn native_version() -> NativeVersion {
136
	NativeVersion { runtime_version: VERSION, can_author_with: Default::default() }
ddorgan's avatar
ddorgan committed
137
138
}

139
/// Allow everything.
140
pub struct BaseFilter;
141
142
impl Contains<Call> for BaseFilter {
	fn contains(_: &Call) -> bool {
143
		true
ddorgan's avatar
ddorgan committed
144
145
146
147
148
	}
}

parameter_types! {
	pub const Version: RuntimeVersion = VERSION;
149
	pub const SS58Prefix: u8 = 42;
ddorgan's avatar
ddorgan committed
150
151
}

152
impl frame_system::Config for Runtime {
153
	type BaseCallFilter = BaseFilter;
154
155
	type BlockWeights = BlockWeights;
	type BlockLength = BlockLength;
ddorgan's avatar
ddorgan committed
156
157
158
159
160
161
162
	type Origin = Origin;
	type Call = Call;
	type Index = Nonce;
	type BlockNumber = BlockNumber;
	type Hash = Hash;
	type Hashing = BlakeTwo256;
	type AccountId = AccountId;
163
	type Lookup = AccountIdLookup<AccountId, ()>;
ddorgan's avatar
ddorgan committed
164
165
166
	type Header = generic::Header<BlockNumber, BlakeTwo256>;
	type Event = Event;
	type BlockHashCount = BlockHashCount;
167
	type DbWeight = RocksDbWeight;
ddorgan's avatar
ddorgan committed
168
	type Version = Version;
169
	type PalletInfo = PalletInfo;
170
	type AccountData = pallet_balances::AccountData<Balance>;
ddorgan's avatar
ddorgan committed
171
172
	type OnNewAccount = ();
	type OnKilledAccount = ();
173
	type SystemWeightInfo = weights::frame_system::WeightInfo<Runtime>;
174
	type SS58Prefix = SS58Prefix;
175
	type OnSetCode = ();
ddorgan's avatar
ddorgan committed
176
177
}

178
parameter_types! {
179
180
	pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) *
		BlockWeights::get().max_block;
181
182
183
	pub const MaxScheduledPerBlock: u32 = 50;
}

184
impl pallet_scheduler::Config for Runtime {
ddorgan's avatar
ddorgan committed
185
186
	type Event = Event;
	type Origin = Origin;
187
	type PalletsOrigin = OriginCaller;
ddorgan's avatar
ddorgan committed
188
	type Call = Call;
189
	type MaximumWeight = MaximumSchedulerWeight;
190
	type ScheduleOrigin = EnsureRoot<AccountId>;
191
	type MaxScheduledPerBlock = MaxScheduledPerBlock;
192
	type WeightInfo = weights::pallet_scheduler::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
193
194
195
}

parameter_types! {
196
	pub const EpochDuration: u64 = EPOCH_DURATION_IN_SLOTS as u64;
ddorgan's avatar
ddorgan committed
197
	pub const ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK;
198
199
	pub const ReportLongevity: u64 =
		BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get();
ddorgan's avatar
ddorgan committed
200
201
}

202
impl pallet_babe::Config for Runtime {
ddorgan's avatar
ddorgan committed
203
204
205
206
	type EpochDuration = EpochDuration;
	type ExpectedBlockTime = ExpectedBlockTime;

	// session module is the trigger
207
	type EpochChangeTrigger = pallet_babe::ExternalTrigger;
208

209
210
	type DisabledValidators = Session;

211
212
213
214
	type KeyOwnerProofSystem = Historical;

	type KeyOwnerProof = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
		KeyTypeId,
215
		pallet_babe::AuthorityId,
216
217
218
219
	)>>::Proof;

	type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
		KeyTypeId,
220
		pallet_babe::AuthorityId,
221
222
223
	)>>::IdentificationTuple;

	type HandleEquivocation =
224
		pallet_babe::EquivocationHandler<Self::KeyOwnerIdentification, Offences, ReportLongevity>;
225
226

	type WeightInfo = ();
ddorgan's avatar
ddorgan committed
227
228
229
}

parameter_types! {
230
	pub const IndexDeposit: Balance = 100 * CENTS;
ddorgan's avatar
ddorgan committed
231
232
}

233
impl pallet_indices::Config for Runtime {
ddorgan's avatar
ddorgan committed
234
235
236
237
	type AccountIndex = AccountIndex;
	type Currency = Balances;
	type Deposit = IndexDeposit;
	type Event = Event;
238
	type WeightInfo = weights::pallet_indices::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
239
240
241
242
}

parameter_types! {
	pub const ExistentialDeposit: Balance = 1 * CENTS;
243
	pub const MaxLocks: u32 = 50;
Gavin Wood's avatar
Gavin Wood committed
244
	pub const MaxReserves: u32 = 50;
ddorgan's avatar
ddorgan committed
245
246
}

247
impl pallet_balances::Config for Runtime {
ddorgan's avatar
ddorgan committed
248
249
250
251
252
	type Balance = Balance;
	type DustRemoval = ();
	type Event = Event;
	type ExistentialDeposit = ExistentialDeposit;
	type AccountStore = System;
253
	type MaxLocks = MaxLocks;
Gavin Wood's avatar
Gavin Wood committed
254
255
	type MaxReserves = MaxReserves;
	type ReserveIdentifier = [u8; 8];
256
	type WeightInfo = weights::pallet_balances::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
257
258
259
260
261
262
}

parameter_types! {
	pub const TransactionByteFee: Balance = 10 * MILLICENTS;
}

263
impl pallet_transaction_payment::Config for Runtime {
Albrecht's avatar
Albrecht committed
264
	type OnChargeTransaction = CurrencyAdapter<Balances, ToAuthor<Runtime>>;
ddorgan's avatar
ddorgan committed
265
266
	type TransactionByteFee = TransactionByteFee;
	type WeightToFee = WeightToFee;
267
	type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
ddorgan's avatar
ddorgan committed
268
269
270
271
272
}

parameter_types! {
	pub const MinimumPeriod: u64 = SLOT_DURATION / 2;
}
273
impl pallet_timestamp::Config for Runtime {
ddorgan's avatar
ddorgan committed
274
275
276
	type Moment = u64;
	type OnTimestampSet = Babe;
	type MinimumPeriod = MinimumPeriod;
277
	type WeightInfo = weights::pallet_timestamp::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
278
279
280
281
282
283
}

parameter_types! {
	pub const UncleGenerations: u32 = 0;
}

284
impl pallet_authorship::Config for Runtime {
285
	type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Babe>;
ddorgan's avatar
ddorgan committed
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
	type UncleGenerations = UncleGenerations;
	type FilterUncle = ();
	type EventHandler = (Staking, ImOnline);
}

parameter_types! {
	pub const Period: BlockNumber = 10 * MINUTES;
	pub const Offset: BlockNumber = 0;
}

impl_opaque_keys! {
	pub struct SessionKeys {
		pub grandpa: Grandpa,
		pub babe: Babe,
		pub im_online: ImOnline,
301
		pub para_validator: Initializer,
302
		pub para_assignment: ParaSessionInfo,
ddorgan's avatar
ddorgan committed
303
304
305
306
307
308
309
310
		pub authority_discovery: AuthorityDiscovery,
	}
}

parameter_types! {
	pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17);
}

311
impl pallet_session::Config for Runtime {
ddorgan's avatar
ddorgan committed
312
313
	type Event = Event;
	type ValidatorId = AccountId;
314
	type ValidatorIdOf = pallet_staking::StashOf<Self>;
ddorgan's avatar
ddorgan committed
315
316
	type ShouldEndSession = Babe;
	type NextSessionRotation = Babe;
317
	type SessionManager = pallet_session::historical::NoteHistoricalRoot<Self, Staking>;
ddorgan's avatar
ddorgan committed
318
319
320
	type SessionHandler = <SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
	type Keys = SessionKeys;
	type DisabledValidatorsThreshold = DisabledValidatorsThreshold;
321
	type WeightInfo = weights::pallet_session::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
322
323
}

324
impl pallet_session::historical::Config for Runtime {
325
326
	type FullIdentification = pallet_staking::Exposure<AccountId, Balance>;
	type FullIdentificationOf = pallet_staking::ExposureOf<Runtime>;
ddorgan's avatar
ddorgan committed
327
328
}

329
parameter_types! {
330
331
	// phase durations. 1/4 of the last session for each.
	pub const SignedPhase: u32 = EPOCH_DURATION_IN_SLOTS / 4;
332
	pub const UnsignedPhase: u32 = EPOCH_DURATION_IN_SLOTS / 4;
333

334
335
	// signed config
	pub const SignedMaxSubmissions: u32 = 128;
336
337
	pub const SignedDepositBase: Balance = deposit(2, 0);
	pub const SignedDepositByte: Balance = deposit(0, 10) / 1024;
338
339
	// Each good submission will get 1 WND as reward
	pub SignedRewardBase: Balance = 1 * UNITS;
340
	// fallback: emergency phase.
341
	pub const Fallback: pallet_election_provider_multi_phase::FallbackStrategy =
342
		pallet_election_provider_multi_phase::FallbackStrategy::Nothing;
343

344
	pub SolutionImprovementThreshold: Perbill = Perbill::from_rational(5u32, 10_000);
345
346
347

	// miner configs
	pub const MinerMaxIterations: u32 = 10;
348
	pub OffchainRepeat: BlockNumber = 5;
349
350
}

351
352
sp_npos_elections::generate_solution_type!(
	#[compact]
353
354
355
356
357
	pub struct NposCompactSolution16::<
		VoterIndex = u32,
		TargetIndex = u16,
		Accuracy = sp_runtime::PerU16,
	>(16)
358
359
);

360
361
362
impl pallet_election_provider_multi_phase::Config for Runtime {
	type Event = Event;
	type Currency = Balances;
363
	type EstimateCallFee = TransactionPayment;
364
365
	type SignedPhase = SignedPhase;
	type UnsignedPhase = UnsignedPhase;
366
367
368
369
370
371
372
373
	type SignedMaxSubmissions = SignedMaxSubmissions;
	type SignedRewardBase = SignedRewardBase;
	type SignedDepositBase = SignedDepositBase;
	type SignedDepositByte = SignedDepositByte;
	type SignedDepositWeight = ();
	type SignedMaxWeight = Self::MinerMaxWeight;
	type SlashHandler = (); // burn slashes
	type RewardHandler = (); // nothing to do upon rewards
374
	type SolutionImprovementThreshold = SolutionImprovementThreshold;
375
	type MinerMaxIterations = MinerMaxIterations;
376
	type MinerMaxWeight = OffchainSolutionWeightLimit; // For now use the one from staking.
377
	type MinerMaxLength = OffchainSolutionLengthLimit;
378
	type OffchainRepeat = OffchainRepeat;
379
	type MinerTxPriority = NposSolutionPriority;
380
381
	type DataProvider = Staking;
	type OnChainAccuracy = Perbill;
382
	type Solution = NposCompactSolution16;
383
	type Fallback = Fallback;
384
	type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
385
	type ForceOrigin = EnsureRoot<AccountId>;
386
	type WeightInfo = weights::pallet_election_provider_multi_phase::WeightInfo<Runtime>;
387
388
}

ddorgan's avatar
ddorgan committed
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
pallet_staking_reward_curve::build! {
	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,
	);
}

parameter_types! {
	// Six sessions in an era (6 hours).
	pub const SessionsPerEra: SessionIndex = 6;
	// 28 eras for unbonding (7 days).
404
	pub const BondingDuration: pallet_staking::EraIndex = 28;
405
	// 27 eras in which slashes can be cancelled (slightly less than 7 days).
406
	pub const SlashDeferDuration: pallet_staking::EraIndex = 27;
ddorgan's avatar
ddorgan committed
407
408
409
410
	pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
	pub const MaxNominatorRewardedPerValidator: u32 = 64;
}

411
impl pallet_staking::Config for Runtime {
412
	const MAX_NOMINATIONS: u32 =
413
		<NposCompactSolution16 as sp_npos_elections::NposSolution>::LIMIT as u32;
ddorgan's avatar
ddorgan committed
414
415
	type Currency = Balances;
	type UnixTime = Timestamp;
416
	type CurrencyToVote = CurrencyToVote;
ddorgan's avatar
ddorgan committed
417
418
419
420
421
422
423
424
	type RewardRemainder = ();
	type Event = Event;
	type Slash = ();
	type Reward = ();
	type SessionsPerEra = SessionsPerEra;
	type BondingDuration = BondingDuration;
	type SlashDeferDuration = SlashDeferDuration;
	// A majority of the council can cancel the slash.
425
	type SlashCancelOrigin = EnsureRoot<AccountId>;
ddorgan's avatar
ddorgan committed
426
	type SessionInterface = Self;
Kian Paimani's avatar
Kian Paimani committed
427
	type EraPayout = pallet_staking::ConvertCurve<RewardCurve>;
ddorgan's avatar
ddorgan committed
428
429
	type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator;
	type NextNewSession = Session;
430
	type ElectionProvider = ElectionProviderMultiPhase;
431
432
	type GenesisElectionProvider =
		frame_election_provider_support::onchain::OnChainSequentialPhragmen<
433
			pallet_election_provider_multi_phase::OnChainConfig<Self>,
434
		>;
435
	type WeightInfo = weights::pallet_staking::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
436
437
438
439
440
441
}

parameter_types! {
	pub const LaunchPeriod: BlockNumber = 7 * DAYS;
	pub const VotingPeriod: BlockNumber = 7 * DAYS;
	pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS;
442
	pub const MinimumDeposit: Balance = 100 * CENTS;
ddorgan's avatar
ddorgan committed
443
444
445
446
447
	pub const EnactmentPeriod: BlockNumber = 8 * DAYS;
	pub const CooloffPeriod: BlockNumber = 7 * DAYS;
	// One cent: $10,000 / MB
	pub const PreimageByteDeposit: Balance = 10 * MILLICENTS;
	pub const InstantAllowed: bool = true;
448
	pub const MaxAuthorities: u32 = 100_000;
ddorgan's avatar
ddorgan committed
449
450
}

451
impl pallet_offences::Config for Runtime {
ddorgan's avatar
ddorgan committed
452
	type Event = Event;
453
	type IdentificationTuple = pallet_session::historical::IdentificationTuple<Self>;
ddorgan's avatar
ddorgan committed
454
455
456
	type OnOffenceHandler = Staking;
}

457
458
459
impl pallet_authority_discovery::Config for Runtime {
	type MaxAuthorities = MaxAuthorities;
}
ddorgan's avatar
ddorgan committed
460
461

parameter_types! {
462
	pub const NposSolutionPriority: TransactionPriority = TransactionPriority::max_value() / 2;
ddorgan's avatar
ddorgan committed
463
464
465
	pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
}

466
impl pallet_im_online::Config for Runtime {
ddorgan's avatar
ddorgan committed
467
468
	type AuthorityId = ImOnlineId;
	type Event = Event;
469
	type ValidatorSet = Historical;
470
	type NextSessionRotation = Babe;
ddorgan's avatar
ddorgan committed
471
	type ReportUnresponsiveness = Offences;
472
	type UnsignedPriority = ImOnlineUnsignedPriority;
473
	type WeightInfo = weights::pallet_im_online::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
474
475
}

476
impl pallet_grandpa::Config for Runtime {
ddorgan's avatar
ddorgan committed
477
	type Event = Event;
478
479
480
481
482
483
484
485
486
487
488
489
	type Call = Call;

	type KeyOwnerProofSystem = Historical;

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

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

490
491
492
493
494
	type HandleEquivocation = pallet_grandpa::EquivocationHandler<
		Self::KeyOwnerIdentification,
		Offences,
		ReportLongevity,
	>;
495
496

	type WeightInfo = ();
ddorgan's avatar
ddorgan committed
497
498
}

499
500
/// Submits a transaction with the node's public and signature type. Adheres to the signed extension
/// format of the chain.
501
502
impl<LocalCall> frame_system::offchain::CreateSignedTransaction<LocalCall> for Runtime
where
503
504
	Call: From<LocalCall>,
{
505
	fn create_transaction<C: frame_system::offchain::AppCrypto<Self::Public, Self::Signature>>(
506
507
508
		call: Call,
		public: <Signature as Verify>::Signer,
		account: AccountId,
509
		nonce: <Runtime as frame_system::Config>::Index,
510
	) -> Option<(Call, <UncheckedExtrinsic as ExtrinsicT>::SignaturePayload)> {
511
		use sp_runtime::traits::StaticLookup;
512
		// take the biggest period possible.
513
514
		let period =
			BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
515
516
517

		let current_block = System::block_number()
			.saturated_into::<u64>()
518
519
			// The `System::block_number` is initialized with `n+1`,
			// so the actual block number is `n`.
520
521
522
			.saturating_sub(1);
		let tip = 0;
		let extra: SignedExtra = (
523
524
525
			frame_system::CheckSpecVersion::<Runtime>::new(),
			frame_system::CheckTxVersion::<Runtime>::new(),
			frame_system::CheckGenesis::<Runtime>::new(),
526
527
528
529
			frame_system::CheckMortality::<Runtime>::from(generic::Era::mortal(
				period,
				current_block,
			)),
530
531
532
			frame_system::CheckNonce::<Runtime>::from(nonce),
			frame_system::CheckWeight::<Runtime>::new(),
			pallet_transaction_payment::ChargeTransactionPayment::<Runtime>::from(tip),
533
		);
534
535
536
537
538
539
		let raw_payload = SignedPayload::new(call, extra)
			.map_err(|e| {
				log::warn!("Unable to create signed payload: {:?}", e);
			})
			.ok()?;
		let signature = raw_payload.using_encoded(|payload| C::sign(payload, public))?;
540
		let (call, extra, _) = raw_payload.deconstruct();
541
542
		let address = <Runtime as frame_system::Config>::Lookup::unlookup(account);
		Some((call, (address, signature, extra)))
543
	}
ddorgan's avatar
ddorgan committed
544
545
}

546
impl frame_system::offchain::SigningTypes for Runtime {
547
548
549
550
	type Public = <Signature as Verify>::Signer;
	type Signature = Signature;
}

551
552
impl<C> frame_system::offchain::SendTransactionTypes<C> for Runtime
where
553
554
555
556
557
558
	Call: From<C>,
{
	type OverarchingCall = Call;
	type Extrinsic = UncheckedExtrinsic;
}

ddorgan's avatar
ddorgan committed
559
560
parameter_types! {
	// Minimum 100 bytes/KSM deposited (1 CENT/byte)
561
	pub const BasicDeposit: Balance = 1000 * CENTS;       // 258 bytes on-chain
ddorgan's avatar
ddorgan committed
562
	pub const FieldDeposit: Balance = 250 * CENTS;        // 66 bytes on-chain
563
	pub const SubAccountDeposit: Balance = 200 * CENTS;   // 53 bytes on-chain
ddorgan's avatar
ddorgan committed
564
565
	pub const MaxSubAccounts: u32 = 100;
	pub const MaxAdditionalFields: u32 = 100;
566
	pub const MaxRegistrars: u32 = 20;
ddorgan's avatar
ddorgan committed
567
568
}

569
impl pallet_identity::Config for Runtime {
ddorgan's avatar
ddorgan committed
570
571
572
573
574
575
576
577
	type Event = Event;
	type Currency = Balances;
	type Slashed = ();
	type BasicDeposit = BasicDeposit;
	type FieldDeposit = FieldDeposit;
	type SubAccountDeposit = SubAccountDeposit;
	type MaxSubAccounts = MaxSubAccounts;
	type MaxAdditionalFields = MaxAdditionalFields;
578
	type MaxRegistrars = MaxRegistrars;
579
580
	type RegistrarOrigin = frame_system::EnsureRoot<AccountId>;
	type ForceOrigin = frame_system::EnsureRoot<AccountId>;
581
	type WeightInfo = weights::pallet_identity::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
582
583
}

584
impl pallet_utility::Config for Runtime {
585
586
	type Event = Event;
	type Call = Call;
587
	type WeightInfo = weights::pallet_utility::WeightInfo<Runtime>;
588
589
}

ddorgan's avatar
ddorgan committed
590
parameter_types! {
591
592
	// One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes.
	pub const DepositBase: Balance = deposit(1, 88);
ddorgan's avatar
ddorgan committed
593
	// Additional storage item size of 32 bytes.
594
	pub const DepositFactor: Balance = deposit(0, 32);
ddorgan's avatar
ddorgan committed
595
596
597
	pub const MaxSignatories: u16 = 100;
}

598
impl pallet_multisig::Config for Runtime {
ddorgan's avatar
ddorgan committed
599
600
601
	type Event = Event;
	type Call = Call;
	type Currency = Balances;
602
603
	type DepositBase = DepositBase;
	type DepositFactor = DepositFactor;
ddorgan's avatar
ddorgan committed
604
	type MaxSignatories = MaxSignatories;
605
	type WeightInfo = weights::pallet_multisig::WeightInfo<Runtime>;
ddorgan's avatar
ddorgan committed
606
607
608
}

parameter_types! {
609
	pub const ConfigDepositBase: Balance = 500 * CENTS;
ddorgan's avatar
ddorgan committed
610
611
	pub const FriendDepositFactor: Balance = 50 * CENTS;
	pub const MaxFriends: u16 = 9;
612
	pub const RecoveryDeposit: Balance = 500 * CENTS;
ddorgan's avatar
ddorgan committed
613
614
}

615
impl pallet_recovery::Config for Runtime {
ddorgan's avatar
ddorgan committed
616
617
618
619
620
621
622
623
624
625
	type Event = Event;
	type Call = Call;
	type Currency = Balances;
	type ConfigDepositBase = ConfigDepositBase;
	type FriendDepositFactor = FriendDepositFactor;
	type MaxFriends = MaxFriends;
	type RecoveryDeposit = RecoveryDeposit;
}

parameter_types! {
626
	pub const MinVestedTransfer: Balance = 100 * CENTS;
ddorgan's avatar
ddorgan committed
627
628
}

629
impl pallet_vesting::Config for Runtime {
ddorgan's avatar
ddorgan committed
630
631
632
633
	type Event = Event;
	type Currency = Balances;
	type BlockNumberToBalance = ConvertInto;
	type MinVestedTransfer = MinVestedTransfer;
634
	type WeightInfo = weights::pallet_vesting::WeightInfo<Runtime>;
635
	const MAX_VESTING_SCHEDULES: u32 = 28;
ddorgan's avatar
ddorgan committed
636
637
}

638
impl pallet_sudo::Config for Runtime {
ddorgan's avatar
ddorgan committed
639
640
641
642
	type Event = Event;
	type Call = Call;
}

643
644
645
646
647
648
parameter_types! {
	// One storage item; key size 32, value size 8; .
	pub const ProxyDepositBase: Balance = deposit(1, 8);
	// Additional storage item size of 33 bytes.
	pub const ProxyDepositFactor: Balance = deposit(0, 33);
	pub const MaxProxies: u16 = 32;
649
650
651
	pub const AnnouncementDepositBase: Balance = deposit(1, 8);
	pub const AnnouncementDepositFactor: Balance = deposit(0, 66);
	pub const MaxPending: u16 = 32;
652
653
654
}

/// The type used to represent the kinds of proxying allowed.
655
656
657
#[derive(
	Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, MaxEncodedLen,
)]
658
659
660
661
pub enum ProxyType {
	Any,
	NonTransfer,
	Staking,
662
	SudoBalances,
Chevdor's avatar
Chevdor committed
663
	IdentityJudgement,
Shawn Tabrizi's avatar
Shawn Tabrizi committed
664
	CancelProxy,
665
	Auction,
666
}
667
668
669
670
671
impl Default for ProxyType {
	fn default() -> Self {
		Self::Any
	}
}
672
673
674
675
impl InstanceFilter<Call> for ProxyType {
	fn filter(&self, c: &Call) -> bool {
		match self {
			ProxyType::Any => true,
676
677
			ProxyType::NonTransfer => matches!(
				c,
678
679
680
				Call::System(..) |
				Call::Babe(..) |
				Call::Timestamp(..) |
681
682
683
				Call::Indices(pallet_indices::Call::claim(..)) |
				Call::Indices(pallet_indices::Call::free(..)) |
				Call::Indices(pallet_indices::Call::freeze(..)) |
684
685
686
687
688
689
690
691
692
				// Specifically omitting Indices `transfer`, `force_transfer`
				// Specifically omitting the entire Balances pallet
				Call::Authorship(..) |
				Call::Staking(..) |
				Call::Session(..) |
				Call::Grandpa(..) |
				Call::ImOnline(..) |
				Call::Utility(..) |
				Call::Identity(..) |
693
694
695
696
697
698
				Call::Recovery(pallet_recovery::Call::as_recovered(..)) |
				Call::Recovery(pallet_recovery::Call::vouch_recovery(..)) |
				Call::Recovery(pallet_recovery::Call::claim_recovery(..)) |
				Call::Recovery(pallet_recovery::Call::close_recovery(..)) |
				Call::Recovery(pallet_recovery::Call::remove_recovery(..)) |
				Call::Recovery(pallet_recovery::Call::cancel_recovered(..)) |
699
				// Specifically omitting Recovery `create_recovery`, `initiate_recovery`
700
701
				Call::Vesting(pallet_vesting::Call::vest(..)) |
				Call::Vesting(pallet_vesting::Call::vest_other(..)) |
702
703
704
705
				// Specifically omitting Vesting `vested_transfer`, and `force_vested_transfer`
				Call::Scheduler(..) |
				// Specifically omitting Sudo pallet
				Call::Proxy(..) |
706
707
708
709
710
711
712
				Call::Multisig(..) |
				Call::Registrar(paras_registrar::Call::register(..)) |
				Call::Registrar(paras_registrar::Call::deregister(..)) |
				// Specifically omitting Registrar `swap`
				Call::Registrar(paras_registrar::Call::reserve(..)) |
				Call::Crowdloan(..) |
				Call::Slots(..) |
713
				Call::Auctions(..) // Specifically omitting the entire XCM Pallet
714
			),
715
716
717
			ProxyType::Staking => {
				matches!(c, Call::Staking(..) | Call::Session(..) | Call::Utility(..))
			},
718
			ProxyType::SudoBalances => match c {
719
720
721
				Call::Sudo(pallet_sudo::Call::sudo(ref x)) => {
					matches!(x.as_ref(), &Call::Balances(..))
				},
Gavin Wood's avatar
Gavin Wood committed
722
				Call::Utility(..) => true,
723
724
				_ => false,
			},
725
726
727
			ProxyType::IdentityJudgement => matches!(
				c,
				Call::Identity(pallet_identity::Call::provide_judgement(..)) | Call::Utility(..)
Shawn Tabrizi's avatar
Shawn Tabrizi committed
728
			),
729
730
731
			ProxyType::CancelProxy => {
				matches!(c, Call::Proxy(pallet_proxy::Call::reject_announcement(..)))
			},
732
733
734
735
			ProxyType::Auction => matches!(
				c,
				Call::Auctions(..) | Call::Crowdloan(..) | Call::Registrar(..) | Call::Slots(..)
			),
736
737
738
739
740
741
742
743
744
		}
	}
	fn is_superset(&self, o: &Self) -> bool {
		match (self, o) {
			(x, y) if x == y => true,
			(ProxyType::Any, _) => true,
			(_, ProxyType::Any) => false,
			(ProxyType::NonTransfer, _) => true,
			_ => false,
745
746
747
748
		}
	}
}

749
impl pallet_proxy::Config for Runtime {
750
751
752
753
754
755
756
	type Event = Event;
	type Call = Call;
	type Currency = Balances;
	type ProxyType = ProxyType;
	type ProxyDepositBase = ProxyDepositBase;
	type ProxyDepositFactor = ProxyDepositFactor;
	type MaxProxies = MaxProxies;
757
	type WeightInfo = weights::pallet_proxy::WeightInfo<Runtime>;
758
759
760
761
	type MaxPending = MaxPending;
	type CallHasher = BlakeTwo256;
	type AnnouncementDepositBase = AnnouncementDepositBase;
	type AnnouncementDepositFactor = AnnouncementDepositFactor;
762
763
}

764
765
766
767
768
769
770
771
772
773
impl parachains_origin::Config for Runtime {}

impl parachains_configuration::Config for Runtime {}

impl parachains_shared::Config for Runtime {}

impl parachains_session_info::Config for Runtime {}

impl parachains_inclusion::Config for Runtime {
	type Event = Event;
asynchronous rob's avatar
asynchronous rob committed
774
	type DisputesHandler = ();
775
776
777
778
779
780
781
782
783
784
785
786
787
	type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints<Runtime>;
}

impl parachains_paras::Config for Runtime {
	type Origin = Origin;
	type Event = Event;
}

parameter_types! {
	pub const FirstMessageFactorPercent: u64 = 100;
}

impl parachains_ump::Config for Runtime {
788
789
	type Event = Event;
	type UmpSink = crate::parachains_ump::XcmSink<XcmExecutor<XcmConfig>, Runtime>;
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
	type FirstMessageFactorPercent = FirstMessageFactorPercent;
}

impl parachains_dmp::Config for Runtime {}

impl parachains_hrmp::Config for Runtime {
	type Event = Event;
	type Origin = Origin;
	type Currency = Balances;
}

impl parachains_paras_inherent::Config for Runtime {}

impl parachains_scheduler::Config for Runtime {}

impl parachains_initializer::Config for Runtime {
	type Randomness = pallet_babe::RandomnessFromOneEpochAgo<Runtime>;
	type ForceOrigin = EnsureRoot<AccountId>;
}

impl paras_sudo_wrapper::Config for Runtime {}

parameter_types! {
	pub const ParaDeposit: Balance = 2000 * CENTS;
	pub const DataDepositPerByte: Balance = deposit(0, 1);
}

impl paras_registrar::Config for Runtime {
	type Event = Event;
	type Origin = Origin;
	type Currency = Balances;
821
	type OnSwap = (Crowdloan, Slots);
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
	type ParaDeposit = ParaDeposit;
	type DataDepositPerByte = DataDepositPerByte;
	type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo<Runtime>;
}

parameter_types! {
	pub const LeasePeriod: BlockNumber = 28 * DAYS;
}

impl slots::Config for Runtime {
	type Event = Event;
	type Currency = Balances;
	type Registrar = Registrar;
	type LeasePeriod = LeasePeriod;
	type WeightInfo = weights::runtime_common_slots::WeightInfo<Runtime>;
}

839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
parameter_types! {
	pub const CrowdloanId: PalletId = PalletId(*b"py/cfund");
	pub const SubmissionDeposit: Balance = 100 * 100 * CENTS;
	pub const MinContribution: Balance = 100 * CENTS;
	pub const RemoveKeysLimit: u32 = 500;
	// Allow 32 bytes for an additional memo to a crowdloan.
	pub const MaxMemoLength: u8 = 32;
}

impl crowdloan::Config for Runtime {
	type Event = Event;
	type PalletId = CrowdloanId;
	type SubmissionDeposit = SubmissionDeposit;
	type MinContribution = MinContribution;
	type RemoveKeysLimit = RemoveKeysLimit;
	type Registrar = Registrar;
	type Auctioneer = Auctions;
	type MaxMemoLength = MaxMemoLength;
	type WeightInfo = weights::runtime_common_crowdloan::WeightInfo<Runtime>;
}

parameter_types! {
	// The average auction is 7 days long, so this will be 70% for ending period.
	// 5 Days = 72000 Blocks @ 6 sec per block
	pub const EndingPeriod: BlockNumber = 5 * DAYS;
	// ~ 1000 samples per day -> ~ 20 blocks per sample -> 2 minute samples
	pub const SampleLength: BlockNumber = 2 * MINUTES;
}

impl auctions::Config for Runtime {
	type Event = Event;
	type Leaser = Slots;
	type Registrar = Registrar;
	type EndingPeriod = EndingPeriod;
	type SampleLength = SampleLength;
	type Randomness = pallet_babe::RandomnessFromOneEpochAgo<Runtime>;
	type InitiateOrigin = EnsureRoot<AccountId>;
	type WeightInfo = weights::runtime_common_auctions::WeightInfo<Runtime>;
}

879
parameter_types! {
880
881
	pub const WndLocation: MultiLocation = Here.into();
	pub const Ancestry: MultiLocation = Here.into();
882
	pub WestendNetwork: NetworkId = NetworkId::Named(b"Westend".to_vec());
883
	pub CheckAccount: AccountId = XcmPallet::check_account();
884
885
}

886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
pub type LocationConverter =
	(ChildParachainConvertsVia<ParaId, AccountId>, AccountId32Aliases<WestendNetwork, AccountId>);

pub type LocalAssetTransactor = XcmCurrencyAdapter<
	// Use this currency:
	Balances,
	// Use this currency when it is a fungible asset matching the given location or name:
	IsConcrete<WndLocation>,
	// We can convert the MultiLocations with our converter above:
	LocationConverter,
	// Our chain's account ID type (we can't get away without mentioning it explicitly):
	AccountId,
	// It's a native asset so we keep track of the teleports to maintain total issuance.
	CheckAccount,
>;
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916

type LocalOriginConverter = (
	SovereignSignedViaLocation<LocationConverter, Origin>,
	ChildParachainAsNative<parachains_origin::Origin, Origin>,
	SignedAccountId32AsNative<WestendNetwork, Origin>,
	ChildSystemParachainAsSuperuser<ParaId, Origin>,
);

parameter_types! {
	pub const BaseXcmWeight: Weight = 10_000_000;
}

/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our
/// individual routers.
pub type XcmRouter = (
	// Only one router so far - use DMP to communicate with child parachains.
Gavin Wood's avatar
Gavin Wood committed
917
	xcm_sender::ChildParachainRouter<Runtime, xcm::AlwaysRelease>,
918
919
);

920
parameter_types! {
Gavin Wood's avatar
Gavin Wood committed
921
	pub const WestendForWestmint: (MultiAssetFilter, MultiLocation) =
922
		(Wild(AllOf { fun: WildFungible, id: Concrete(WndLocation::get()) }), Parachain(1000).into());
923
	pub const MaxInstructions: u32 = 100;
924
}
925
pub type TrustedTeleporters = (xcm_builder::Case<WestendForWestmint>,);
926

927
928
929
930
931
/// The barriers one of which must be passed for an XCM message to be executed.
pub type Barrier = (
	// Weight that is paid for may be consumed.
	TakeWeightCredit,
	// If the message is one that immediately attemps to pay for execution, then allow it.
932
	AllowTopLevelPaidExecutionFrom<Everything>,
933
934
935
936
937
938
939
940
941
942
943
	// Messages coming from system parachains need not pay for execution.
	AllowUnpaidExecutionFrom<IsChildSystemParachain<ParaId>>,
);

pub struct XcmConfig;
impl xcm_executor::Config for XcmConfig {
	type Call = Call;
	type XcmSender = XcmRouter;
	type AssetTransactor = LocalAssetTransactor;
	type OriginConverter = LocalOriginConverter;
	type IsReserve = ();
944
	type IsTeleporter = TrustedTeleporters;
945
	type LocationInverter = LocationInverter<Ancestry>;
946
	type Barrier = Barrier;
947
	type Weigher = FixedWeightBounds<BaseXcmWeight, Call, MaxInstructions>;
948
	type Trader = UsingComponents<WeightToFee, WndLocation, AccountId, Balances, ToAuthor<Runtime>>;
949
950
951
	type ResponseHandler = XcmPallet;
	type AssetTrap = XcmPallet;
	type AssetClaims = XcmPallet;
952
953
}

954
955
956
957
958
959
960
961
962
963
964
965
966
/// Type to convert an `Origin` type value into a `MultiLocation` value which represents an interior location
/// of this chain.
pub type LocalOriginToLocation = (
	// And a usual Signed origin to be used in XCM as a corresponding AccountId32
	SignedToAccountId32<Origin, AccountId, WestendNetwork>,
);

impl pallet_xcm::Config for Runtime {
	type Event = Event;
	type SendXcmOrigin = xcm_builder::EnsureXcmOrigin<Origin, LocalOriginToLocation>;
	type XcmRouter = XcmRouter;
	// Anyone can execute XCM messages locally...
	type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin<Origin, LocalOriginToLocation>;
Gavin Wood's avatar
Gavin Wood committed
967
	// ...but they must match our filter, which rejects everything.
968
	type XcmExecuteFilter = Nothing;
969
	type XcmExecutor = XcmExecutor<XcmConfig>;
970
971
	type XcmTeleportFilter = Everything;
	type XcmReserveTransferFilter = Everything;
972
	type Weigher = FixedWeightBounds<BaseXcmWeight, Call, MaxInstructions>;
973
	type LocationInverter = LocationInverter<Ancestry>;
974
975
	type Origin = Origin;
	type Call = Call;
976
977
}

ddorgan's avatar
ddorgan committed
978
979
980
construct_runtime! {
	pub enum Runtime where
		Block = Block,
981
		NodeBlock = primitives::v1::Block,
ddorgan's avatar
ddorgan committed
982
983
984
		UncheckedExtrinsic = UncheckedExtrinsic
	{
		// Basic stuff; balances is uncallable initially.
985
		System: frame_system::{Pallet, Call, Storage, Config, Event<T>} = 0,
ddorgan's avatar
ddorgan committed
986
987

		// Must be before session.
988
		Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned} = 1,
ddorgan's avatar
ddorgan committed
989

990
991
992
993
		Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2,
		Indices: pallet_indices::{Pallet, Call, Storage, Config<T>, Event<T>} = 3,
		Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 4,
		TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 26,
ddorgan's avatar
ddorgan committed
994
995

		// Consensus support.
996
		Authorship: pallet_authorship::{Pallet, Call, Storage} = 5,
997
		Staking: pallet_staking::{Pallet, Call, Storage, Config<T>, Event<T>} = 6,
Keith Yeung's avatar
Keith Yeung committed
998
		Offences: pallet_offences::{Pallet, Storage, Event} = 7,
999
1000
		Historical: session_historical::{Pallet} = 27,
		Session: pallet_session::{Pallet, Call, Storage, Event, Config<T>} = 8,
For faster browsing, not all history is shown. View entire blame