1234567891011121314151617#[macro_export]18macro_rules! dispatch_unique_runtime {19 ($collection:ident.$method:ident($($name:ident),*)) => {{20 let collection = <Runtime as pallet_common::Config>::CollectionDispatch::dispatch(<pallet_common::CollectionHandle<Runtime>>::try_get($collection)?);21 let dispatch = collection.as_dyn();2223 Ok::<_, DispatchError>(dispatch.$method($($name),*))24 }};25}2627#[macro_export]28macro_rules! impl_common_runtime_apis {29 (30 $(31 #![custom_apis]3233 $($custom_apis:tt)+34 )?35 ) => {36 use sp_std::prelude::*;37 use sp_api::impl_runtime_apis;38 use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160};39 use sp_runtime::{40 Permill,41 traits::Block as BlockT,42 transaction_validity::{TransactionSource, TransactionValidity},43 ApplyExtrinsicResult, DispatchError,44 };45 use fp_rpc::TransactionStatus;46 use pallet_transaction_payment::{47 FeeDetails, RuntimeDispatchInfo,48 };49 use pallet_evm::{50 Runner, account::CrossAccountId as _,51 Account as EVMAccount, FeeCalculator,52 };53 use runtime_common::{54 sponsoring::{SponsorshipPredict, UniqueSponsorshipPredict},55 dispatch::CollectionDispatch,56 config::ethereum::CrossAccountId,57 };58 use up_data_structs::*;596061 impl_runtime_apis! {62 $($($custom_apis)+)?6364 impl up_rpc::UniqueApi<Block, BlockNumber, CrossAccountId, AccountId> for Runtime {65 fn account_tokens(collection: CollectionId, account: CrossAccountId) -> Result<Vec<TokenId>, DispatchError> {66 dispatch_unique_runtime!(collection.account_tokens(account))67 }68 fn collection_tokens(collection: CollectionId) -> Result<Vec<TokenId>, DispatchError> {69 dispatch_unique_runtime!(collection.collection_tokens())70 }71 fn token_exists(collection: CollectionId, token: TokenId) -> Result<bool, DispatchError> {72 dispatch_unique_runtime!(collection.token_exists(token))73 }7475 fn token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {76 dispatch_unique_runtime!(collection.token_owner(token))77 }7879 fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec::<CrossAccountId>, DispatchError> {80 dispatch_unique_runtime!(collection.token_owners(token))81 }8283 fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {84 let budget = up_data_structs::budget::Value::new(10);8586 Ok(Some(<pallet_structure::Pallet<Runtime>>::find_topmost_owner(collection, token, &budget)?))87 }88 fn token_children(collection: CollectionId, token: TokenId) -> Result<Vec<TokenChild>, DispatchError> {89 Ok(<pallet_nonfungible::Pallet<Runtime>>::token_children_ids(collection, token))90 }91 fn collection_properties(92 collection: CollectionId,93 keys: Option<Vec<Vec<u8>>>94 ) -> Result<Vec<Property>, DispatchError> {95 let keys = keys.map(96 |keys| Common::bytes_keys_to_property_keys(keys)97 ).transpose()?;9899 Common::filter_collection_properties(collection, keys)100 }101102 fn token_properties(103 collection: CollectionId,104 token_id: TokenId,105 keys: Option<Vec<Vec<u8>>>106 ) -> Result<Vec<Property>, DispatchError> {107 let keys = keys.map(108 |keys| Common::bytes_keys_to_property_keys(keys)109 ).transpose()?;110111 dispatch_unique_runtime!(collection.token_properties(token_id, keys))112 }113114 fn property_permissions(115 collection: CollectionId,116 keys: Option<Vec<Vec<u8>>>117 ) -> Result<Vec<PropertyKeyPermission>, DispatchError> {118 let keys = keys.map(119 |keys| Common::bytes_keys_to_property_keys(keys)120 ).transpose()?;121122 Common::filter_property_permissions(collection, keys)123 }124125 fn token_data(126 collection: CollectionId,127 token_id: TokenId,128 keys: Option<Vec<Vec<u8>>>129 ) -> Result<TokenData<CrossAccountId>, DispatchError> {130 let token_data = TokenData {131 properties: Self::token_properties(collection, token_id, keys)?,132 owner: Self::token_owner(collection, token_id)?,133 pieces: Self::total_pieces(collection, token_id)?.unwrap_or(0),134 };135136 Ok(token_data)137 }138139 fn total_supply(collection: CollectionId) -> Result<u32, DispatchError> {140 dispatch_unique_runtime!(collection.total_supply())141 }142 fn account_balance(collection: CollectionId, account: CrossAccountId) -> Result<u32, DispatchError> {143 dispatch_unique_runtime!(collection.account_balance(account))144 }145 fn balance(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Result<u128, DispatchError> {146 dispatch_unique_runtime!(collection.balance(account, token))147 }148 fn allowance(149 collection: CollectionId,150 sender: CrossAccountId,151 spender: CrossAccountId,152 token: TokenId,153 ) -> Result<u128, DispatchError> {154 dispatch_unique_runtime!(collection.allowance(sender, spender, token))155 }156157 fn adminlist(collection: CollectionId) -> Result<Vec<CrossAccountId>, DispatchError> {158 Ok(<pallet_common::Pallet<Runtime>>::adminlist(collection))159 }160 fn allowlist(collection: CollectionId) -> Result<Vec<CrossAccountId>, DispatchError> {161 Ok(<pallet_common::Pallet<Runtime>>::allowlist(collection))162 }163 fn allowed(collection: CollectionId, user: CrossAccountId) -> Result<bool, DispatchError> {164 Ok(<pallet_common::Pallet<Runtime>>::allowed(collection, user))165 }166 fn last_token_id(collection: CollectionId) -> Result<TokenId, DispatchError> {167 dispatch_unique_runtime!(collection.last_token_id())168 }169 fn collection_by_id(collection: CollectionId) -> Result<Option<RpcCollection<AccountId>>, DispatchError> {170 Ok(<pallet_common::Pallet<Runtime>>::rpc_collection(collection))171 }172 fn collection_stats() -> Result<CollectionStats, DispatchError> {173 Ok(<pallet_common::Pallet<Runtime>>::collection_stats())174 }175 fn next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Result<Option<u64>, DispatchError> {176 Ok(<UniqueSponsorshipPredict<Runtime> as SponsorshipPredict<Runtime>>::predict(177 collection,178 account,179 token180 ))181 }182183 fn effective_collection_limits(collection: CollectionId) -> Result<Option<CollectionLimits>, DispatchError> {184 Ok(<pallet_common::Pallet<Runtime>>::effective_collection_limits(collection))185 }186187 fn total_pieces(collection: CollectionId, token_id: TokenId) -> Result<Option<u128>, DispatchError> {188 dispatch_unique_runtime!(collection.total_pieces(token_id))189 }190191 fn total_staked(staker: CrossAccountId) -> Result<u128, DispatchError> {192 Ok(<pallet_app_promotion::Pallet<Runtime>>::cross_id_total_staked(staker).unwrap_or_default())193 194 }195196 fn total_staked_per_block(staker: CrossAccountId) -> Result<Vec<(BlockNumber, u128)>, DispatchError> {197 Ok(<pallet_app_promotion::Pallet<Runtime>>::cross_id_total_staked_per_block(staker))198 }199200 fn total_staking_locked(staker: CrossAccountId) -> Result<u128, DispatchError> {201 202 Ok(<pallet_app_promotion::Pallet<Runtime>>::cross_id_locked_balance(staker))203 }204 }205206 impl rmrk_rpc::RmrkApi<207 Block,208 AccountId,209 RmrkCollectionInfo<AccountId>,210 RmrkInstanceInfo<AccountId>,211 RmrkResourceInfo,212 RmrkPropertyInfo,213 RmrkBaseInfo<AccountId>,214 RmrkPartType,215 RmrkTheme216 > for Runtime {217 fn last_collection_idx() -> Result<RmrkCollectionId, DispatchError> {218 #[cfg(feature = "rmrk")]219 return pallet_proxy_rmrk_core::rpc::last_collection_idx::<Runtime>();220221 #[cfg(not(feature = "rmrk"))]222 return unsupported!();223 }224225 #[allow(unused_variables)]226 fn collection_by_id(collection_id: RmrkCollectionId) -> Result<Option<RmrkCollectionInfo<AccountId>>, DispatchError> {227 #[cfg(feature = "rmrk")]228 return pallet_proxy_rmrk_core::rpc::collection_by_id::<Runtime>(collection_id);229230 #[cfg(not(feature = "rmrk"))]231 return unsupported!();232 }233234 #[allow(unused_variables)]235 fn nft_by_id(collection_id: RmrkCollectionId, nft_by_id: RmrkNftId) -> Result<Option<RmrkInstanceInfo<AccountId>>, DispatchError> {236 #[cfg(feature = "rmrk")]237 return pallet_proxy_rmrk_core::rpc::nft_by_id::<Runtime>(collection_id, nft_by_id);238239 #[cfg(not(feature = "rmrk"))]240 return unsupported!();241 }242243 #[allow(unused_variables)]244 fn account_tokens(account_id: AccountId, collection_id: RmrkCollectionId) -> Result<Vec<RmrkNftId>, DispatchError> {245 #[cfg(feature = "rmrk")]246 return pallet_proxy_rmrk_core::rpc::account_tokens::<Runtime>(account_id, collection_id);247248 #[cfg(not(feature = "rmrk"))]249 return unsupported!();250 }251252 #[allow(unused_variables)]253 fn nft_children(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result<Vec<RmrkNftChild>, DispatchError> {254 #[cfg(feature = "rmrk")]255 return pallet_proxy_rmrk_core::rpc::nft_children::<Runtime>(collection_id, nft_id);256257 #[cfg(not(feature = "rmrk"))]258 return unsupported!();259 }260261 #[allow(unused_variables)]262 fn collection_properties(263 collection_id: RmrkCollectionId,264 filter_keys: Option<Vec<RmrkPropertyKey>>265 ) -> Result<Vec<RmrkPropertyInfo>, DispatchError> {266 #[cfg(feature = "rmrk")]267 return pallet_proxy_rmrk_core::rpc::collection_properties::<Runtime>(collection_id, filter_keys);268269 #[cfg(not(feature = "rmrk"))]270 return unsupported!();271 }272273 #[allow(unused_variables)]274 fn nft_properties(275 collection_id: RmrkCollectionId,276 nft_id: RmrkNftId,277 filter_keys: Option<Vec<RmrkPropertyKey>>278 ) -> Result<Vec<RmrkPropertyInfo>, DispatchError> {279 #[cfg(feature = "rmrk")]280 return pallet_proxy_rmrk_core::rpc::nft_properties::<Runtime>(collection_id, nft_id, filter_keys);281282 #[cfg(not(feature = "rmrk"))]283 return unsupported!();284 }285286 #[allow(unused_variables)]287 fn nft_resources(collection_id: RmrkCollectionId,nft_id: RmrkNftId) -> Result<Vec<RmrkResourceInfo>, DispatchError> {288 #[cfg(feature = "rmrk")]289 return pallet_proxy_rmrk_core::rpc::nft_resources::<Runtime>(collection_id, nft_id);290291 #[cfg(not(feature = "rmrk"))]292 return unsupported!();293 }294295 #[allow(unused_variables)]296 fn nft_resource_priority(297 collection_id: RmrkCollectionId,298 nft_id: RmrkNftId,299 resource_id: RmrkResourceId300 ) -> Result<Option<u32>, DispatchError> {301 #[cfg(feature = "rmrk")]302 return pallet_proxy_rmrk_core::rpc::nft_resource_priority::<Runtime>(collection_id, nft_id, resource_id);303304 #[cfg(not(feature = "rmrk"))]305 return unsupported!();306 }307308 #[allow(unused_variables)]309 fn base(base_id: RmrkBaseId) -> Result<Option<RmrkBaseInfo<AccountId>>, DispatchError> {310 #[cfg(feature = "rmrk")]311 return pallet_proxy_rmrk_equip::rpc::base::<Runtime>(base_id);312313 #[cfg(not(feature = "rmrk"))]314 return unsupported!();315 }316317 #[allow(unused_variables)]318 fn base_parts(base_id: RmrkBaseId) -> Result<Vec<RmrkPartType>, DispatchError> {319 #[cfg(feature = "rmrk")]320 return pallet_proxy_rmrk_equip::rpc::base_parts::<Runtime>(base_id);321322 #[cfg(not(feature = "rmrk"))]323 return unsupported!();324 }325326 #[allow(unused_variables)]327 fn theme_names(base_id: RmrkBaseId) -> Result<Vec<RmrkThemeName>, DispatchError> {328 #[cfg(feature = "rmrk")]329 return pallet_proxy_rmrk_equip::rpc::theme_names::<Runtime>(base_id);330331 #[cfg(not(feature = "rmrk"))]332 return unsupported!();333 }334335 #[allow(unused_variables)]336 fn theme(337 base_id: RmrkBaseId,338 theme_name: RmrkThemeName,339 filter_keys: Option<Vec<RmrkPropertyKey>>340 ) -> Result<Option<RmrkTheme>, DispatchError> {341 #[cfg(feature = "rmrk")]342 return pallet_proxy_rmrk_equip::rpc::theme::<Runtime>(base_id, theme_name, filter_keys);343344 #[cfg(not(feature = "rmrk"))]345 return unsupported!();346 }347 }348349 impl sp_api::Core<Block> for Runtime {350 fn version() -> RuntimeVersion {351 VERSION352 }353354 fn execute_block(block: Block) {355 Executive::execute_block(block)356 }357358 fn initialize_block(header: &<Block as BlockT>::Header) {359 Executive::initialize_block(header)360 }361 }362363 impl sp_api::Metadata<Block> for Runtime {364 fn metadata() -> OpaqueMetadata {365 OpaqueMetadata::new(Runtime::metadata().into())366 }367 }368369 impl sp_block_builder::BlockBuilder<Block> for Runtime {370 fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult {371 Executive::apply_extrinsic(extrinsic)372 }373374 fn finalize_block() -> <Block as BlockT>::Header {375 Executive::finalize_block()376 }377378 fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {379 data.create_extrinsics()380 }381382 fn check_inherents(383 block: Block,384 data: sp_inherents::InherentData,385 ) -> sp_inherents::CheckInherentsResult {386 data.check_extrinsics(&block)387 }388389 390 391 392 }393394 impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {395 fn validate_transaction(396 source: TransactionSource,397 tx: <Block as BlockT>::Extrinsic,398 hash: <Block as BlockT>::Hash,399 ) -> TransactionValidity {400 Executive::validate_transaction(source, tx, hash)401 }402 }403404 impl sp_offchain::OffchainWorkerApi<Block> for Runtime {405 fn offchain_worker(header: &<Block as BlockT>::Header) {406 Executive::offchain_worker(header)407 }408 }409410 impl fp_rpc::EthereumRuntimeRPCApi<Block> for Runtime {411 fn chain_id() -> u64 {412 <Runtime as pallet_evm::Config>::ChainId::get()413 }414415 fn account_basic(address: H160) -> EVMAccount {416 let (account, _) = EVM::account_basic(&address);417 account418 }419420 fn gas_price() -> U256 {421 let (price, _) = <Runtime as pallet_evm::Config>::FeeCalculator::min_gas_price();422 price423 }424425 fn account_code_at(address: H160) -> Vec<u8> {426 EVM::account_codes(address)427 }428429 fn author() -> H160 {430 <pallet_evm::Pallet<Runtime>>::find_author()431 }432433 fn storage_at(address: H160, index: U256) -> H256 {434 let mut tmp = [0u8; 32];435 index.to_big_endian(&mut tmp);436 EVM::account_storages(address, H256::from_slice(&tmp[..]))437 }438439 #[allow(clippy::redundant_closure)]440 fn call(441 from: H160,442 to: H160,443 data: Vec<u8>,444 value: U256,445 gas_limit: U256,446 max_fee_per_gas: Option<U256>,447 max_priority_fee_per_gas: Option<U256>,448 nonce: Option<U256>,449 estimate: bool,450 access_list: Option<Vec<(H160, Vec<H256>)>>,451 ) -> Result<pallet_evm::CallInfo, sp_runtime::DispatchError> {452 let config = if estimate {453 let mut config = <Runtime as pallet_evm::Config>::config().clone();454 config.estimate = true;455 Some(config)456 } else {457 None458 };459460 let is_transactional = false;461 <Runtime as pallet_evm::Config>::Runner::call(462 CrossAccountId::from_eth(from),463 to,464 data,465 value,466 gas_limit.low_u64(),467 max_fee_per_gas,468 max_priority_fee_per_gas,469 nonce,470 access_list.unwrap_or_default(),471 is_transactional,472 config.as_ref().unwrap_or_else(|| <Runtime as pallet_evm::Config>::config()),473 ).map_err(|err| err.error.into())474 }475476 #[allow(clippy::redundant_closure)]477 fn create(478 from: H160,479 data: Vec<u8>,480 value: U256,481 gas_limit: U256,482 max_fee_per_gas: Option<U256>,483 max_priority_fee_per_gas: Option<U256>,484 nonce: Option<U256>,485 estimate: bool,486 access_list: Option<Vec<(H160, Vec<H256>)>>,487 ) -> Result<pallet_evm::CreateInfo, sp_runtime::DispatchError> {488 let config = if estimate {489 let mut config = <Runtime as pallet_evm::Config>::config().clone();490 config.estimate = true;491 Some(config)492 } else {493 None494 };495496 let is_transactional = false;497 <Runtime as pallet_evm::Config>::Runner::create(498 CrossAccountId::from_eth(from),499 data,500 value,501 gas_limit.low_u64(),502 max_fee_per_gas,503 max_priority_fee_per_gas,504 nonce,505 access_list.unwrap_or_default(),506 is_transactional,507 config.as_ref().unwrap_or_else(|| <Runtime as pallet_evm::Config>::config()),508 ).map_err(|err| err.error.into())509 }510511 fn current_transaction_statuses() -> Option<Vec<TransactionStatus>> {512 Ethereum::current_transaction_statuses()513 }514515 fn current_block() -> Option<pallet_ethereum::Block> {516 Ethereum::current_block()517 }518519 fn current_receipts() -> Option<Vec<pallet_ethereum::Receipt>> {520 Ethereum::current_receipts()521 }522523 fn current_all() -> (524 Option<pallet_ethereum::Block>,525 Option<Vec<pallet_ethereum::Receipt>>,526 Option<Vec<TransactionStatus>>527 ) {528 (529 Ethereum::current_block(),530 Ethereum::current_receipts(),531 Ethereum::current_transaction_statuses()532 )533 }534535 fn extrinsic_filter(xts: Vec<<Block as sp_api::BlockT>::Extrinsic>) -> Vec<pallet_ethereum::Transaction> {536 xts.into_iter().filter_map(|xt| match xt.0.function {537 Call::Ethereum(pallet_ethereum::Call::transact { transaction }) => Some(transaction),538 _ => None539 }).collect()540 }541542 fn elasticity() -> Option<Permill> {543 None544 }545 }546547 impl fp_rpc::ConvertTransactionRuntimeApi<Block> for Runtime {548 fn convert_transaction(transaction: pallet_ethereum::Transaction) -> <Block as BlockT>::Extrinsic {549 UncheckedExtrinsic::new_unsigned(550 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),551 )552 }553 }554555 impl sp_session::SessionKeys<Block> for Runtime {556 fn decode_session_keys(557 encoded: Vec<u8>,558 ) -> Option<Vec<(Vec<u8>, KeyTypeId)>> {559 SessionKeys::decode_into_raw_public_keys(&encoded)560 }561562 fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {563 SessionKeys::generate(seed)564 }565 }566567 impl sp_consensus_aura::AuraApi<Block, AuraId> for Runtime {568 fn slot_duration() -> sp_consensus_aura::SlotDuration {569 sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration())570 }571572 fn authorities() -> Vec<AuraId> {573 Aura::authorities().to_vec()574 }575 }576577 impl cumulus_primitives_core::CollectCollationInfo<Block> for Runtime {578 fn collect_collation_info(header: &<Block as BlockT>::Header) -> cumulus_primitives_core::CollationInfo {579 ParachainSystem::collect_collation_info(header)580 }581 }582583 impl frame_system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Index> for Runtime {584 fn account_nonce(account: AccountId) -> Index {585 System::account_nonce(account)586 }587 }588589 impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {590 fn query_info(uxt: <Block as BlockT>::Extrinsic, len: u32) -> RuntimeDispatchInfo<Balance> {591 TransactionPayment::query_info(uxt, len)592 }593 fn query_fee_details(uxt: <Block as BlockT>::Extrinsic, len: u32) -> FeeDetails<Balance> {594 TransactionPayment::query_fee_details(uxt, len)595 }596 }597598 599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639 #[cfg(feature = "runtime-benchmarks")]640 impl frame_benchmarking::Benchmark<Block> for Runtime {641 fn benchmark_metadata(extra: bool) -> (642 Vec<frame_benchmarking::BenchmarkList>,643 Vec<frame_support::traits::StorageInfo>,644 ) {645 use frame_benchmarking::{list_benchmark, Benchmarking, BenchmarkList};646 use frame_support::traits::StorageInfoTrait;647648 let mut list = Vec::<BenchmarkList>::new();649650 list_benchmark!(list, extra, pallet_evm_migration, EvmMigration);651 list_benchmark!(list, extra, pallet_common, Common);652 list_benchmark!(list, extra, pallet_unique, Unique);653 list_benchmark!(list, extra, pallet_structure, Structure);654 list_benchmark!(list, extra, pallet_inflation, Inflation);655 list_benchmark!(list, extra, pallet_app_promotion, Promotion);656 list_benchmark!(list, extra, pallet_fungible, Fungible);657 list_benchmark!(list, extra, pallet_nonfungible, Nonfungible);658659 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]660 list_benchmark!(list, extra, pallet_refungible, Refungible);661662 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]663 list_benchmark!(list, extra, pallet_unique_scheduler, Scheduler);664665 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]666 list_benchmark!(list, extra, pallet_proxy_rmrk_core, RmrkCore);667668 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]669 list_benchmark!(list, extra, pallet_proxy_rmrk_equip, RmrkEquip);670671 672673 let storage_info = AllPalletsReversedWithSystemFirst::storage_info();674675 return (list, storage_info)676 }677678 fn dispatch_benchmark(679 config: frame_benchmarking::BenchmarkConfig680 ) -> Result<Vec<frame_benchmarking::BenchmarkBatch>, sp_runtime::RuntimeString> {681 use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey};682683 let allowlist: Vec<TrackedStorageKey> = vec![684 685 hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(),686687 688 hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(),689 690 hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(),691 692 hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(),693 694 hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(),695696 697 hex_literal::hex!("1da53b775b270400e7e61ed5cbc5a146547f210cec367e9af919603343b9cb56").to_vec().into(),698699 700 hex_literal::hex!("3a7472616e73616374696f6e5f6c6576656c3a").to_vec().into(),701 ];702703 let mut batches = Vec::<BenchmarkBatch>::new();704 let params = (&config, &allowlist);705706 add_benchmark!(params, batches, pallet_evm_migration, EvmMigration);707 add_benchmark!(params, batches, pallet_common, Common);708 add_benchmark!(params, batches, pallet_unique, Unique);709 add_benchmark!(params, batches, pallet_structure, Structure);710 add_benchmark!(params, batches, pallet_inflation, Inflation);711 add_benchmark!(params, batches, pallet_app_promotion, Promotion);712 add_benchmark!(params, batches, pallet_fungible, Fungible);713 add_benchmark!(params, batches, pallet_nonfungible, Nonfungible);714715 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]716 add_benchmark!(params, batches, pallet_refungible, Refungible);717718 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]719 add_benchmark!(params, batches, pallet_unique_scheduler, Scheduler);720721 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]722 add_benchmark!(params, batches, pallet_proxy_rmrk_core, RmrkCore);723724 #[cfg(not(any(feature = "unique-runtime", feature = "quartz-runtime")))]725 add_benchmark!(params, batches, pallet_proxy_rmrk_equip, RmrkEquip);726727 728729 if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) }730 Ok(batches)731 }732 }733734 #[cfg(feature = "try-runtime")]735 impl frame_try_runtime::TryRuntime<Block> for Runtime {736 fn on_runtime_upgrade() -> (frame_support::pallet_prelude::Weight, frame_support::pallet_prelude::Weight) {737 log::info!("try-runtime::on_runtime_upgrade unique-chain.");738 let weight = Executive::try_runtime_upgrade().unwrap();739 (weight, crate::config::substrate::RuntimeBlockWeights::get().max_block)740 }741742 fn execute_block_no_check(block: Block) -> frame_support::pallet_prelude::Weight {743 Executive::execute_block_no_check(block)744 }745 }746 }747 }748}