lib.rs 25.3 KB
Newer Older
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"]
22

Albrecht's avatar
Albrecht committed
23
use pallet_transaction_payment::CurrencyAdapter;
24
use sp_std::prelude::*;
Sergey Pepyakin's avatar
Sergey Pepyakin committed
25
use sp_std::collections::btree_map::BTreeMap;
26
use parity_scale_codec::Encode;
Sergey Pepyakin's avatar
Sergey Pepyakin committed
27
28

use polkadot_runtime_parachains::configuration as parachains_configuration;
29
use polkadot_runtime_parachains::shared as parachains_shared;
Sergey Pepyakin's avatar
Sergey Pepyakin committed
30
31
32
use polkadot_runtime_parachains::inclusion as parachains_inclusion;
use polkadot_runtime_parachains::inclusion_inherent as parachains_inclusion_inherent;
use polkadot_runtime_parachains::initializer as parachains_initializer;
33
use polkadot_runtime_parachains::session_info as parachains_session_info;
Sergey Pepyakin's avatar
Sergey Pepyakin committed
34
use polkadot_runtime_parachains::paras as parachains_paras;
35
36
37
use polkadot_runtime_parachains::dmp as parachains_dmp;
use polkadot_runtime_parachains::ump as parachains_ump;
use polkadot_runtime_parachains::hrmp as parachains_hrmp;
Sergey Pepyakin's avatar
Sergey Pepyakin committed
38
39
40
use polkadot_runtime_parachains::scheduler as parachains_scheduler;
use polkadot_runtime_parachains::runtime_api_impl::v1 as runtime_impl;

41
use primitives::v1::{
42
43
	AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt,
	CoreState, GroupRotationInfo, Hash as HashT, Id as ParaId, Moment, Nonce, OccupiedCoreAssumption,
44
	PersistedValidationData, Signature, ValidationCode, ValidatorId, ValidatorIndex,
45
	InboundDownwardMessage, InboundHrmpMessage, SessionInfo as SessionInfoData,
46
};
47
use runtime_common::{
48
	claims, SlowAdjustingFeeUpdate, paras_sudo_wrapper,
49
	BlockHashCount, BlockWeights, BlockLength,
50
51
52
};
use sp_runtime::{
	create_runtime_str, generic, impl_opaque_keys,
53
	ApplyExtrinsicResult, Perbill, KeyTypeId,
54
	transaction_validity::{
55
		TransactionValidity, TransactionSource, TransactionPriority,
56
	},
57
	curve::PiecewiseLinear,
58
	traits::{
59
60
		BlakeTwo256, Block as BlockT, StaticLookup, OpaqueKeys, ConvertInto,
		Extrinsic as ExtrinsicT, SaturatedConversion, Verify,
61
	},
62
};
63
64
use sp_version::RuntimeVersion;
use pallet_grandpa::{AuthorityId as GrandpaId, fg_primitives};
65
#[cfg(any(feature = "std", test))]
66
use sp_version::NativeVersion;
67
68
69
use sp_core::OpaqueMetadata;
use sp_staking::SessionIndex;
use frame_support::{
70
	parameter_types, construct_runtime, debug,
71
	traits::{KeyOwnerProofSystem, Randomness},
72
	weights::Weight,
73
};
74
use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId;
75
use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo};
76
use pallet_session::historical as session_historical;
77
use polkadot_runtime_parachains::reward_points::RewardValidatorsWithEraPoints;
78
79

#[cfg(feature = "std")]
80
pub use pallet_staking::StakerStatus;
81
82
#[cfg(any(feature = "std", test))]
pub use sp_runtime::BuildStorage;
83
84
pub use pallet_timestamp::Call as TimestampCall;
pub use pallet_balances::Call as BalancesCall;
85
pub use paras_sudo_wrapper::Call as ParasSudoWrapperCall;
86
pub use pallet_sudo::Call as SudoCall;
87
88
89
90
91
92
93
94
95

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

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

96
/// Runtime version (Test).
97
98
99
100
pub const VERSION: RuntimeVersion = RuntimeVersion {
	spec_name: create_runtime_str!("polkadot-test-runtime"),
	impl_name: create_runtime_str!("parity-polkadot-test-runtime"),
	authoring_version: 2,
101
	spec_version: 1055,
102
	impl_version: 0,
103
	apis: RUNTIME_API_VERSIONS,
104
	transaction_version: 1,
105
106
107
108
109
110
111
112
113
114
115
};

/// Native version.
#[cfg(any(feature = "std", test))]
pub fn native_version() -> NativeVersion {
	NativeVersion {
		runtime_version: VERSION,
		can_author_with: Default::default(),
	}
}

116
117
118
119
120
121
122
sp_api::decl_runtime_apis! {
	pub trait GetLastTimestamp {
		/// Returns the last timestamp of a runtime.
		fn get_last_timestamp() -> u64;
	}
}

123
124
parameter_types! {
	pub const Version: RuntimeVersion = VERSION;
125
	pub const SS58Prefix: u8 = 42;
126
127
}

128
impl frame_system::Config for Runtime {
129
	type BaseCallFilter = ();
130
131
132
	type BlockWeights = BlockWeights;
	type BlockLength = BlockLength;
	type DbWeight = ();
133
134
135
136
137
138
139
140
141
142
143
144
	type Origin = Origin;
	type Call = Call;
	type Index = Nonce;
	type BlockNumber = BlockNumber;
	type Hash = HashT;
	type Hashing = BlakeTwo256;
	type AccountId = AccountId;
	type Lookup = Indices;
	type Header = generic::Header<BlockNumber, BlakeTwo256>;
	type Event = Event;
	type BlockHashCount = BlockHashCount;
	type Version = Version;
145
	type PalletInfo = PalletInfo;
146
	type AccountData = pallet_balances::AccountData<Balance>;
Gavin Wood's avatar
Gavin Wood committed
147
	type OnNewAccount = ();
148
	type OnKilledAccount = ();
149
	type SystemWeightInfo = ();
150
	type SS58Prefix = SS58Prefix;
151
152
}

153
impl<C> frame_system::offchain::SendTransactionTypes<C> for Runtime where
154
155
156
157
158
159
	Call: From<C>,
{
	type OverarchingCall = Call;
	type Extrinsic = UncheckedExtrinsic;
}

160
parameter_types! {
161
162
	pub storage EpochDuration: u64 = EPOCH_DURATION_IN_BLOCKS as u64;
	pub storage ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK;
163
164
}

165
impl pallet_babe::Config for Runtime {
166
167
168
169
	type EpochDuration = EpochDuration;
	type ExpectedBlockTime = ExpectedBlockTime;

	// session module is the trigger
170
	type EpochChangeTrigger = pallet_babe::ExternalTrigger;
171
172
173
174
175

	type KeyOwnerProofSystem = ();

	type KeyOwnerProof = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
		KeyTypeId,
176
		pallet_babe::AuthorityId,
177
178
179
180
	)>>::Proof;

	type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
		KeyTypeId,
181
		pallet_babe::AuthorityId,
182
183
184
	)>>::IdentificationTuple;

	type HandleEquivocation = ();
185
186

	type WeightInfo = ();
187
188
189
}

parameter_types! {
190
	pub storage IndexDeposit: Balance = 1 * DOLLARS;
191
192
}

193
impl pallet_indices::Config for Runtime {
194
195
196
197
	type AccountIndex = AccountIndex;
	type Currency = Balances;
	type Deposit = IndexDeposit;
	type Event = Event;
198
	type WeightInfo = ();
199
200
201
}

parameter_types! {
202
	pub storage ExistentialDeposit: Balance = 1 * CENTS;
203
	pub storage MaxLocks: u32 = 50;
204
205
}

206
impl pallet_balances::Config for Runtime {
207
208
209
210
211
	type Balance = Balance;
	type DustRemoval = ();
	type Event = Event;
	type ExistentialDeposit = ExistentialDeposit;
	type AccountStore = System;
212
	type MaxLocks = MaxLocks;
213
	type WeightInfo = ();
214
215
216
}

parameter_types! {
217
	pub storage TransactionByteFee: Balance = 10 * MILLICENTS;
218
219
}

220
impl pallet_transaction_payment::Config for Runtime {
Albrecht's avatar
Albrecht committed
221
	type OnChargeTransaction = CurrencyAdapter<Balances, ()>;
222
223
	type TransactionByteFee = TransactionByteFee;
	type WeightToFee = WeightToFee;
224
	type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
225
226
227
}

parameter_types! {
228
229
	pub storage SlotDuration: u64 = SLOT_DURATION;
	pub storage MinimumPeriod: u64 = SlotDuration::get() / 2;
230
}
231
impl pallet_timestamp::Config for Runtime {
232
233
234
	type Moment = u64;
	type OnTimestampSet = Babe;
	type MinimumPeriod = MinimumPeriod;
235
	type WeightInfo = ();
236
237
238
}

parameter_types! {
239
	pub storage UncleGenerations: u32 = 0;
240
241
242
}

// TODO: substrate#2986 implement this properly
243
impl pallet_authorship::Config for Runtime {
244
	type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Babe>;
245
246
247
248
249
250
	type UncleGenerations = UncleGenerations;
	type FilterUncle = ();
	type EventHandler = Staking;
}

parameter_types! {
251
252
	pub storage Period: BlockNumber = 10 * MINUTES;
	pub storage Offset: BlockNumber = 0;
253
254
255
256
257
258
}

impl_opaque_keys! {
	pub struct SessionKeys {
		pub grandpa: Grandpa,
		pub babe: Babe,
259
260
		pub para_validator: Initializer,
		pub para_assignment: SessionInfo,
261
		pub authority_discovery: AuthorityDiscovery,
262
263
264
265
	}
}

parameter_types! {
266
	pub storage DisabledValidatorsThreshold: Perbill = Perbill::from_percent(17);
267
268
}

269
impl pallet_session::Config for Runtime {
270
271
	type Event = Event;
	type ValidatorId = AccountId;
272
	type ValidatorIdOf = pallet_staking::StashOf<Self>;
273
	type ShouldEndSession = Babe;
274
	type NextSessionRotation = Babe;
275
276
277
278
	type SessionManager = Staking;
	type SessionHandler = <SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
	type Keys = SessionKeys;
	type DisabledValidatorsThreshold = DisabledValidatorsThreshold;
279
	type WeightInfo = ();
280
281
}

282
impl pallet_session::historical::Config for Runtime {
283
284
	type FullIdentification = pallet_staking::Exposure<AccountId, Balance>;
	type FullIdentificationOf = pallet_staking::ExposureOf<Runtime>;
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
}

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).
300
	pub storage SessionsPerEra: SessionIndex = 6;
301
	// 28 eras for unbonding (7 days).
302
	pub storage BondingDuration: pallet_staking::EraIndex = 28;
303
	// 27 eras in which slashes can be cancelled (a bit less than 7 days).
304
	pub storage SlashDeferDuration: pallet_staking::EraIndex = 27;
305
	pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
306
307
308
309
	pub storage MaxNominatorRewardedPerValidator: u32 = 64;
	pub storage ElectionLookahead: BlockNumber = 0;
	pub storage StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2;
	pub storage MaxIterations: u32 = 10;
310
	pub MinSolutionScoreBump: Perbill = Perbill::from_rational_approximation(5u32, 10_000);
311
312
}

313
314
315
316
317
318
319
impl sp_election_providers::onchain::Config for Runtime {
	type AccountId = <Self as frame_system::Config>::AccountId;
	type BlockNumber = <Self as frame_system::Config>::BlockNumber;
	type Accuracy = sp_runtime::Perbill;
	type DataProvider = pallet_staking::Module<Self>;
}

320
impl pallet_staking::Config for Runtime {
321
	type Currency = Balances;
322
	type UnixTime = Timestamp;
323
	type CurrencyToVote = frame_support::traits::U128CurrencyToVote;
324
325
326
327
328
329
330
331
	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.
332
	type SlashCancelOrigin = frame_system::EnsureNever<()>;
333
334
335
	type SessionInterface = Self;
	type RewardCurve = RewardCurve;
	type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator;
336
337
338
	type NextNewSession = Session;
	type ElectionLookahead = ElectionLookahead;
	type Call = Call;
339
	type UnsignedPriority = StakingUnsignedPriority;
340
	type MaxIterations = MaxIterations;
341
	type OffchainSolutionWeightLimit = ();
342
	type MinSolutionScoreBump = MinSolutionScoreBump;
343
	type ElectionProvider = sp_election_providers::onchain::OnChainSequentialPhragmen<Self>;
344
345
	type WeightInfo = ();

346
347
}

348
impl pallet_grandpa::Config for Runtime {
349
	type Event = Event;
350
351
352
353
354
355
356
357
358
359
360
361
362
	type Call = Call;

	type KeyOwnerProofSystem = ();

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

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

	type HandleEquivocation = ();
363
364

	type WeightInfo = ();
365
366
}

367
impl<LocalCall> frame_system::offchain::CreateSignedTransaction<LocalCall> for Runtime where
368
369
	Call: From<LocalCall>,
{
370
	fn create_transaction<C: frame_system::offchain::AppCrypto<Self::Public, Self::Signature>>(
371
372
373
		call: Call,
		public: <Signature as Verify>::Signer,
		account: AccountId,
374
		nonce: <Runtime as frame_system::Config>::Index,
375
376
377
378
379
380
381
382
383
384
385
	) -> Option<(Call, <UncheckedExtrinsic as ExtrinsicT>::SignaturePayload)> {
		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>()
			.saturating_sub(1);
		let tip = 0;
		let extra: SignedExtra = (
386
387
388
389
390
391
392
			frame_system::CheckSpecVersion::<Runtime>::new(),
			frame_system::CheckTxVersion::<Runtime>::new(),
			frame_system::CheckGenesis::<Runtime>::new(),
			frame_system::CheckMortality::<Runtime>::from(generic::Era::mortal(period, current_block)),
			frame_system::CheckNonce::<Runtime>::from(nonce),
			frame_system::CheckWeight::<Runtime>::new(),
			pallet_transaction_payment::ChargeTransactionPayment::<Runtime>::from(tip),
393
394
		);
		let raw_payload = SignedPayload::new(call, extra).map_err(|e| {
395
			debug::warn!("Unable to create signed payload: {:?}", e);
396
		}).ok()?;
397
398
399
		let signature = raw_payload.using_encoded(|payload| {
			C::sign(payload, public)
		})?;
400
401
402
403
		let (call, extra, _) = raw_payload.deconstruct();
		let address = Indices::unlookup(account);
		Some((call, (address, signature, extra)))
	}
404
405
}

406
impl frame_system::offchain::SigningTypes for Runtime {
407
408
409
410
	type Public = <Signature as Verify>::Signer;
	type Signature = Signature;
}

411
parameter_types! {
412
	pub storage OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * BlockWeights::get().max_block;
413
414
}

415
impl pallet_offences::Config for Runtime {
416
	type Event = Event;
417
	type IdentificationTuple = pallet_session::historical::IdentificationTuple<Self>;
418
	type OnOffenceHandler = Staking;
419
	type WeightSoftLimit = OffencesWeightSoftLimit;
420
421
}

422
impl pallet_authority_discovery::Config for Runtime {}
423

424
parameter_types! {
425
426
	pub storage LeasePeriod: BlockNumber = 100_000;
	pub storage EndingPeriod: BlockNumber = 1000;
427
428
429
}

parameter_types! {
430
	pub Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:";
431
432
}

433
impl claims::Config for Runtime {
434
435
436
	type Event = Event;
	type VestingSchedule = Vesting;
	type Prefix = Prefix;
437
	type MoveClaimOrigin = frame_system::EnsureRoot<AccountId>;
438
	type WeightInfo = claims::TestWeightInfo;
439
440
441
}

parameter_types! {
442
	pub storage MinVestedTransfer: Balance = 100 * DOLLARS;
443
444
}

445
impl pallet_vesting::Config for Runtime {
446
447
448
449
	type Event = Event;
	type Currency = Balances;
	type BlockNumberToBalance = ConvertInto;
	type MinVestedTransfer = MinVestedTransfer;
450
	type WeightInfo = ();
451
452
}

453
impl pallet_sudo::Config for Runtime {
454
455
456
457
	type Event = Event;
	type Call = Call;
}

458
impl parachains_configuration::Config for Runtime {}
459

460
461
impl parachains_shared::Config for Runtime {}

462
impl parachains_inclusion::Config for Runtime {
463
	type Event = Event;
464
	type RewardValidators = RewardValidatorsWithEraPoints<Runtime>;
465
466
}

467
impl parachains_inclusion_inherent::Config for Runtime {}
468

469
impl parachains_initializer::Config for Runtime {
470
	type Randomness = Babe;
471
472
}

473
impl parachains_session_info::Config for Runtime {}
474

475
impl parachains_paras::Config for Runtime {
476
477
478
	type Origin = Origin;
}

479
impl parachains_dmp::Config for Runtime {}
480

481
impl parachains_ump::Config for Runtime {
482
483
	type UmpSink = ();
}
484

485
impl parachains_hrmp::Config for Runtime {
486
	type Event = Event;
487
	type Origin = Origin;
488
	type Currency = Balances;
489
490
}

491
impl parachains_scheduler::Config for Runtime {}
492

493
impl paras_sudo_wrapper::Config for Runtime {}
494

495
496
497
construct_runtime! {
	pub enum Runtime where
		Block = Block,
498
		NodeBlock = primitives::v1::Block,
499
500
501
		UncheckedExtrinsic = UncheckedExtrinsic
	{
		// Basic stuff; balances is uncallable initially.
502
503
		System: frame_system::{Module, Call, Storage, Config, Event<T>},
		RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Storage},
504
505

		// Must be before session.
506
		Babe: pallet_babe::{Module, Call, Storage, Config},
507

508
509
510
511
		Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent},
		Indices: pallet_indices::{Module, Call, Storage, Config<T>, Event<T>},
		Balances: pallet_balances::{Module, Call, Storage, Config<T>, Event<T>},
		TransactionPayment: pallet_transaction_payment::{Module, Storage},
512
513

		// Consensus support.
514
515
516
		Authorship: pallet_authorship::{Module, Call, Storage},
		Staking: pallet_staking::{Module, Call, Storage, Config<T>, Event<T>, ValidateUnsigned},
		Offences: pallet_offences::{Module, Call, Storage, Event},
517
		Historical: session_historical::{Module},
518
519
520
		Session: pallet_session::{Module, Call, Storage, Event, Config<T>},
		Grandpa: pallet_grandpa::{Module, Call, Storage, Config, Event},
		AuthorityDiscovery: pallet_authority_discovery::{Module, Call, Config},
521
522
523
524
525

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

		// Vesting. Usable initially, but removed once all vesting is finished.
526
		Vesting: pallet_vesting::{Module, Call, Storage, Event<T>, Config<T>},
527

528
		// Parachains runtime modules
529
		ParachainsConfiguration: parachains_configuration::{Module, Call, Storage, Config<T>},
Sergey Pepyakin's avatar
Sergey Pepyakin committed
530
531
532
533
534
		Inclusion: parachains_inclusion::{Module, Call, Storage, Event<T>},
		InclusionInherent: parachains_inclusion_inherent::{Module, Call, Storage, Inherent},
		Initializer: parachains_initializer::{Module, Call, Storage},
		Paras: parachains_paras::{Module, Call, Storage, Origin},
		Scheduler: parachains_scheduler::{Module, Call, Storage},
535
		ParasSudoWrapper: paras_sudo_wrapper::{Module, Call},
536
		SessionInfo: parachains_session_info::{Module, Call, Storage},
537
		Hrmp: parachains_hrmp::{Module, Call, Storage, Event},
538

539
		Sudo: pallet_sudo::{Module, Call, Storage, Config<T>, Event<T>},
540
541
542
543
	}
}

/// The address format for describing accounts.
544
pub type Address = sp_runtime::MultiAddress<AccountId, AccountIndex>;
545
546
547
548
549
550
551
552
553
554
/// Block header type as expected by this runtime.
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
/// 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>;
/// The SignedExtension to the basic transaction logic.
pub type SignedExtra = (
555
556
557
558
559
560
561
	frame_system::CheckSpecVersion<Runtime>,
	frame_system::CheckTxVersion<Runtime>,
	frame_system::CheckGenesis<Runtime>,
	frame_system::CheckMortality<Runtime>,
	frame_system::CheckNonce<Runtime>,
	frame_system::CheckWeight<Runtime>,
	pallet_transaction_payment::ChargeTransactionPayment::<Runtime>,
562
563
564
565
566
567
);
/// Unchecked extrinsic type as expected by this runtime.
pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;
/// Extrinsic type that has already been checked.
pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Nonce, Call>;
/// Executive: handles dispatch to the various modules.
568
pub type Executive = frame_executive::Executive<Runtime, Block, frame_system::ChainContext<Runtime>, Runtime, AllModules>;
569
570
/// The payload being signed in transactions.
pub type SignedPayload = generic::SignedPayload<Call, SignedExtra>;
571
572
573
574
575
576
577
578
579
580
581
582
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

pub type Hash = <Block as BlockT>::Hash;
pub type Extrinsic = <Block as BlockT>::Extrinsic;

sp_api::impl_runtime_apis! {
	impl sp_api::Core<Block> for Runtime {
		fn version() -> RuntimeVersion {
			VERSION
		}

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

		fn initialize_block(header: &<Block as BlockT>::Header) {
			Executive::initialize_block(header)
		}
	}

	impl sp_api::Metadata<Block> for Runtime {
		fn metadata() -> OpaqueMetadata {
			Runtime::metadata().into()
		}
	}

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

		fn finalize_block() -> <Block as BlockT>::Header {
			Executive::finalize_block()
		}

		fn inherent_extrinsics(data: inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
			data.create_extrinsics()
		}

		fn check_inherents(
			block: Block,
			data: inherents::InherentData,
		) -> inherents::CheckInherentsResult {
			data.check_extrinsics(&block)
		}

		fn random_seed() -> <Block as BlockT>::Hash {
			RandomnessCollectiveFlip::random_seed()
		}
	}

	impl tx_pool_api::runtime_api::TaggedTransactionQueue<Block> for Runtime {
622
623
624
625
626
		fn validate_transaction(
			source: TransactionSource,
			tx: <Block as BlockT>::Extrinsic,
		) -> TransactionValidity {
			Executive::validate_transaction(source, tx)
627
628
629
		}
	}

630
631
632
633
634
635
636
637
	impl offchain_primitives::OffchainWorkerApi<Block> for Runtime {
		fn offchain_worker(header: &<Block as BlockT>::Header) {
			Executive::offchain_worker(header)
		}
	}

	impl authority_discovery_primitives::AuthorityDiscoveryApi<Block> for Runtime {
		fn authorities() -> Vec<AuthorityDiscoveryId> {
638
			AuthorityDiscovery::authorities()
639
640
641
		}
	}

642
643
644
	impl primitives::v1::ParachainHost<Block, Hash, BlockNumber> for Runtime {
		fn validators() -> Vec<ValidatorId> {
			runtime_impl::validators::<Runtime>()
645
		}
646
647
648

		fn validator_groups() -> (Vec<Vec<ValidatorIndex>>, GroupRotationInfo<BlockNumber>) {
			runtime_impl::validator_groups::<Runtime>()
649
		}
650

651
		fn availability_cores() -> Vec<CoreState<Hash, BlockNumber>> {
652
			runtime_impl::availability_cores::<Runtime>()
653
		}
654
655

		fn persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption)
656
657
658
659
			-> Option<PersistedValidationData<BlockNumber>>
		{
			runtime_impl::persisted_validation_data::<Runtime>(para_id, assumption)
		}
660

661
662
		fn check_validation_outputs(
			para_id: ParaId,
663
			outputs: primitives::v1::CandidateCommitments,
664
665
666
667
		) -> bool {
			runtime_impl::check_validation_outputs::<Runtime>(para_id, outputs)
		}

668
669
		fn session_index_for_child() -> SessionIndex {
			runtime_impl::session_index_for_child::<Runtime>()
670
		}
671
672

		fn validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption)
673
674
675
676
			-> Option<ValidationCode>
		{
			runtime_impl::validation_code::<Runtime>(para_id, assumption)
		}
677

678
679
680
681
682
683
684
		fn historical_validation_code(para_id: ParaId, context_height: BlockNumber)
			-> Option<ValidationCode>
		{
			runtime_impl::historical_validation_code::<Runtime>(para_id, context_height)
		}


685
686
		fn candidate_pending_availability(para_id: ParaId) -> Option<CommittedCandidateReceipt<Hash>> {
			runtime_impl::candidate_pending_availability::<Runtime>(para_id)
687
		}
688
689
690
691
692
693

		fn candidate_events() -> Vec<CandidateEvent<Hash>> {
			use core::convert::TryInto;
			runtime_impl::candidate_events::<Runtime, _>(|trait_event| trait_event.try_into().ok())
		}

694
		fn session_info(index: SessionIndex) -> Option<SessionInfoData> {
695
			runtime_impl::session_info::<Runtime>(index)
696
		}
697
698
699

		fn dmq_contents(
			recipient: ParaId,
Sergey Pepyakin's avatar
Sergey Pepyakin committed
700
		) -> Vec<InboundDownwardMessage<BlockNumber>> {
701
702
			runtime_impl::dmq_contents::<Runtime>(recipient)
		}
Sergey Pepyakin's avatar
Sergey Pepyakin committed
703
704
705
706
707
708

		fn inbound_hrmp_channels_contents(
			recipient: ParaId,
		) -> BTreeMap<ParaId, Vec<InboundHrmpMessage<BlockNumber>>> {
			runtime_impl::inbound_hrmp_channels_contents::<Runtime>(recipient)
		}
709
710
711
712
713
714
	}

	impl fg_primitives::GrandpaApi<Block> for Runtime {
		fn grandpa_authorities() -> Vec<(GrandpaId, u64)> {
			Grandpa::grandpa_authorities()
		}
715

716
		fn submit_report_equivocation_unsigned_extrinsic(
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
			_equivocation_proof: fg_primitives::EquivocationProof<
				<Block as BlockT>::Hash,
				sp_runtime::traits::NumberFor<Block>,
			>,
			_key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof,
		) -> Option<()> {
			None
		}

		fn generate_key_ownership_proof(
			_set_id: fg_primitives::SetId,
			_authority_id: fg_primitives::AuthorityId,
		) -> Option<fg_primitives::OpaqueKeyOwnershipProof> {
			None
		}
732
733
734
	}

	impl babe_primitives::BabeApi<Block> for Runtime {
735
		fn configuration() -> babe_primitives::BabeGenesisConfiguration {
736
737
738
739
740
			// 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>
741
			babe_primitives::BabeGenesisConfiguration {
742
743
744
745
746
				slot_duration: Babe::slot_duration(),
				epoch_length: EpochDuration::get(),
				c: PRIMARY_PROBABILITY,
				genesis_authorities: Babe::authorities(),
				randomness: Babe::randomness(),
747
				allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryVRFSlots,
748
749
750
			}
		}

Bastian Köcher's avatar
Bastian Köcher committed
751
		fn current_epoch_start() -> babe_primitives::Slot {
752
753
			Babe::current_epoch_start()
		}
754

755
756
757
758
		fn current_epoch() -> babe_primitives::Epoch {
			Babe::current_epoch()
		}

759
760
761
762
		fn next_epoch() -> babe_primitives::Epoch {
			Babe::next_epoch()
		}

763
		fn generate_key_ownership_proof(
Bastian Köcher's avatar
Bastian Köcher committed
764
			_slot: babe_primitives::Slot,
765
766
767
768
769
770
771
772
773
774
775
			_authority_id: babe_primitives::AuthorityId,
		) -> Option<babe_primitives::OpaqueKeyOwnershipProof> {
			None
		}

		fn submit_report_equivocation_unsigned_extrinsic(
			_equivocation_proof: babe_primitives::EquivocationProof<<Block as BlockT>::Header>,
			_key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof,
		) -> Option<()> {
			None
		}
776
777
778
779
780
781
782
783
784
785
786
787
788
789
	}

	impl sp_session::SessionKeys<Block> for Runtime {
		fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {
			SessionKeys::generate(seed)
		}

		fn decode_session_keys(
			encoded: Vec<u8>,
		) -> Option<Vec<(Vec<u8>, sp_core::crypto::KeyTypeId)>> {
			SessionKeys::decode_into_raw_public_keys(&encoded)
		}
	}

790
	impl frame_system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime {
791
792
793
794
795
796
797
798
799
		fn account_nonce(account: AccountId) -> Nonce {
			System::account_nonce(account)
		}
	}

	impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<
		Block,
		Balance,
	> for Runtime {
800
		fn query_info(uxt: <Block as BlockT>::Extrinsic, len: u32) -> RuntimeDispatchInfo<Balance> {
801
802
			TransactionPayment::query_info(uxt, len)
		}
803
804
805
		fn query_fee_details(uxt: <Block as BlockT>::Extrinsic, len: u32) -> FeeDetails<Balance> {
			TransactionPayment::query_fee_details(uxt, len)
		}
806
	}
807
808
809
810
811
812

	impl crate::GetLastTimestamp<Block> for Runtime {
		fn get_last_timestamp() -> u64 {
			Timestamp::now()
		}
	}
813
}