12345678#![cfg_attr(not(feature = "std"), no_std)]910#![recursion_limit = "256"]111213#[cfg(feature = "std")]14include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));1516use sp_api::impl_runtime_apis;17use sp_core::{ crypto::KeyTypeId, crypto::Public, OpaqueMetadata };18use sp_runtime::{19 BuildStorage,20 Permill, Perbill, Percent,21 ModuleId,22 create_runtime_str, generic, impl_opaque_keys,23 traits::{24 AccountIdLookup, BlakeTwo256, Block as BlockT, Convert, ConvertInto, IdentifyAccount, 25 IdentityLookup, NumberFor, Verify, AccountIdConversion,26 },27 transaction_validity::{TransactionSource, TransactionValidity},28 ApplyExtrinsicResult, MultiSignature,29};3031use sp_std::prelude::*;3233#[cfg(feature = "std")]34use sp_version::NativeVersion;35use sp_version::RuntimeVersion;36pub use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment, CurrencyAdapter, FeeDetails, RuntimeDispatchInfo};3738pub use pallet_balances::Call as BalancesCall;39pub use pallet_contracts::{Schedule as ContractsSchedule };40pub use frame_support::{41 construct_runtime,42 dispatch::DispatchResult,43 parameter_types,44 StorageValue,45 traits::{46 All, Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier, OnUnbalanced, Randomness47 },48 weights::{49 constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},50 DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,51 WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients52 },53};54use pallet_contracts::weights::WeightInfo;5556use frame_system::{57 self as system,58 EnsureRoot, 59 limits::{BlockWeights, BlockLength},60};61use sp_std::{prelude::*, marker::PhantomData};62use sp_arithmetic::{traits::{BaseArithmetic, Unsigned}};63use smallvec::smallvec;6465pub use pallet_timestamp::Call as TimestampCall;666768use polkadot_parachain::primitives::Sibling;69use xcm::v0::{Junction, MultiLocation, NetworkId};70use xcm_builder::{71 AccountId32Aliases, CurrencyAdapter, LocationInverter, ParentIsDefault, RelayChainAsNative,72 SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative,73 SovereignSignedViaLocation, FixedRateOfConcreteFungible, EnsureXcmOrigin,74 AllowTopLevelPaidExecutionFrom, TakeWeightCredit, FixedWeightBounds, IsConcrete, NativeAsset,75 AllowUnpaidExecutionFrom, ParentAsSuperuser,76};77use xcm_executor::{Config, XcmExecutor};787980mod chain_extension;81use crate::chain_extension::{ NFTExtension, Imbalance };82838485pub struct CurrencyToVoteHandler;8687impl CurrencyToVoteHandler {88 fn factor() -> Balance {89 (Balances::total_issuance() / u64::max_value() as Balance).max(1)90 }91}9293impl Convert<Balance, u64> for CurrencyToVoteHandler {94 fn convert(x: Balance) -> u64 {95 (x / Self::factor()) as u6496 }97}9899impl Convert<u128, Balance> for CurrencyToVoteHandler {100 fn convert(x: u128) -> Balance {101 x * Self::factor()102 }103}104105106107extern crate pallet_nft;108pub use pallet_nft::*;109110111pub type BlockNumber = u32;112113114pub type Signature = MultiSignature;115116117118pub type AccountId = <<Signature as Verify>::Signer as IdentifyAccount>::AccountId;119120121122pub type AccountIndex = u32;123124125pub type Balance = u128;126127128pub type Index = u32;129130131pub type Hash = sp_core::H256;132133134pub type DigestItem = generic::DigestItem<Hash>;135136mod nft_weights;137138139140141142pub mod opaque {143 use super::*;144145 pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic;146147 148 pub type Header = generic::Header<BlockNumber, BlakeTwo256>;149 150 pub type Block = generic::Block<Header, UncheckedExtrinsic>;151 152 pub type BlockId = generic::BlockId<Block>;153154 impl_opaque_keys! {155 pub struct SessionKeys {}156 }157}158159160pub const VERSION: RuntimeVersion = RuntimeVersion {161 spec_name: create_runtime_str!("nft"),162 impl_name: create_runtime_str!("nft"),163 authoring_version: 1,164 spec_version: 3,165 impl_version: 1,166 apis: RUNTIME_API_VERSIONS,167 transaction_version: 1,168};169170pub const MILLISECS_PER_BLOCK: u64 = 6000;171172pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;173174175pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber);176pub const HOURS: BlockNumber = MINUTES * 60;177pub const DAYS: BlockNumber = HOURS * 24;178179#[derive(codec::Encode, codec::Decode)]180pub enum XCMPMessage<XAccountId, XBalance> {181 182 TransferToken(XAccountId, XBalance),183}184185186#[cfg(feature = "std")]187pub fn native_version() -> NativeVersion {188 NativeVersion {189 runtime_version: VERSION,190 can_author_with: Default::default(),191 }192}193194type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;195196pub struct DealWithFees;197impl OnUnbalanced<NegativeImbalance> for DealWithFees {198 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item=NegativeImbalance>) {199 if let Some(fees) = fees_then_tips.next() {200 201 let mut split = fees.ration(100, 0);202 if let Some(tips) = fees_then_tips.next() {203 204 tips.ration_merge_into(100, 0, &mut split);205 }206 Treasury::on_unbalanced(split.0);207 208 }209 }210}211212213214215216217218219220221222223224225226227228229const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10);230231232const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);233234const MAXIMUM_BLOCK_WEIGHT: Weight = 2 * WEIGHT_PER_SECOND;235236parameter_types! {237 pub const BlockHashCount: BlockNumber = 2400;238 pub RuntimeBlockLength: BlockLength =239 BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);240 pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);241 pub const MaximumBlockLength: u32 = 5 * 1024 * 1024;242 pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()243 .base_block(BlockExecutionWeight::get())244 .for_class(DispatchClass::all(), |weights| {245 weights.base_extrinsic = ExtrinsicBaseWeight::get();246 })247 .for_class(DispatchClass::Normal, |weights| {248 weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);249 })250 .for_class(DispatchClass::Operational, |weights| {251 weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);252 253 254 weights.reserved = Some(255 MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT256 );257 })258 .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)259 .build_or_panic();260 pub const Version: RuntimeVersion = VERSION;261 pub const SS58Prefix: u8 = 42;262}263264impl system::Config for Runtime {265 266 type AccountData = pallet_balances::AccountData<Balance>;267 268 type AccountId = AccountId;269 270 type BaseCallFilter = ();271 272 type BlockHashCount = BlockHashCount;273 274 type BlockLength = RuntimeBlockLength;275 276 type BlockNumber = BlockNumber;277 278 279 type BlockWeights = RuntimeBlockWeights;280 281 type Call = Call;282 283 type DbWeight = RocksDbWeight;284 285 type Event = Event;286 287 type Hash = Hash;288 289 type Hashing = BlakeTwo256;290 291 type Header = generic::Header<BlockNumber, BlakeTwo256>;292 293 type Index = Index;294 295 type Lookup = IdentityLookup<AccountId>;296 297 type OnKilledAccount = ();298 299 type OnNewAccount = ();300 type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;301 302 type Origin = Origin;303 304 type PalletInfo = PalletInfo;305 306 type SS58Prefix = SS58Prefix;307 308 type SystemWeightInfo = system::weights::SubstrateWeight<Runtime>;309 310 type Version = Version;311}312313parameter_types! {314 pub const MinimumPeriod: u64 = SLOT_DURATION / 2;315}316317impl pallet_timestamp::Config for Runtime {318 319 type Moment = u64;320 type OnTimestampSet = Aura;321 type MinimumPeriod = MinimumPeriod;322 type WeightInfo = ();323}324325parameter_types! {326 327 pub const ExistentialDeposit: u128 = 0;328 pub const MaxLocks: u32 = 50;329}330331impl pallet_balances::Config for Runtime {332 type MaxLocks = MaxLocks;333 334 type Balance = Balance;335 336 type Event = Event;337 type DustRemoval = Treasury;338 type ExistentialDeposit = ExistentialDeposit;339 type AccountStore = System;340 type WeightInfo = pallet_balances::weights::SubstrateWeight<Runtime>;341}342343pub const MICROUNIQUE: Balance = 1_000_000_000;344pub const MILLIUNIQUE: Balance = 1_000 * MICROUNIQUE;345pub const CENTIUNIQUE: Balance = 10 * MILLIUNIQUE;346pub const UNIQUE: Balance = 100 * CENTIUNIQUE;347348pub const fn deposit(items: u32, bytes: u32) -> Balance {349 items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE350}351352parameter_types! {353 pub const TombstoneDeposit: Balance = deposit(354 0,355 sp_std::mem::size_of::<pallet_contracts::ContractInfo<Runtime>>() as u32356 );357 pub const DepositPerContract: Balance = TombstoneDeposit::get();358 pub const DepositPerStorageByte: Balance = deposit(0, 1);359 pub const DepositPerStorageItem: Balance = deposit(1, 0);360 pub RentFraction: Perbill = Perbill::from_rational_approximation(1u32, 30 * DAYS);361 pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;362 pub const SignedClaimHandicap: u32 = 2;363 pub const MaxDepth: u32 = 32;364 pub const MaxValueSize: u32 = 16 * 1024;365 pub const MaxCodeSize: u32 = 1024 * 1024 * 25; 366 367 pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *368 RuntimeBlockWeights::get().max_block;369 370 371 pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (372 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -373 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)374 )) / 5) as u32;375}376377378impl pallet_contracts::Config for Runtime {379 type Time = Timestamp;380 type Randomness = RandomnessCollectiveFlip;381 type Currency = Balances;382 type Event = Event;383 type RentPayment = ();384 type SignedClaimHandicap = SignedClaimHandicap;385 type TombstoneDeposit = TombstoneDeposit;386 type DepositPerContract = DepositPerContract;387 type DepositPerStorageByte = DepositPerStorageByte;388 type DepositPerStorageItem = DepositPerStorageItem;389 type RentFraction = RentFraction;390 type SurchargeReward = SurchargeReward;391 type MaxDepth = MaxDepth;392 type MaxValueSize = MaxValueSize;393 type WeightPrice = pallet_transaction_payment::Module<Self>;394 type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;395 type ChainExtension = NFTExtension;396 type DeletionQueueDepth = DeletionQueueDepth;397 type DeletionWeightLimit = DeletionWeightLimit;398 type MaxCodeSize = MaxCodeSize;399}400401parame ter_types! {402 pub const TransactionByteFee: Balance = 501 * MICROUNIQUE; 403}404405406pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);407408impl<T> WeightToFeePolynomial for LinearFee<T> where409 T: BaseArithmetic + From<u32> + Copy + Unsigned410{411 type Balance = T;412413 fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {414 smallvec!(WeightToFeeCoefficient {415 coeff_integer: 146_700u32.into(), 416 coeff_frac: Perbill::zero(),417 negative: false,418 degree: 1,419 })420 }421}422423impl pallet_transaction_payment::Config for Runtime {424 type OnChargeTransaction = CurrencyAdapter<Balances, DealWithFees>;425 type TransactionByteFee = TransactionByteFee;426 type WeightToFee = LinearFee<Balance>;427 type FeeMultiplierUpdate = ();428}429430parameter_types! {431 pub const ProposalBond: Permill = Permill::from_percent(5);432 pub const ProposalBondMinimum: Balance = 1 * UNIQUE;433 pub const SpendPeriod: BlockNumber = 5 * MINUTES;434 pub const Burn: Permill = Permill::from_percent(0);435 pub const TipCountdown: BlockNumber = 1 * DAYS;436 pub const TipFindersFee: Percent = Percent::from_percent(20);437 pub const TipReportDepositBase: Balance = 1 * UNIQUE;438 pub const DataDepositPerByte: Balance = 1 * CENTIUNIQUE;439 pub const BountyDepositBase: Balance = 1 * UNIQUE;440 pub const BountyDepositPayoutDelay: BlockNumber = 1 * DAYS;441 pub const TreasuryModuleId: ModuleId = ModuleId(*b"py/trsry");442 pub const BountyUpdatePeriod: BlockNumber = 14 * DAYS;443 pub const MaximumReasonLength: u32 = 16384;444 pub const BountyCuratorDeposit: Permill = Permill::from_percent(50);445 pub const BountyValueMinimum: Balance = 5 * UNIQUE;446}447448impl pallet_treasury::Config for Runtime {449 type ModuleId = TreasuryModuleId;450 type Currency = Balances;451 type ApproveOrigin = EnsureRoot<AccountId>;452 type RejectOrigin = EnsureRoot<AccountId>;453 type Event = Event;454 type OnSlash = ();455 type ProposalBond = ProposalBond;456 type ProposalBondMinimum = ProposalBondMinimum;457 type SpendPeriod = SpendPeriod;458 type Burn = Burn;459 type BurnDestination = ();460 type SpendFunds = ();461 type WeightInfo = pallet_treasury::weights::SubstrateWeight<Runtime>;462}463464impl pallet_sudo::Config for Runtime {465 type Event = Event;466 type Call = Call;467}468469parameter_types! {470 pub const MinVestedTransfer: Balance = 10 * UNIQUE;471}472473impl pallet_vesting::Config for Runtime {474 type Event = Event;475 type Currency = Balances;476 type BlockNumberToBalance = ConvertInto;477 type MinVestedTransfer = MinVestedTransfer;478 type WeightInfo = ();479}480481parameter_types! {482 pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;483}484485impl cumulus_pallet_parachain_system::Config for Runtime {486 type Event = Event;487 type OnValidationData = ();488 type SelfParaId = parachain_info::Module<Runtime>;489 type DownwardMessageHandlers = cumulus_primitives_utility::UnqueuedDmpAsParent<490 MaxDownwardMessageWeight,491 XcmExecutor<XcmConfig>,492 Call,493 >;494 type OutboundXcmpMessageSource = XcmpQueue;495 type XcmpMessageHandler = XcmpQueue;496 type ReservedXcmpWeight = ReservedXcmpWeight;497}498499impl parachain_info::Config for Runtime {}500501parameter_types! {502 pub const RococoLocation: MultiLocation = MultiLocation::X1(Junction::Parent);503 pub const RococoNetwork: NetworkId = NetworkId::Polkadot;504 pub RelayChainOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();505 pub Ancestry: MultiLocation = Junction::Parachain {506 id: ParachainInfo::parachain_id().into()507 }.into();508}509510511512513pub type LocationToAccountId = (514 515 ParentIsDefault<AccountId>,516 517 SiblingParachainConvertsVia<Sibling, AccountId>,518 519 AccountId32Aliases<RococoNetwork, AccountId>,520);521522523pub type LocalAssetTransactor = CurrencyAdapter<524 525 Balances,526 527 IsConcrete<RococoLocation>,528 529 LocationToAccountId,530 531 AccountId,532>;533534535536537pub type XcmOriginToTransactDispatchOrigin = (538 539 540 541 SovereignSignedViaLocation<LocationToAccountId, Origin>,542 543 544 RelayChainAsNative<RelayChainOrigin, Origin>,545 546 547 SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,548 549 550 ParentAsSuperuser<Origin>,551 552 553 SignedAccountId32AsNative<RococoNetwork, Origin>,554);555556parameter_types! {557 pub UnitWeightCost: Weight = 1_000;558}559560parameter_types! {561 562 563 pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::X1(Junction::Parent), 1_000);564 pub AllowUnpaidFrom: Vec<MultiLocation> = vec![ MultiLocation::X1(Junction::Parent) ];565}566567pub type Barrier = (568 TakeWeightCredit,569 AllowTopLevelPaidExecutionFrom<All<MultiLocation>>,570 AllowUnpaidExecutionFrom<IsInVec<AllowUnpaidFrom>>, 571);572573574pub struct XcmConfig;575impl Config for XcmConfig {576 type Call = Call;577 type XcmSender = XcmRouter;578 579 type AssetTransactor = LocalAssetTransactor;580 type OriginConverter = XcmOriginToTransactDispatchOrigin;581 type IsReserve = NativeAsset;582 type IsTeleporter = NativeAsset; 583 type LocationInverter = LocationInverter<Ancestry>;584 type Barrier = Barrier;585 type Weigher = FixedWeightBounds<UnitWeightCost, Call>;586 type Trader = FixedRateOfConcreteFungible<WeightPrice>;587 type ResponseHandler = (); 588}589590parameter_types! {591 pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10;592}593594595pub type LocalOriginToLocation = ();596597598599pub type XcmRouter = (600 601 cumulus_primitives_utility::ParentAsUmp<ParachainSystem>,602 603 XcmpQueue,604);605606impl pallet_xcm::Config for Runtime {607 type Event = Event;608 type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;609 type XcmRouter = XcmRouter;610 type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;611 type XcmExecutor = XcmExecutor<XcmConfig>;612}613614impl cumulus_pallet_xcm::Config for Runtime {}615616impl cumulus_pallet_xcmp_queue::Config for Runtime {617 type Event = Event;618 type XcmExecutor = XcmExecutor<XcmConfig>;619 type ChannelInfo = ParachainSystem;620}621622parameter_types! {623 pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();624 pub const CollectionCreationPrice: Balance = 100 * UNIQUE;625}626627628impl pallet_nft::Config for Runtime {629 type Event = Event;630 type WeightInfo = nft_weights::WeightInfo;631 type Currency = Balances;632 type CollectionCreationPrice = CollectionCreationPrice;633 type TreasuryAccountId = TreasuryAccountId;634}635636637extern crate pallet_inflation;638pub use pallet_inflation::*;639640parameter_types! {641 pub const InflationBlockInterval: BlockNumber = 100; 642}643644645impl pallet_inflation::Config for Runtime {646 type Currency = Balances;647 type TreasuryAccountId = TreasuryAccountId;648 type InflationBlockInterval = InflationBlockInterval;649}650651construct_runtime!(652 pub enum Runtime where653 Block = Block,654 NodeBlock = opaque::Block,655 UncheckedExtrinsic = UncheckedExtrinsic656 {657 Balances: pallet_balances::{Module, Call, Storage, Config<T>, Event<T>},658 Contracts: pallet_contracts::{Module, Call, Config<T>, Storage, Event<T>},659 CumulusXcm: cumulus_pallet_xcm::{Pallet, Origin},660 ParachainInfo: parachain_info::{Pallet, Storage, Config},661 ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event<T>},662 PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin},663 RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Module, Call, Storage},664 Sudo: pallet_sudo::{Module, Call, Config<T>, Storage, Event<T>},665 System: system::{Module, Call, Config, Storage, Event<T>},666 Timestamp: pallet_timestamp::{Module, Call, Storage, Inherent},667 TransactionPayment: pallet_transaction_payment::{Module, Storage},668 Treasury: pallet_treasury::{Module, Call, Storage, Config, Event<T>},669 Vesting: pallet_vesting::{Module, Call, Config<T>, Storage, Event<T>},670 XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>},671672 Inflation: pallet_inflation::{Module, Call, Storage},673 Nft: pallet_nft::{Module, Call, Config<T>, Storage, Event<T>},674 }675);676677678pub type Address = AccountId;679680pub type Header = generic::Header<BlockNumber, BlakeTwo256>;681682pub type Block = generic::Block<Header, UncheckedExtrinsic>;683684pub type SignedBlock = generic::SignedBlock<Block>;685686pub type BlockId = generic::BlockId<Block>;687688pub type SignedExtra = (689 system::CheckSpecVersion<Runtime>,690 system::CheckTxVersion<Runtime>,691 system::CheckGenesis<Runtime>,692 system::CheckEra<Runtime>,693 system::CheckNonce<Runtime>,694 system::CheckWeight<Runtime>,695 pallet_nft::ChargeTransactionPayment<Runtime>,696);697698pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;699700pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Call, SignedExtra>;701702pub type Executive =703 frame_executive::Executive<Runtime, Block, system::ChainContext<Runtime>, Runtime, AllModules>;704705impl_runtime_apis! {706 impl sp_api::Core<Block> for Runtime {707 fn version() -> RuntimeVersion {708 VERSION709 }710711 fn execute_block(block: Block) {712 Executive::execute_block(block)713 }714715 fn initialize_block(header: &<Block as BlockT>::Header) {716 Executive::initialize_block(header)717 }718 }719720 impl sp_api::Metadata<Block> for Runtime {721 fn metadata() -> OpaqueMetadata {722 Runtime::metadata().into()723 }724 }725726 impl sp_block_builder::BlockBuilder<Block> for Runtime {727 fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult {728 Executive::apply_extrinsic(extrinsic)729 }730731 fn finalize_block() -> <Block as BlockT>::Header {732 Executive::finalize_block()733 }734735 fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {736 data.create_extrinsics()737 }738739 fn check_inherents(740 block: Block,741 data: sp_inherents::InherentData,742 ) -> sp_inherents::CheckInherentsResult {743 data.check_extrinsics(&block)744 }745746 fn random_seed() -> <Block as BlockT>::Hash {747 RandomnessCollectiveFlip::random_seed()748 }749 }750751 impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {752 fn validate_transaction(753 source: TransactionSource,754 tx: <Block as BlockT>::Extrinsic,755 ) -> TransactionValidity {756 Executive::validate_transaction(source, tx)757 }758 }759760 impl sp_offchain::OffchainWorkerApi<Block> for Runtime {761 fn offchain_worker(header: &<Block as BlockT>::Header) {762 Executive::offchain_worker(header)763 }764 }765766 impl sp_session::SessionKeys<Block> for Runtime {767 fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {768 opaque::SessionKeys::generate(seed)769 }770771 fn decode_session_keys(772 encoded: Vec<u8>,773 ) -> Option<Vec<(Vec<u8>, KeyTypeId)>> {774 opaque::SessionKeys::decode_into_raw_public_keys(&encoded)775 }776 }777778 impl frame_system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Index> for Runtime {779 fn account_nonce(account: AccountId) -> Index {780 System::account_nonce(account)781 }782 }783784 impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {785 fn query_info(uxt: <Block as BlockT>::Extrinsic, len: u32) -> RuntimeDispatchInfo<Balance> {786 TransactionPayment::query_info(uxt, len)787 }788 fn query_fee_details(uxt: <Block as BlockT>::Extrinsic, len: u32) -> FeeDetails<Balance> {789 TransactionPayment::query_fee_details(uxt, len)790 }791 }792793 impl pallet_contracts_rpc_runtime_api::ContractsApi<Block, AccountId, Balance, BlockNumber>794 for Runtime795 {796 fn call(797 origin: AccountId,798 dest: AccountId,799 value: Balance,800 gas_limit: u64,801 input_data: Vec<u8>,802 ) -> pallet_contracts_primitives::ContractExecResult {803 Contracts::bare_call(origin, dest, value, gas_limit, input_data)804 }805806 fn get_storage(807 address: AccountId,808 key: [u8; 32],809 ) -> pallet_contracts_primitives::GetStorageResult {810 Contracts::get_storage(address, key)811 }812813 fn rent_projection(814 address: AccountId,815 ) -> pallet_contracts_primitives::RentProjectionResult<BlockNumber> {816 Contracts::rent_projection(address)817 }818 }819820 #[cfg(feature = "runtime-benchmarks")]821 impl frame_benchmarking::Benchmark<Block> for Runtime {822 fn dispatch_benchmark(823 config: frame_benchmarking::BenchmarkConfig824 ) -> Result<Vec<frame_benchmarking::BenchmarkBatch>, sp_runtime::RuntimeString> {825 use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey};826827 let whitelist: Vec<TrackedStorageKey> = vec![828 829 hex_literal::hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d").to_vec().into(),830 831 832 833 834 835 836 837 838 ];839840 let mut batches = Vec::<BenchmarkBatch>::new();841 let params = (&config, &whitelist);842843 add_benchmark!(params, batches, pallet_nft, Nft);844 add_benchmark!(params, batches, pallet_inflation, Inflation);845846 if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) }847 Ok(batches)848 }849 }850}