From 22b45b5cd7829c07d1859bb3fffe029132d7015e Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Mon, 02 Oct 2023 19:20:36 +0000 Subject: [PATCH] Merge pull request #1000 from UniqueNetwork/fix/minting-prop-weight Refactor property writing + dev mode enhancements --- --- a/.docker/Dockerfile-chain-dev +++ b/.docker/Dockerfile-chain-dev @@ -21,7 +21,7 @@ WORKDIR /dev_chain -RUN cargo build --release +RUN cargo build --profile integration-tests --features=${NETWORK}-runtime RUN echo "$NETWORK" -CMD cargo run --release --features=${NETWORK}-runtime -- --dev -linfo --rpc-cors=all --unsafe-rpc-external +CMD cargo run --profile integration-tests --features=${NETWORK}-runtime -- --dev -linfo --rpc-cors=all --unsafe-rpc-external --- a/.docker/Dockerfile-unique +++ b/.docker/Dockerfile-unique @@ -47,7 +47,7 @@ --mount=type=cache,target=/unique_parachain/unique-chain/target \ cd unique-chain && \ echo "Using runtime features '$RUNTIME_FEATURES'" && \ - CARGO_INCREMENTAL=0 cargo build --release --features="$RUNTIME_FEATURES" --locked && \ + CARGO_INCREMENTAL=0 cargo build --profile integration-tests --features="$RUNTIME_FEATURES" --locked && \ mv ./target/release/unique-collator /unique_parachain/unique-chain/ && \ cd target/release/wbuild && find . -name "*.wasm" -exec sh -c 'mkdir -p "../../../wasm/$(dirname {})"; cp {} "../../../wasm/{}"' \; --- a/.docker/docker-compose.gov.j2 +++ b/.docker/docker-compose.gov.j2 @@ -21,4 +21,4 @@ options: max-size: "1m" max-file: "3" - command: cargo run --release --features={{ NETWORK }}-runtime,gov-test-timings -- --dev -linfo --rpc-cors=all --unsafe-rpc-external + command: cargo run --profile integration-tests --features={{ NETWORK }}-runtime,gov-test-timings -- --dev -linfo --rpc-cors=all --unsafe-rpc-external --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,10 @@ lto = true opt-level = 3 +[profile.integration-tests] +inherits = "release" +debug-assertions = true + [workspace.dependencies] # Unique app-promotion-rpc = { path = "primitives/app_promotion_rpc", default-features = false } --- a/Makefile +++ b/Makefile @@ -90,7 +90,7 @@ .PHONY: _bench _bench: - cargo run --release --features runtime-benchmarks,$(RUNTIME) -- \ + cargo run --profile production --features runtime-benchmarks,$(RUNTIME) -- \ benchmark pallet --pallet pallet-$(if $(PALLET),$(PALLET),$(error Must set PALLET)) \ --wasm-execution compiled --extrinsic '*' \ $(if $(TEMPLATE),$(TEMPLATE),--template=.maintain/frame-weight-template.hbs) --steps=50 --repeat=80 --heap-pages=4096 \ --- a/node/cli/src/cli.rs +++ b/node/cli/src/cli.rs @@ -80,10 +80,20 @@ /// an empty block will be sealed automatically /// after the `--idle-autoseal-interval` milliseconds. /// - /// The default interval is 500 milliseconds + /// The default interval is 500 milliseconds. #[structopt(default_value = "500", long)] pub idle_autoseal_interval: u64, + /// Disable auto-sealing blocks on new transactions in the `--dev` mode. + #[structopt(long)] + pub disable_autoseal_on_tx: bool, + + /// Finalization delay (in seconds) of auto-sealed blocks in the `--dev` mode. + /// + /// Disabled by default. + #[structopt(long)] + pub autoseal_finalization_delay: Option, + /// Disable automatic hardware benchmarks. /// /// By default these benchmarks are automatically ran at startup and measure --- a/node/cli/src/command.rs +++ b/node/cli/src/command.rs @@ -62,7 +62,6 @@ use sc_service::config::{BasePath, PrometheusConfig}; use sp_core::hexdisplay::HexDisplay; use sp_runtime::traits::{AccountIdConversion, Block as BlockT}; -use std::{time::Duration}; use up_common::types::opaque::{Block, RuntimeId}; @@ -480,15 +479,13 @@ if is_dev_service { info!("Running Dev service"); - - let autoseal_interval = Duration::from_millis(cli.idle_autoseal_interval); let mut config = config; config.state_pruning = Some(sc_service::PruningMode::ArchiveAll); return start_node_using_chain_runtime! { - start_dev_node(config, autoseal_interval).map_err(Into::into) + start_dev_node(config, cli.idle_autoseal_interval, cli.autoseal_finalization_delay, cli.disable_autoseal_on_tx).map_err(Into::into) }; }; --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -169,9 +169,9 @@ } impl AutosealInterval { - pub fn new(config: &Configuration, interval: Duration) -> Self { + pub fn new(config: &Configuration, interval: u64) -> Self { let _tokio_runtime = config.tokio_handle.enter(); - let interval = tokio::time::interval(interval); + let interval = tokio::time::interval(Duration::from_millis(interval)); Self { interval } } @@ -885,7 +885,9 @@ /// the parachain inherent pub fn start_dev_node( config: Configuration, - autoseal_interval: Duration, + autoseal_interval: u64, + autoseal_finalize_delay: Option, + disable_autoseal_on_tx: bool, ) -> sc_service::error::Result where Runtime: RuntimeInstance + Send + Sync + 'static, @@ -912,7 +914,10 @@ + sp_consensus_aura::AuraApi, ExecutorDispatch: NativeExecutionDispatch + 'static, { - use sc_consensus_manual_seal::{run_manual_seal, EngineCommand, ManualSealParams}; + use sc_consensus_manual_seal::{ + run_manual_seal, run_delayed_finalize, EngineCommand, ManualSealParams, + DelayedFinalizeParams, + }; use fc_consensus::FrontierBlockImport; let sc_service::PartialComponents { @@ -980,20 +985,22 @@ .pool() .validated_pool() .import_notification_stream() + .filter(move |_| futures::future::ready(!disable_autoseal_on_tx)) .map(|_| EngineCommand::SealNewBlock { create_empty: true, - finalize: false, // todo:collator finalize true + finalize: false, parent_hash: None, sender: None, }), ); let autoseal_interval = Box::pin(AutosealInterval::new(&config, autoseal_interval)); + let idle_commands_stream: Box< dyn Stream> + Send + Sync + Unpin, > = Box::new(autoseal_interval.map(|_| EngineCommand::SealNewBlock { create_empty: true, - finalize: false, // todo:collator finalize true + finalize: false, parent_hash: None, sender: None, })); @@ -1003,6 +1010,20 @@ let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; let client_set_aside_for_cidp = client.clone(); + if let Some(delay_sec) = autoseal_finalize_delay { + let spawn_handle = task_manager.spawn_handle(); + + task_manager.spawn_essential_handle().spawn_blocking( + "finalization_task", + Some("block-authoring"), + run_delayed_finalize(DelayedFinalizeParams { + client: client.clone(), + delay_sec, + spawn_handle, + }), + ); + } + task_manager.spawn_essential_handle().spawn_blocking( "authorship_task", Some("block-authoring"), --- a/pallets/app-promotion/src/weights.rs +++ b/pallets/app-promotion/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_app_promotion //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/app-promotion/src/weights.rs @@ -48,25 +48,29 @@ /// Weights for pallet_app_promotion using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { + /// Storage: Maintenance Enabled (r:1 w:0) + /// Proof: Maintenance Enabled (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) /// Storage: AppPromotion PendingUnstake (r:1 w:1) /// Proof: AppPromotion PendingUnstake (max_values: None, max_size: Some(157), added: 2632, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:3 w:3) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) + /// Storage: Balances Freezes (r:3 w:3) + /// Proof: Balances Freezes (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// Storage: System Account (r:3 w:3) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Balances Locks (r:3 w:0) + /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) /// The range of component `b` is `[0, 3]`. fn on_initialize(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `180 + b * (277 ±0)` - // Estimated: `5602 + b * (6377 ±0)` - // Minimum execution time: 3_724_000 picoseconds. - Weight::from_parts(4_538_653, 5602) - // Standard Error: 14_774 - .saturating_add(Weight::from_parts(10_368_686, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b.into()))) + // Measured: `222 + b * (285 ±0)` + // Estimated: `3622 + b * (3774 ±0)` + // Minimum execution time: 4_107_000 picoseconds. + Weight::from_parts(4_751_973, 3622) + // Standard Error: 4_668 + .saturating_add(Weight::from_parts(10_570_330, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 6377).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 3774).saturating_mul(b.into())) } /// Storage: AppPromotion Admin (r:0 w:1) /// Proof: AppPromotion Admin (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) @@ -74,8 +78,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_426_000 picoseconds. - Weight::from_parts(6_149_000, 0) + // Minimum execution time: 3_459_000 picoseconds. + Weight::from_parts(3_627_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: AppPromotion Admin (r:1 w:0) @@ -90,24 +94,26 @@ /// Proof: AppPromotion Staked (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) /// Storage: System Account (r:101 w:101) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:100 w:100) + /// Storage: Balances Freezes (r:100 w:100) + /// Proof: Balances Freezes (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) + /// Storage: Balances Locks (r:100 w:0) /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) /// Storage: AppPromotion TotalStaked (r:1 w:1) /// Proof: AppPromotion TotalStaked (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) /// The range of component `b` is `[1, 100]`. fn payout_stakers(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `531 + b * (633 ±0)` - // Estimated: `16194 + b * (32560 ±0)` - // Minimum execution time: 84_632_000 picoseconds. - Weight::from_parts(800_384, 16194) - // Standard Error: 19_457 - .saturating_add(Weight::from_parts(49_393_958, 0).saturating_mul(b.into())) + // Measured: `564 + b * (641 ±0)` + // Estimated: `3593 + b * (25550 ±0)` + // Minimum execution time: 73_245_000 picoseconds. + Weight::from_parts(74_196_000, 3593) + // Standard Error: 8_231 + .saturating_add(Weight::from_parts(49_090_053, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().reads((12_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().reads((13_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((12_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 32560).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 25550).saturating_mul(b.into())) } /// Storage: AppPromotion StakesPerAccount (r:1 w:1) /// Proof: AppPromotion StakesPerAccount (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) @@ -115,7 +121,9 @@ /// Proof: Configuration AppPromomotionConfigurationOverride (max_values: Some(1), max_size: Some(17), added: 512, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) + /// Storage: Balances Freezes (r:1 w:1) + /// Proof: Balances Freezes (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) + /// Storage: Balances Locks (r:1 w:0) /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) /// Storage: ParachainSystem ValidationData (r:1 w:0) /// Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) @@ -125,11 +133,11 @@ /// Proof: AppPromotion TotalStaked (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) fn stake() -> Weight { // Proof Size summary in bytes: - // Measured: `356` - // Estimated: `20260` - // Minimum execution time: 24_750_000 picoseconds. - Weight::from_parts(25_157_000, 20260) - .saturating_add(T::DbWeight::get().reads(7_u64)) + // Measured: `389` + // Estimated: `4764` + // Minimum execution time: 21_088_000 picoseconds. + Weight::from_parts(21_639_000, 4764) + .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: Configuration AppPromomotionConfigurationOverride (r:1 w:0) @@ -144,10 +152,10 @@ /// Proof: AppPromotion StakesPerAccount (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) fn unstake_all() -> Weight { // Proof Size summary in bytes: - // Measured: `796` - // Estimated: `35720` - // Minimum execution time: 53_670_000 picoseconds. - Weight::from_parts(54_376_000, 35720) + // Measured: `829` + // Estimated: `29095` + // Minimum execution time: 42_086_000 picoseconds. + Weight::from_parts(43_149_000, 29095) .saturating_add(T::DbWeight::get().reads(14_u64)) .saturating_add(T::DbWeight::get().writes(13_u64)) } @@ -163,10 +171,10 @@ /// Proof: AppPromotion StakesPerAccount (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) fn unstake_partial() -> Weight { // Proof Size summary in bytes: - // Measured: `796` - // Estimated: `39234` - // Minimum execution time: 58_317_000 picoseconds. - Weight::from_parts(59_059_000, 39234) + // Measured: `829` + // Estimated: `29095` + // Minimum execution time: 46_458_000 picoseconds. + Weight::from_parts(47_333_000, 29095) .saturating_add(T::DbWeight::get().reads(15_u64)) .saturating_add(T::DbWeight::get().writes(13_u64)) } @@ -176,10 +184,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn sponsor_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `1027` - // Estimated: `5842` - // Minimum execution time: 18_117_000 picoseconds. - Weight::from_parts(18_634_000, 5842) + // Measured: `1060` + // Estimated: `4325` + // Minimum execution time: 12_827_000 picoseconds. + Weight::from_parts(13_610_000, 4325) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -189,10 +197,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn stop_sponsoring_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `1059` - // Estimated: `5842` - // Minimum execution time: 16_999_000 picoseconds. - Weight::from_parts(17_417_000, 5842) + // Measured: `1092` + // Estimated: `4325` + // Minimum execution time: 11_899_000 picoseconds. + Weight::from_parts(12_303_000, 4325) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -204,8 +212,8 @@ // Proof Size summary in bytes: // Measured: `198` // Estimated: `1517` - // Minimum execution time: 14_438_000 picoseconds. - Weight::from_parts(14_931_000, 1517) + // Minimum execution time: 10_226_000 picoseconds. + Weight::from_parts(10_549_000, 1517) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -215,10 +223,10 @@ /// Proof: EvmContractHelpers Sponsoring (max_values: None, max_size: Some(62), added: 2537, mode: MaxEncodedLen) fn stop_sponsoring_contract() -> Weight { // Proof Size summary in bytes: - // Measured: `363` - // Estimated: `5044` - // Minimum execution time: 14_786_000 picoseconds. - Weight::from_parts(15_105_000, 5044) + // Measured: `396` + // Estimated: `3527` + // Minimum execution time: 10_528_000 picoseconds. + Weight::from_parts(10_842_000, 3527) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -226,25 +234,29 @@ // For backwards compatibility and tests impl WeightInfo for () { + /// Storage: Maintenance Enabled (r:1 w:0) + /// Proof: Maintenance Enabled (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) /// Storage: AppPromotion PendingUnstake (r:1 w:1) /// Proof: AppPromotion PendingUnstake (max_values: None, max_size: Some(157), added: 2632, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:3 w:3) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) + /// Storage: Balances Freezes (r:3 w:3) + /// Proof: Balances Freezes (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// Storage: System Account (r:3 w:3) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Balances Locks (r:3 w:0) + /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) /// The range of component `b` is `[0, 3]`. fn on_initialize(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `180 + b * (277 ±0)` - // Estimated: `5602 + b * (6377 ±0)` - // Minimum execution time: 3_724_000 picoseconds. - Weight::from_parts(4_538_653, 5602) - // Standard Error: 14_774 - .saturating_add(Weight::from_parts(10_368_686, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(b.into()))) + // Measured: `222 + b * (285 ±0)` + // Estimated: `3622 + b * (3774 ±0)` + // Minimum execution time: 4_107_000 picoseconds. + Weight::from_parts(4_751_973, 3622) + // Standard Error: 4_668 + .saturating_add(Weight::from_parts(10_570_330, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 6377).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 3774).saturating_mul(b.into())) } /// Storage: AppPromotion Admin (r:0 w:1) /// Proof: AppPromotion Admin (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) @@ -252,8 +264,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_426_000 picoseconds. - Weight::from_parts(6_149_000, 0) + // Minimum execution time: 3_459_000 picoseconds. + Weight::from_parts(3_627_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: AppPromotion Admin (r:1 w:0) @@ -268,24 +280,26 @@ /// Proof: AppPromotion Staked (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) /// Storage: System Account (r:101 w:101) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:100 w:100) + /// Storage: Balances Freezes (r:100 w:100) + /// Proof: Balances Freezes (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) + /// Storage: Balances Locks (r:100 w:0) /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) /// Storage: AppPromotion TotalStaked (r:1 w:1) /// Proof: AppPromotion TotalStaked (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) /// The range of component `b` is `[1, 100]`. fn payout_stakers(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `531 + b * (633 ±0)` - // Estimated: `16194 + b * (32560 ±0)` - // Minimum execution time: 84_632_000 picoseconds. - Weight::from_parts(800_384, 16194) - // Standard Error: 19_457 - .saturating_add(Weight::from_parts(49_393_958, 0).saturating_mul(b.into())) + // Measured: `564 + b * (641 ±0)` + // Estimated: `3593 + b * (25550 ±0)` + // Minimum execution time: 73_245_000 picoseconds. + Weight::from_parts(74_196_000, 3593) + // Standard Error: 8_231 + .saturating_add(Weight::from_parts(49_090_053, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().reads((12_u64).saturating_mul(b.into()))) + .saturating_add(RocksDbWeight::get().reads((13_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((12_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 32560).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 25550).saturating_mul(b.into())) } /// Storage: AppPromotion StakesPerAccount (r:1 w:1) /// Proof: AppPromotion StakesPerAccount (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) @@ -293,7 +307,9 @@ /// Proof: Configuration AppPromomotionConfigurationOverride (max_values: Some(1), max_size: Some(17), added: 512, mode: MaxEncodedLen) /// Storage: System Account (r:1 w:1) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) + /// Storage: Balances Freezes (r:1 w:1) + /// Proof: Balances Freezes (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) + /// Storage: Balances Locks (r:1 w:0) /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) /// Storage: ParachainSystem ValidationData (r:1 w:0) /// Proof Skipped: ParachainSystem ValidationData (max_values: Some(1), max_size: None, mode: Measured) @@ -303,11 +319,11 @@ /// Proof: AppPromotion TotalStaked (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) fn stake() -> Weight { // Proof Size summary in bytes: - // Measured: `356` - // Estimated: `20260` - // Minimum execution time: 24_750_000 picoseconds. - Weight::from_parts(25_157_000, 20260) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + // Measured: `389` + // Estimated: `4764` + // Minimum execution time: 21_088_000 picoseconds. + Weight::from_parts(21_639_000, 4764) + .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: Configuration AppPromomotionConfigurationOverride (r:1 w:0) @@ -322,10 +338,10 @@ /// Proof: AppPromotion StakesPerAccount (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) fn unstake_all() -> Weight { // Proof Size summary in bytes: - // Measured: `796` - // Estimated: `35720` - // Minimum execution time: 53_670_000 picoseconds. - Weight::from_parts(54_376_000, 35720) + // Measured: `829` + // Estimated: `29095` + // Minimum execution time: 42_086_000 picoseconds. + Weight::from_parts(43_149_000, 29095) .saturating_add(RocksDbWeight::get().reads(14_u64)) .saturating_add(RocksDbWeight::get().writes(13_u64)) } @@ -341,10 +357,10 @@ /// Proof: AppPromotion StakesPerAccount (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) fn unstake_partial() -> Weight { // Proof Size summary in bytes: - // Measured: `796` - // Estimated: `39234` - // Minimum execution time: 58_317_000 picoseconds. - Weight::from_parts(59_059_000, 39234) + // Measured: `829` + // Estimated: `29095` + // Minimum execution time: 46_458_000 picoseconds. + Weight::from_parts(47_333_000, 29095) .saturating_add(RocksDbWeight::get().reads(15_u64)) .saturating_add(RocksDbWeight::get().writes(13_u64)) } @@ -354,10 +370,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn sponsor_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `1027` - // Estimated: `5842` - // Minimum execution time: 18_117_000 picoseconds. - Weight::from_parts(18_634_000, 5842) + // Measured: `1060` + // Estimated: `4325` + // Minimum execution time: 12_827_000 picoseconds. + Weight::from_parts(13_610_000, 4325) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -367,10 +383,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn stop_sponsoring_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `1059` - // Estimated: `5842` - // Minimum execution time: 16_999_000 picoseconds. - Weight::from_parts(17_417_000, 5842) + // Measured: `1092` + // Estimated: `4325` + // Minimum execution time: 11_899_000 picoseconds. + Weight::from_parts(12_303_000, 4325) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -382,8 +398,8 @@ // Proof Size summary in bytes: // Measured: `198` // Estimated: `1517` - // Minimum execution time: 14_438_000 picoseconds. - Weight::from_parts(14_931_000, 1517) + // Minimum execution time: 10_226_000 picoseconds. + Weight::from_parts(10_549_000, 1517) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -393,10 +409,10 @@ /// Proof: EvmContractHelpers Sponsoring (max_values: None, max_size: Some(62), added: 2537, mode: MaxEncodedLen) fn stop_sponsoring_contract() -> Weight { // Proof Size summary in bytes: - // Measured: `363` - // Estimated: `5044` - // Minimum execution time: 14_786_000 picoseconds. - Weight::from_parts(15_105_000, 5044) + // Measured: `396` + // Estimated: `3527` + // Minimum execution time: 10_528_000 picoseconds. + Weight::from_parts(10_842_000, 3527) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } --- a/pallets/balances-adapter/src/common.rs +++ b/pallets/balances-adapter/src/common.rs @@ -172,6 +172,18 @@ fail!(>::UnsupportedOperation); } + fn get_token_properties_raw( + &self, + _token_id: TokenId, + ) -> Option { + // No token properties are defined on fungibles + None + } + + fn set_token_properties_raw(&self, _token_id: TokenId, _map: up_data_structs::TokenProperties) { + // No token properties are defined on fungibles + } + fn set_token_property_permissions( &self, _sender: &::CrossAccountId, @@ -277,6 +289,15 @@ Err(up_data_structs::TokenOwnerError::MultipleOwners) } + fn check_token_indirect_owner( + &self, + _token: TokenId, + _maybe_owner: &::CrossAccountId, + _nesting_budget: &dyn up_data_structs::budget::Budget, + ) -> Result { + Ok(false) + } + fn token_owners(&self, _token: TokenId) -> Vec<::CrossAccountId> { vec![] } --- a/pallets/balances-adapter/src/erc.rs +++ b/pallets/balances-adapter/src/erc.rs @@ -25,7 +25,7 @@ } fn approve(&mut self, _caller: Caller, _spender: Address, _amount: U256) -> Result { - Err("Approve not supported".into()) + Err("approve not supported".into()) } fn balance_of(&self, owner: Address) -> Result { --- a/pallets/collator-selection/src/weights.rs +++ b/pallets/collator-selection/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_collator_selection //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/collator-selection/src/weights.rs @@ -57,11 +57,11 @@ fn add_invulnerable(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + b * (45 ±0)` - // Estimated: `7485 + b * (45 ±0)` - // Minimum execution time: 14_147_000 picoseconds. - Weight::from_parts(15_313_627, 7485) - // Standard Error: 1_744 - .saturating_add(Weight::from_parts(178_890, 0).saturating_mul(b.into())) + // Estimated: `3873 + b * (45 ±0)` + // Minimum execution time: 10_975_000 picoseconds. + Weight::from_parts(11_362_608, 3873) + // Standard Error: 411 + .saturating_add(Weight::from_parts(152_014, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 45).saturating_mul(b.into())) @@ -73,10 +73,10 @@ // Proof Size summary in bytes: // Measured: `96 + b * (32 ±0)` // Estimated: `1806` - // Minimum execution time: 9_426_000 picoseconds. - Weight::from_parts(9_693_408, 1806) - // Standard Error: 1_638 - .saturating_add(Weight::from_parts(227_917, 0).saturating_mul(b.into())) + // Minimum execution time: 6_369_000 picoseconds. + Weight::from_parts(6_604_933, 1806) + // Standard Error: 424 + .saturating_add(Weight::from_parts(145_929, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -86,18 +86,20 @@ /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) /// Storage: Configuration CollatorSelectionLicenseBondOverride (r:1 w:0) /// Proof: Configuration CollatorSelectionLicenseBondOverride (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// The range of component `c` is `[1, 9]`. fn get_license(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `610 + c * (26 ±0)` - // Estimated: `9099 + c * (28 ±0)` - // Minimum execution time: 22_741_000 picoseconds. - Weight::from_parts(24_210_604, 9099) - // Standard Error: 2_703 - .saturating_add(Weight::from_parts(255_686, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - .saturating_add(Weight::from_parts(0, 28).saturating_mul(c.into())) + // Measured: `668 + c * (46 ±0)` + // Estimated: `4131 + c * (47 ±0)` + // Minimum execution time: 23_857_000 picoseconds. + Weight::from_parts(25_984_655, 4131) + // Standard Error: 4_364 + .saturating_add(Weight::from_parts(521_198, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(Weight::from_parts(0, 47).saturating_mul(c.into())) } /// Storage: CollatorSelection LicenseDepositOf (r:1 w:0) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) @@ -114,12 +116,12 @@ /// The range of component `c` is `[1, 7]`. fn onboard(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `445 + c * (54 ±0)` - // Estimated: `10119` - // Minimum execution time: 20_397_000 picoseconds. - Weight::from_parts(21_415_013, 10119) - // Standard Error: 4_086 - .saturating_add(Weight::from_parts(252_810, 0).saturating_mul(c.into())) + // Measured: `414 + c * (54 ±0)` + // Estimated: `3529` + // Minimum execution time: 14_337_000 picoseconds. + Weight::from_parts(14_827_525, 3529) + // Standard Error: 1_210 + .saturating_add(Weight::from_parts(298_748, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -127,15 +129,15 @@ /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 10]`. + /// The range of component `c` is `[1, 8]`. fn offboard(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `111 + c * (32 ±0)` // Estimated: `1806` - // Minimum execution time: 10_543_000 picoseconds. - Weight::from_parts(11_227_541, 1806) - // Standard Error: 1_699 - .saturating_add(Weight::from_parts(181_030, 0).saturating_mul(c.into())) + // Minimum execution time: 7_320_000 picoseconds. + Weight::from_parts(7_646_004, 1806) + // Standard Error: 479 + .saturating_add(Weight::from_parts(160_089, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -143,37 +145,41 @@ /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: CollatorSelection LicenseDepositOf (r:1 w:1) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 10]`. + /// The range of component `c` is `[1, 8]`. fn release_license(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `306 + c * (61 ±0)` - // Estimated: `5335` - // Minimum execution time: 22_214_000 picoseconds. - Weight::from_parts(24_373_981, 5335) - // Standard Error: 8_018 - .saturating_add(Weight::from_parts(405_404, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `328 + c * (103 ±0)` + // Estimated: `3834` + // Minimum execution time: 22_821_000 picoseconds. + Weight::from_parts(23_668_202, 3834) + // Standard Error: 6_654 + .saturating_add(Weight::from_parts(844_978, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: CollatorSelection Candidates (r:1 w:1) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: CollatorSelection LicenseDepositOf (r:1 w:1) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 10]`. + /// The range of component `c` is `[1, 8]`. fn force_release_license(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `306 + c * (61 ±0)` - // Estimated: `5335` - // Minimum execution time: 22_159_000 picoseconds. - Weight::from_parts(24_200_796, 5335) - // Standard Error: 8_328 - .saturating_add(Weight::from_parts(312_138, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `328 + c * (103 ±0)` + // Estimated: `3834` + // Minimum execution time: 22_462_000 picoseconds. + Weight::from_parts(23_215_875, 3834) + // Standard Error: 6_450 + .saturating_add(Weight::from_parts(830_887, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -184,9 +190,9 @@ fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `155` - // Estimated: `7729` - // Minimum execution time: 16_520_000 picoseconds. - Weight::from_parts(16_933_000, 7729) + // Estimated: `6196` + // Minimum execution time: 17_624_000 picoseconds. + Weight::from_parts(18_025_000, 6196) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -194,32 +200,34 @@ /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: Configuration CollatorSelectionKickThresholdOverride (r:1 w:0) /// Proof: Configuration CollatorSelectionKickThresholdOverride (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: CollatorSelection LastAuthoredBlock (r:10 w:0) + /// Storage: CollatorSelection LastAuthoredBlock (r:8 w:0) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) /// Storage: CollatorSelection Invulnerables (r:1 w:0) /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: System BlockWeight (r:1 w:1) /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) - /// Storage: CollatorSelection LicenseDepositOf (r:9 w:9) + /// Storage: CollatorSelection LicenseDepositOf (r:7 w:7) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:10 w:10) + /// Storage: Balances Holds (r:7 w:7) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) + /// Storage: System Account (r:8 w:8) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// The range of component `r` is `[1, 10]`. - /// The range of component `c` is `[1, 10]`. + /// The range of component `r` is `[1, 8]`. + /// The range of component `c` is `[1, 8]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `562 + r * (190 ±0) + c * (83 ±0)` - // Estimated: `91818518943723 + c * (2519 ±0) + r * (5142 ±1)` - // Minimum execution time: 16_153_000 picoseconds. - Weight::from_parts(16_601_000, 91818518943723) - // Standard Error: 119_095 - .saturating_add(Weight::from_parts(10_660_813, 0).saturating_mul(c.into())) + // Measured: `725 + c * (84 ±0) + r * (254 ±0)` + // Estimated: `6196 + c * (2519 ±0) + r * (2844 ±0)` + // Minimum execution time: 11_318_000 picoseconds. + Weight::from_parts(11_615_000, 6196) + // Standard Error: 69_557 + .saturating_add(Weight::from_parts(13_016_275, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 5142).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2844).saturating_mul(r.into())) } } @@ -235,11 +243,11 @@ fn add_invulnerable(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + b * (45 ±0)` - // Estimated: `7485 + b * (45 ±0)` - // Minimum execution time: 14_147_000 picoseconds. - Weight::from_parts(15_313_627, 7485) - // Standard Error: 1_744 - .saturating_add(Weight::from_parts(178_890, 0).saturating_mul(b.into())) + // Estimated: `3873 + b * (45 ±0)` + // Minimum execution time: 10_975_000 picoseconds. + Weight::from_parts(11_362_608, 3873) + // Standard Error: 411 + .saturating_add(Weight::from_parts(152_014, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 45).saturating_mul(b.into())) @@ -251,10 +259,10 @@ // Proof Size summary in bytes: // Measured: `96 + b * (32 ±0)` // Estimated: `1806` - // Minimum execution time: 9_426_000 picoseconds. - Weight::from_parts(9_693_408, 1806) - // Standard Error: 1_638 - .saturating_add(Weight::from_parts(227_917, 0).saturating_mul(b.into())) + // Minimum execution time: 6_369_000 picoseconds. + Weight::from_parts(6_604_933, 1806) + // Standard Error: 424 + .saturating_add(Weight::from_parts(145_929, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -264,18 +272,20 @@ /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) /// Storage: Configuration CollatorSelectionLicenseBondOverride (r:1 w:0) /// Proof: Configuration CollatorSelectionLicenseBondOverride (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// The range of component `c` is `[1, 9]`. fn get_license(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `610 + c * (26 ±0)` - // Estimated: `9099 + c * (28 ±0)` - // Minimum execution time: 22_741_000 picoseconds. - Weight::from_parts(24_210_604, 9099) - // Standard Error: 2_703 - .saturating_add(Weight::from_parts(255_686, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - .saturating_add(Weight::from_parts(0, 28).saturating_mul(c.into())) + // Measured: `668 + c * (46 ±0)` + // Estimated: `4131 + c * (47 ±0)` + // Minimum execution time: 23_857_000 picoseconds. + Weight::from_parts(25_984_655, 4131) + // Standard Error: 4_364 + .saturating_add(Weight::from_parts(521_198, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(Weight::from_parts(0, 47).saturating_mul(c.into())) } /// Storage: CollatorSelection LicenseDepositOf (r:1 w:0) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) @@ -292,12 +302,12 @@ /// The range of component `c` is `[1, 7]`. fn onboard(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `445 + c * (54 ±0)` - // Estimated: `10119` - // Minimum execution time: 20_397_000 picoseconds. - Weight::from_parts(21_415_013, 10119) - // Standard Error: 4_086 - .saturating_add(Weight::from_parts(252_810, 0).saturating_mul(c.into())) + // Measured: `414 + c * (54 ±0)` + // Estimated: `3529` + // Minimum execution time: 14_337_000 picoseconds. + Weight::from_parts(14_827_525, 3529) + // Standard Error: 1_210 + .saturating_add(Weight::from_parts(298_748, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -305,15 +315,15 @@ /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 10]`. + /// The range of component `c` is `[1, 8]`. fn offboard(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `111 + c * (32 ±0)` // Estimated: `1806` - // Minimum execution time: 10_543_000 picoseconds. - Weight::from_parts(11_227_541, 1806) - // Standard Error: 1_699 - .saturating_add(Weight::from_parts(181_030, 0).saturating_mul(c.into())) + // Minimum execution time: 7_320_000 picoseconds. + Weight::from_parts(7_646_004, 1806) + // Standard Error: 479 + .saturating_add(Weight::from_parts(160_089, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -321,37 +331,41 @@ /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: CollatorSelection LicenseDepositOf (r:1 w:1) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 10]`. + /// The range of component `c` is `[1, 8]`. fn release_license(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `306 + c * (61 ±0)` - // Estimated: `5335` - // Minimum execution time: 22_214_000 picoseconds. - Weight::from_parts(24_373_981, 5335) - // Standard Error: 8_018 - .saturating_add(Weight::from_parts(405_404, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `328 + c * (103 ±0)` + // Estimated: `3834` + // Minimum execution time: 22_821_000 picoseconds. + Weight::from_parts(23_668_202, 3834) + // Standard Error: 6_654 + .saturating_add(Weight::from_parts(844_978, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: CollatorSelection Candidates (r:1 w:1) /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: CollatorSelection LicenseDepositOf (r:1 w:1) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + /// Storage: Balances Holds (r:1 w:1) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 10]`. + /// The range of component `c` is `[1, 8]`. fn force_release_license(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `306 + c * (61 ±0)` - // Estimated: `5335` - // Minimum execution time: 22_159_000 picoseconds. - Weight::from_parts(24_200_796, 5335) - // Standard Error: 8_328 - .saturating_add(Weight::from_parts(312_138, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `328 + c * (103 ±0)` + // Estimated: `3834` + // Minimum execution time: 22_462_000 picoseconds. + Weight::from_parts(23_215_875, 3834) + // Standard Error: 6_450 + .saturating_add(Weight::from_parts(830_887, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) @@ -362,9 +376,9 @@ fn note_author() -> Weight { // Proof Size summary in bytes: // Measured: `155` - // Estimated: `7729` - // Minimum execution time: 16_520_000 picoseconds. - Weight::from_parts(16_933_000, 7729) + // Estimated: `6196` + // Minimum execution time: 17_624_000 picoseconds. + Weight::from_parts(18_025_000, 6196) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -372,32 +386,34 @@ /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: Configuration CollatorSelectionKickThresholdOverride (r:1 w:0) /// Proof: Configuration CollatorSelectionKickThresholdOverride (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: CollatorSelection LastAuthoredBlock (r:10 w:0) + /// Storage: CollatorSelection LastAuthoredBlock (r:8 w:0) /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) /// Storage: CollatorSelection Invulnerables (r:1 w:0) /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(321), added: 816, mode: MaxEncodedLen) /// Storage: System BlockWeight (r:1 w:1) /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) - /// Storage: CollatorSelection LicenseDepositOf (r:9 w:9) + /// Storage: CollatorSelection LicenseDepositOf (r:7 w:7) /// Proof: CollatorSelection LicenseDepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:10 w:10) + /// Storage: Balances Holds (r:7 w:7) + /// Proof: Balances Holds (max_values: None, max_size: Some(369), added: 2844, mode: MaxEncodedLen) + /// Storage: System Account (r:8 w:8) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// The range of component `r` is `[1, 10]`. - /// The range of component `c` is `[1, 10]`. + /// The range of component `r` is `[1, 8]`. + /// The range of component `c` is `[1, 8]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `562 + r * (190 ±0) + c * (83 ±0)` - // Estimated: `91818518943723 + c * (2519 ±0) + r * (5142 ±1)` - // Minimum execution time: 16_153_000 picoseconds. - Weight::from_parts(16_601_000, 91818518943723) - // Standard Error: 119_095 - .saturating_add(Weight::from_parts(10_660_813, 0).saturating_mul(c.into())) + // Measured: `725 + c * (84 ±0) + r * (254 ±0)` + // Estimated: `6196 + c * (2519 ±0) + r * (2844 ±0)` + // Minimum execution time: 11_318_000 picoseconds. + Weight::from_parts(11_615_000, 6196) + // Standard Error: 69_557 + .saturating_add(Weight::from_parts(13_016_275, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 5142).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2844).saturating_mul(r.into())) } } --- a/pallets/common/src/benchmarking.rs +++ b/pallets/common/src/benchmarking.rs @@ -22,8 +22,9 @@ use frame_benchmarking::{benchmarks, account}; use up_data_structs::{ CollectionMode, CreateCollectionData, CollectionId, Property, PropertyKey, PropertyValue, - CollectionPermissions, NestingPermissions, AccessMode, MAX_COLLECTION_NAME_LENGTH, - MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH, MAX_PROPERTIES_PER_ITEM, + CollectionPermissions, NestingPermissions, AccessMode, PropertiesPermissionMap, + MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH, + MAX_PROPERTIES_PER_ITEM, }; use frame_support::{ traits::{Get, fungible::Balanced, Imbalance, tokens::Precision}, @@ -123,6 +124,16 @@ ) } +pub fn load_is_admin_and_property_permissions( + collection: &CollectionHandle, + sender: &T::CrossAccountId, +) -> (bool, PropertiesPermissionMap) { + ( + collection.is_owner_or_admin(sender), + >::property_permissions(collection.id), + ) +} + /// Helper macros, which handles all benchmarking preparation in semi-declarative way /// /// `name` is a substrate account @@ -215,4 +226,12 @@ assert_eq!(collection_handle.permissions.access(), AccessMode::AllowList); }: {collection_handle.check_allowlist(&sender)?;} + + init_token_properties_common { + bench_init!{ + owner: sub; collection: collection(owner); + sender: sub; + sender: cross_from_sub(sender); + }; + }: {load_is_admin_and_property_permissions(&collection, &sender);} } --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -56,6 +56,7 @@ use core::{ ops::{Deref, DerefMut}, slice::from_ref, + marker::PhantomData, }; use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder}; use sp_std::vec::Vec; @@ -97,6 +98,9 @@ pub mod helpers; #[allow(missing_docs)] pub mod weights; + +use weights::WeightInfo; + /// Weight info. pub type SelfWeightOf = ::WeightInfo; @@ -863,18 +867,6 @@ ), QueryKind = OptionQuery, >; -} - -/// Represents the change mode for the token property. -pub enum SetPropertyMode { - /// The token already exists. - ExistingToken, - - /// New token. - NewToken { - /// The creator of the token is the recipient. - mint_target_is_sender: bool, - }, } /// Value representation with delayed initialization time. @@ -892,19 +884,33 @@ } } - /// Get the value. If it call furst time the value will be initialized. + /// Get the value. If it is called the first time, the value will be initialized. pub fn value(&mut self) -> &T { - if self.value.is_none() { - self.value = Some(self.f.take().unwrap()()) - } + self.compute_value_if_not_already(); + self.value.as_ref().unwrap() + } + + /// Get the value. If it is called the first time, the value will be initialized. + pub fn value_mut(&mut self) -> &mut T { + self.compute_value_if_not_already(); + self.value.as_mut().unwrap() + } - self.value.as_ref().unwrap() + fn into_inner(mut self) -> T { + self.compute_value_if_not_already(); + self.value.unwrap() } - /// Is value initialized. + /// Is value initialized? pub fn has_value(&self) -> bool { self.value.is_some() } + + fn compute_value_if_not_already(&mut self) { + if self.value.is_none() { + self.value = Some(self.f.take().unwrap()()) + } + } } fn check_token_permissions( @@ -926,10 +932,19 @@ fail!(>::NoPermission); } - let token_certainly_exist = is_token_owner.has_value() && (*is_token_owner.value())?; - if !token_certainly_exist && !is_token_exist.value() { - fail!(>::TokenNotFound); + let token_exist_due_to_owner_check_success = + is_token_owner.has_value() && (*is_token_owner.value())?; + + // If the token owner check has occurred and succeeded, + // we know the token exists (otherwise, the owner check must fail). + if !token_exist_due_to_owner_check_success { + // If the token owner check didn't occur, + // we must check the token's existence ourselves. + if !is_token_exist.value() { + fail!(>::TokenNotFound); + } } + Ok(()) } @@ -1308,92 +1323,6 @@ } >::set(collection.id, stored_properties); - - Ok(()) - } - - /// A batch operation to add, edit or remove properties for a token. - /// It sets or removes a token's properties according to - /// `properties_updates` contents: - /// * sets a property under the with the value provided `(, Some())` - /// * removes a property under the if the value is `None` `(, None)`. - /// - /// All affected properties should have `mutable` permission - /// to be **deleted** or to be **set more than once**, - /// and the sender should have permission to edit those properties. - /// - /// This function fires an event for each property change. - /// In case of an error, all the changes (including the events) will be reverted - /// since the function is transactional. - #[allow(clippy::too_many_arguments)] - pub fn modify_token_properties( - collection: &CollectionHandle, - sender: &T::CrossAccountId, - token_id: TokenId, - is_token_exist: &mut LazyValue, - properties_updates: impl Iterator)>, - mut stored_properties: TokenProperties, - is_token_owner: &mut LazyValue, FTO>, - set_token_properties: impl FnOnce(TokenProperties), - log: evm_coder::ethereum::Log, - ) -> DispatchResult - where - FTO: FnOnce() -> Result, - FTE: FnOnce() -> bool, - { - let mut is_collection_admin = LazyValue::new(|| collection.is_owner_or_admin(sender)); - let permissions = Self::property_permissions(collection.id); - - let mut changed = false; - for (key, value) in properties_updates { - let permission = permissions - .get(&key) - .cloned() - .unwrap_or_else(PropertyPermission::none); - - let property_exists = stored_properties.get(&key).is_some(); - - match permission { - PropertyPermission { mutable: false, .. } if property_exists => { - return Err(>::NoPermission.into()); - } - - PropertyPermission { - collection_admin, - token_owner, - .. - } => check_token_permissions::( - collection_admin, - token_owner, - &mut is_collection_admin, - is_token_owner, - is_token_exist, - )?, - } - - match value { - Some(value) => { - stored_properties - .try_set(key.clone(), value) - .map_err(>::from)?; - - Self::deposit_event(Event::TokenPropertySet(collection.id, token_id, key)); - } - None => { - stored_properties.remove(&key).map_err(>::from)?; - - Self::deposit_event(Event::TokenPropertyDeleted(collection.id, token_id, key)); - } - } - - changed = true; - } - - if changed { - >::deposit_log(log); - } - - set_token_properties(stored_properties); Ok(()) } @@ -2166,6 +2095,17 @@ budget: &dyn Budget, ) -> DispatchResultWithPostInfo; + /// Get token properties raw map. + /// + /// * `token_id` - The token which properties are needed. + fn get_token_properties_raw(&self, token_id: TokenId) -> Option; + + /// Set token properties raw map. + /// + /// * `token_id` - The token for which the properties are being set. + /// * `map` - The raw map containing the token's properties. + fn set_token_properties_raw(&self, token_id: TokenId, map: TokenProperties); + /// Set token property permissions. /// /// * `sender` - Must be either the owner of the token or its admin. @@ -2309,6 +2249,18 @@ /// * `token` - The token for which you need to find out the owner. fn token_owner(&self, token: TokenId) -> Result; + /// Checks if the `maybe_owner` is the indirect owner of the `token`. + /// + /// * `token` - Id token to check. + /// * `maybe_owner` - The account to check. + /// * `nesting_budget` - A budget that can be spent on nesting tokens. + fn check_token_indirect_owner( + &self, + token: TokenId, + maybe_owner: &T::CrossAccountId, + nesting_budget: &dyn Budget, + ) -> Result; + /// Returns 10 tokens owners in no particular order. /// /// * `token` - The token for which you need to find out the owners. @@ -2420,6 +2372,352 @@ } } +/// A marker structure that enables the writer implementation +/// to provide the interface to write properties to **newly created** tokens. +pub struct NewTokenPropertyWriter; + +/// A marker structure that enables the writer implementation +/// to provide the interface to write properties to **already existing** tokens. +pub struct ExistingTokenPropertyWriter; + +/// The type-safe interface for writing properties (setting or deleting) to tokens. +/// It has two distinct implementations for newly created tokens and existing ones. +/// +/// This type utilizes the lazy evaluation to avoid repeating the computation +/// of several performance-heavy or PoV-heavy tasks, +/// such as checking the indirect ownership or reading the token property permissions. +pub struct PropertyWriter< + 'a, + T, + Handle, + WriterVariant, + FIsAdmin, + FPropertyPermissions, + FCheckTokenExist, + FGetProperties, +> where + T: Config, + FIsAdmin: FnOnce() -> bool, + FPropertyPermissions: FnOnce() -> PropertiesPermissionMap, +{ + collection: &'a Handle, + is_collection_admin: LazyValue, + property_permissions: LazyValue, + check_token_exist: FCheckTokenExist, + get_properties: FGetProperties, + _phantom: PhantomData<(T, WriterVariant)>, +} + +impl<'a, T, Handle, FIsAdmin, FPropertyPermissions, FCheckTokenExist, FGetProperties> + PropertyWriter< + 'a, + T, + Handle, + NewTokenPropertyWriter, + FIsAdmin, + FPropertyPermissions, + FCheckTokenExist, + FGetProperties, + > where + T: Config, + Handle: CommonCollectionOperations + Deref>, + FIsAdmin: FnOnce() -> bool, + FPropertyPermissions: FnOnce() -> PropertiesPermissionMap, + FCheckTokenExist: Copy + FnOnce(TokenId) -> bool, + FGetProperties: Copy + FnOnce(TokenId) -> TokenProperties, +{ + /// A function to write properties to a **newly created** token. + pub fn write_token_properties( + &mut self, + mint_target_is_sender: bool, + token_id: TokenId, + properties_updates: impl Iterator, + log: evm_coder::ethereum::Log, + ) -> DispatchResult { + self.internal_write_token_properties( + token_id, + properties_updates.map(|p| (p.key, Some(p.value))), + |_| Ok(mint_target_is_sender), + log, + ) + } +} + +impl<'a, T, Handle, FIsAdmin, FPropertyPermissions, FCheckTokenExist, FGetProperties> + PropertyWriter< + 'a, + T, + Handle, + ExistingTokenPropertyWriter, + FIsAdmin, + FPropertyPermissions, + FCheckTokenExist, + FGetProperties, + > where + T: Config, + Handle: CommonCollectionOperations + Deref>, + FIsAdmin: FnOnce() -> bool, + FPropertyPermissions: FnOnce() -> PropertiesPermissionMap, + FCheckTokenExist: Copy + FnOnce(TokenId) -> bool, + FGetProperties: Copy + FnOnce(TokenId) -> TokenProperties, +{ + /// A function to write properties to an **already existing** token. + pub fn write_token_properties( + &mut self, + sender: &T::CrossAccountId, + token_id: TokenId, + properties_updates: impl Iterator)>, + nesting_budget: &dyn Budget, + log: evm_coder::ethereum::Log, + ) -> DispatchResult { + self.internal_write_token_properties( + token_id, + properties_updates, + |collection| collection.check_token_indirect_owner(token_id, sender, nesting_budget), + log, + ) + } +} + +impl< + 'a, + T, + Handle, + WriterVariant, + FIsAdmin, + FPropertyPermissions, + FCheckTokenExist, + FGetProperties, + > + PropertyWriter< + 'a, + T, + Handle, + WriterVariant, + FIsAdmin, + FPropertyPermissions, + FCheckTokenExist, + FGetProperties, + > where + T: Config, + Handle: CommonCollectionOperations + Deref>, + FIsAdmin: FnOnce() -> bool, + FPropertyPermissions: FnOnce() -> PropertiesPermissionMap, + FCheckTokenExist: Copy + FnOnce(TokenId) -> bool, + FGetProperties: Copy + FnOnce(TokenId) -> TokenProperties, +{ + fn internal_write_token_properties( + &mut self, + token_id: TokenId, + properties_updates: impl Iterator)>, + check_token_owner: FCheckTokenOwner, + log: evm_coder::ethereum::Log, + ) -> DispatchResult + where + FCheckTokenOwner: FnOnce(&Handle) -> Result, + { + let get_properties = self.get_properties; + let mut stored_properties = LazyValue::new(move || get_properties(token_id)); + + let mut is_token_owner = LazyValue::new(|| check_token_owner(self.collection)); + + let check_token_exist = self.check_token_exist; + let mut is_token_exist = LazyValue::new(move || check_token_exist(token_id)); + + for (key, value) in properties_updates { + let permission = self + .property_permissions + .value() + .get(&key) + .cloned() + .unwrap_or_else(PropertyPermission::none); + + match permission { + PropertyPermission { mutable: false, .. } + if stored_properties.value().get(&key).is_some() => + { + return Err(>::NoPermission.into()); + } + + PropertyPermission { + collection_admin, + token_owner, + .. + } => check_token_permissions::( + collection_admin, + token_owner, + &mut self.is_collection_admin, + &mut is_token_owner, + &mut is_token_exist, + )?, + } + + match value { + Some(value) => { + stored_properties + .value_mut() + .try_set(key.clone(), value) + .map_err(>::from)?; + + >::deposit_event(Event::TokenPropertySet( + self.collection.id, + token_id, + key, + )); + } + None => { + stored_properties + .value_mut() + .remove(&key) + .map_err(>::from)?; + + >::deposit_event(Event::TokenPropertyDeleted( + self.collection.id, + token_id, + key, + )); + } + } + } + + let properties_changed = stored_properties.has_value(); + if properties_changed { + >::deposit_log(log); + + self.collection + .set_token_properties_raw(token_id, stored_properties.into_inner()); + } + + Ok(()) + } +} + +/// Create a [`PropertyWriter`] for newly created tokens. +pub fn property_writer_for_new_token<'a, T, Handle>( + collection: &'a Handle, + sender: &'a T::CrossAccountId, +) -> PropertyWriter< + 'a, + T, + Handle, + NewTokenPropertyWriter, + impl FnOnce() -> bool + 'a, + impl FnOnce() -> PropertiesPermissionMap + 'a, + impl Copy + FnOnce(TokenId) -> bool + 'a, + impl Copy + FnOnce(TokenId) -> TokenProperties + 'a, +> +where + T: Config, + Handle: CommonCollectionOperations + Deref>, +{ + PropertyWriter { + collection, + is_collection_admin: LazyValue::new(|| collection.is_owner_or_admin(sender)), + property_permissions: LazyValue::new(|| >::property_permissions(collection.id)), + check_token_exist: |token_id| { + debug_assert!(collection.token_exists(token_id)); + true + }, + get_properties: |token_id| { + debug_assert!(collection.get_token_properties_raw(token_id).is_none()); + TokenProperties::new() + }, + _phantom: PhantomData, + } +} + +#[cfg(feature = "runtime-benchmarks")] +/// Create a `PropertyWriter` with preloaded `is_collection_admin` and `property_permissions. +/// Also: +/// * it will return `true` for the token ownership check. +/// * it will return empty stored properties without reading them from the storage. +pub fn collection_info_loaded_property_writer( + collection: &Handle, + is_collection_admin: bool, + property_permissions: PropertiesPermissionMap, +) -> PropertyWriter< + T, + Handle, + NewTokenPropertyWriter, + impl FnOnce() -> bool, + impl FnOnce() -> PropertiesPermissionMap, + impl Copy + FnOnce(TokenId) -> bool, + impl Copy + FnOnce(TokenId) -> TokenProperties, +> +where + T: Config, + Handle: CommonCollectionOperations + Deref>, +{ + PropertyWriter { + collection, + is_collection_admin: LazyValue::new(move || is_collection_admin), + property_permissions: LazyValue::new(move || property_permissions), + check_token_exist: |_token_id| true, + get_properties: |_token_id| TokenProperties::new(), + _phantom: PhantomData, + } +} + +/// Create a [`PropertyWriter`] for already existing tokens. +pub fn property_writer_for_existing_token<'a, T, Handle>( + collection: &'a Handle, + sender: &'a T::CrossAccountId, +) -> PropertyWriter< + 'a, + T, + Handle, + ExistingTokenPropertyWriter, + impl FnOnce() -> bool + 'a, + impl FnOnce() -> PropertiesPermissionMap + 'a, + impl Copy + FnOnce(TokenId) -> bool + 'a, + impl Copy + FnOnce(TokenId) -> TokenProperties + 'a, +> +where + T: Config, + Handle: CommonCollectionOperations + Deref>, +{ + PropertyWriter { + collection, + is_collection_admin: LazyValue::new(|| collection.is_owner_or_admin(sender)), + property_permissions: LazyValue::new(|| >::property_permissions(collection.id)), + check_token_exist: |token_id| collection.token_exists(token_id), + get_properties: |token_id| { + collection + .get_token_properties_raw(token_id) + .unwrap_or_default() + }, + _phantom: PhantomData, + } +} + +/// Computes the weight delta for newly created tokens with properties. +/// * `properties_nums` - The properties num of each created token. +/// * `init_token_properties` - The function to obtain the weight from a token's properties num. +pub fn init_token_properties_delta Weight>( + properties_nums: impl Iterator, + init_token_properties: I, +) -> Weight { + let mut delta = properties_nums + .filter_map(|properties_num| { + if properties_num > 0 { + Some(init_token_properties(properties_num)) + } else { + None + } + }) + .fold(Weight::zero(), |a, b| a.saturating_add(b)); + + // If at least once the `init_token_properties` was called, + // it means at least one newly created token has properties. + // Becuase of that, some common collection data also was loaded and we need to add this weight. + // However, these common data was loaded only once which is guaranteed by the `PropertyWriter`. + if !delta.is_zero() { + delta = delta.saturating_add(>::init_token_properties_common()) + } + + delta +} + #[cfg(any(feature = "tests", test))] #[allow(missing_docs)] pub mod tests { --- a/pallets/common/src/weights.rs +++ b/pallets/common/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_common //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-30, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/common/src/weights.rs @@ -36,6 +36,7 @@ fn set_collection_properties(b: u32, ) -> Weight; fn delete_collection_properties(b: u32, ) -> Weight; fn check_accesslist() -> Weight; + fn init_token_properties_common() -> Weight; } /// Weights for pallet_common using the Substrate node and recommended hardware. @@ -46,12 +47,12 @@ /// The range of component `b` is `[0, 64]`. fn set_collection_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `265` + // Measured: `298` // Estimated: `44457` - // Minimum execution time: 6_805_000 picoseconds. - Weight::from_parts(6_965_000, 44457) - // Standard Error: 20_175 - .saturating_add(Weight::from_parts(6_191_369, 0).saturating_mul(b.into())) + // Minimum execution time: 4_987_000 picoseconds. + Weight::from_parts(5_119_000, 44457) + // Standard Error: 7_609 + .saturating_add(Weight::from_parts(5_750_459, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -60,12 +61,12 @@ /// The range of component `b` is `[0, 64]`. fn delete_collection_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `270 + b * (33030 ±0)` + // Measured: `303 + b * (33030 ±0)` // Estimated: `44457` - // Minimum execution time: 6_284_000 picoseconds. - Weight::from_parts(6_416_000, 44457) - // Standard Error: 81_929 - .saturating_add(Weight::from_parts(23_972_425, 0).saturating_mul(b.into())) + // Minimum execution time: 4_923_000 picoseconds. + Weight::from_parts(5_074_000, 44457) + // Standard Error: 36_651 + .saturating_add(Weight::from_parts(23_145_677, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -73,12 +74,24 @@ /// Proof: Common Allowlist (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) fn check_accesslist() -> Weight { // Proof Size summary in bytes: - // Measured: `340` + // Measured: `373` // Estimated: `3535` - // Minimum execution time: 5_205_000 picoseconds. - Weight::from_parts(5_438_000, 3535) + // Minimum execution time: 4_271_000 picoseconds. + Weight::from_parts(4_461_000, 3535) .saturating_add(T::DbWeight::get().reads(1_u64)) } + /// Storage: Common IsAdmin (r:1 w:0) + /// Proof: Common IsAdmin (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) + /// Storage: Common CollectionPropertyPermissions (r:1 w:0) + /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + fn init_token_properties_common() -> Weight { + // Proof Size summary in bytes: + // Measured: `326` + // Estimated: `20191` + // Minimum execution time: 5_889_000 picoseconds. + Weight::from_parts(6_138_000, 20191) + .saturating_add(T::DbWeight::get().reads(2_u64)) + } } // For backwards compatibility and tests @@ -88,12 +101,12 @@ /// The range of component `b` is `[0, 64]`. fn set_collection_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `265` + // Measured: `298` // Estimated: `44457` - // Minimum execution time: 6_805_000 picoseconds. - Weight::from_parts(6_965_000, 44457) - // Standard Error: 20_175 - .saturating_add(Weight::from_parts(6_191_369, 0).saturating_mul(b.into())) + // Minimum execution time: 4_987_000 picoseconds. + Weight::from_parts(5_119_000, 44457) + // Standard Error: 7_609 + .saturating_add(Weight::from_parts(5_750_459, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -102,12 +115,12 @@ /// The range of component `b` is `[0, 64]`. fn delete_collection_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `270 + b * (33030 ±0)` + // Measured: `303 + b * (33030 ±0)` // Estimated: `44457` - // Minimum execution time: 6_284_000 picoseconds. - Weight::from_parts(6_416_000, 44457) - // Standard Error: 81_929 - .saturating_add(Weight::from_parts(23_972_425, 0).saturating_mul(b.into())) + // Minimum execution time: 4_923_000 picoseconds. + Weight::from_parts(5_074_000, 44457) + // Standard Error: 36_651 + .saturating_add(Weight::from_parts(23_145_677, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -115,11 +128,23 @@ /// Proof: Common Allowlist (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) fn check_accesslist() -> Weight { // Proof Size summary in bytes: - // Measured: `340` + // Measured: `373` // Estimated: `3535` - // Minimum execution time: 5_205_000 picoseconds. - Weight::from_parts(5_438_000, 3535) + // Minimum execution time: 4_271_000 picoseconds. + Weight::from_parts(4_461_000, 3535) .saturating_add(RocksDbWeight::get().reads(1_u64)) } + /// Storage: Common IsAdmin (r:1 w:0) + /// Proof: Common IsAdmin (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) + /// Storage: Common CollectionPropertyPermissions (r:1 w:0) + /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + fn init_token_properties_common() -> Weight { + // Proof Size summary in bytes: + // Measured: `326` + // Estimated: `20191` + // Minimum execution time: 5_889_000 picoseconds. + Weight::from_parts(6_138_000, 20191) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + } } --- a/pallets/configuration/src/weights.rs +++ b/pallets/configuration/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_configuration //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/configuration/src/weights.rs @@ -50,19 +50,23 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_725_000 picoseconds. - Weight::from_parts(1_853_000, 0) + // Minimum execution time: 990_000 picoseconds. + Weight::from_parts(1_090_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Configuration MinGasPriceOverride (r:0 w:1) /// Proof: Configuration MinGasPriceOverride (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: unknown `0xc1fef3b7207c11a52df13c12884e772609bc3a1e532c9cb85d57feed02cbff8e` (r:0 w:1) + /// Proof Skipped: unknown `0xc1fef3b7207c11a52df13c12884e772609bc3a1e532c9cb85d57feed02cbff8e` (r:0 w:1) + /// Storage: unknown `0xc1fef3b7207c11a52df13c12884e77263864ade243c642793ebcfe9e16f454ca` (r:0 w:1) + /// Proof Skipped: unknown `0xc1fef3b7207c11a52df13c12884e77263864ade243c642793ebcfe9e16f454ca` (r:0 w:1) fn set_min_gas_price_override() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_802_000 picoseconds. - Weight::from_parts(1_903_000, 0) - .saturating_add(T::DbWeight::get().writes(1_u64)) + // Minimum execution time: 1_469_000 picoseconds. + Weight::from_parts(1_565_000, 0) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: Configuration AppPromomotionConfigurationOverride (r:0 w:1) /// Proof: Configuration AppPromomotionConfigurationOverride (max_values: Some(1), max_size: Some(17), added: 512, mode: MaxEncodedLen) @@ -70,8 +74,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_048_000 picoseconds. - Weight::from_parts(2_157_000, 0) + // Minimum execution time: 1_027_000 picoseconds. + Weight::from_parts(1_098_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Configuration CollatorSelectionDesiredCollatorsOverride (r:0 w:1) @@ -80,8 +84,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_622_000 picoseconds. - Weight::from_parts(8_014_000, 0) + // Minimum execution time: 4_149_000 picoseconds. + Weight::from_parts(4_326_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Configuration CollatorSelectionLicenseBondOverride (r:0 w:1) @@ -90,8 +94,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_981_000 picoseconds. - Weight::from_parts(5_811_000, 0) + // Minimum execution time: 2_758_000 picoseconds. + Weight::from_parts(2_911_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Configuration CollatorSelectionKickThresholdOverride (r:0 w:1) @@ -100,8 +104,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_664_000 picoseconds. - Weight::from_parts(4_816_000, 0) + // Minimum execution time: 2_695_000 picoseconds. + Weight::from_parts(2_829_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -114,19 +118,23 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_725_000 picoseconds. - Weight::from_parts(1_853_000, 0) + // Minimum execution time: 990_000 picoseconds. + Weight::from_parts(1_090_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Configuration MinGasPriceOverride (r:0 w:1) /// Proof: Configuration MinGasPriceOverride (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: unknown `0xc1fef3b7207c11a52df13c12884e772609bc3a1e532c9cb85d57feed02cbff8e` (r:0 w:1) + /// Proof Skipped: unknown `0xc1fef3b7207c11a52df13c12884e772609bc3a1e532c9cb85d57feed02cbff8e` (r:0 w:1) + /// Storage: unknown `0xc1fef3b7207c11a52df13c12884e77263864ade243c642793ebcfe9e16f454ca` (r:0 w:1) + /// Proof Skipped: unknown `0xc1fef3b7207c11a52df13c12884e77263864ade243c642793ebcfe9e16f454ca` (r:0 w:1) fn set_min_gas_price_override() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_802_000 picoseconds. - Weight::from_parts(1_903_000, 0) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + // Minimum execution time: 1_469_000 picoseconds. + Weight::from_parts(1_565_000, 0) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: Configuration AppPromomotionConfigurationOverride (r:0 w:1) /// Proof: Configuration AppPromomotionConfigurationOverride (max_values: Some(1), max_size: Some(17), added: 512, mode: MaxEncodedLen) @@ -134,8 +142,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_048_000 picoseconds. - Weight::from_parts(2_157_000, 0) + // Minimum execution time: 1_027_000 picoseconds. + Weight::from_parts(1_098_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Configuration CollatorSelectionDesiredCollatorsOverride (r:0 w:1) @@ -144,8 +152,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_622_000 picoseconds. - Weight::from_parts(8_014_000, 0) + // Minimum execution time: 4_149_000 picoseconds. + Weight::from_parts(4_326_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Configuration CollatorSelectionLicenseBondOverride (r:0 w:1) @@ -154,8 +162,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_981_000 picoseconds. - Weight::from_parts(5_811_000, 0) + // Minimum execution time: 2_758_000 picoseconds. + Weight::from_parts(2_911_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Configuration CollatorSelectionKickThresholdOverride (r:0 w:1) @@ -164,8 +172,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_664_000 picoseconds. - Weight::from_parts(4_816_000, 0) + // Minimum execution time: 2_695_000 picoseconds. + Weight::from_parts(2_829_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } --- a/pallets/evm-migration/src/weights.rs +++ b/pallets/evm-migration/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_evm_migration //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/evm-migration/src/weights.rs @@ -52,9 +52,9 @@ fn begin() -> Weight { // Proof Size summary in bytes: // Measured: `94` - // Estimated: `10646` - // Minimum execution time: 8_519_000 picoseconds. - Weight::from_parts(8_729_000, 10646) + // Estimated: `3593` + // Minimum execution time: 6_131_000 picoseconds. + Weight::from_parts(6_351_000, 3593) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -66,11 +66,11 @@ fn set_data(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `96` - // Estimated: `3590` - // Minimum execution time: 6_062_000 picoseconds. - Weight::from_parts(7_193_727, 3590) - // Standard Error: 1_844 - .saturating_add(Weight::from_parts(876_826, 0).saturating_mul(b.into())) + // Estimated: `3494` + // Minimum execution time: 4_522_000 picoseconds. + Weight::from_parts(4_569_839, 3494) + // Standard Error: 253 + .saturating_add(Weight::from_parts(743_780, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(b.into()))) } @@ -79,12 +79,14 @@ /// Storage: EVM AccountCodes (r:0 w:1) /// Proof Skipped: EVM AccountCodes (max_values: None, max_size: None, mode: Measured) /// The range of component `b` is `[0, 80]`. - fn finish(_b: u32, ) -> Weight { + fn finish(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `96` - // Estimated: `3590` - // Minimum execution time: 7_452_000 picoseconds. - Weight::from_parts(8_531_888, 3590) + // Estimated: `3494` + // Minimum execution time: 5_329_000 picoseconds. + Weight::from_parts(5_677_312, 3494) + // Standard Error: 22 + .saturating_add(Weight::from_parts(1_369, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -93,20 +95,20 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_377_000 picoseconds. - Weight::from_parts(3_388_877, 0) - // Standard Error: 1_205 - .saturating_add(Weight::from_parts(696_701, 0).saturating_mul(b.into())) + // Minimum execution time: 890_000 picoseconds. + Weight::from_parts(1_279_871, 0) + // Standard Error: 112 + .saturating_add(Weight::from_parts(408_968, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 200]`. fn insert_events(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_671_000 picoseconds. - Weight::from_parts(4_402_497, 0) - // Standard Error: 723 - .saturating_add(Weight::from_parts(1_338_678, 0).saturating_mul(b.into())) + // Minimum execution time: 896_000 picoseconds. + Weight::from_parts(1_975_680, 0) + // Standard Error: 117 + .saturating_add(Weight::from_parts(1_003_721, 0).saturating_mul(b.into())) } } @@ -121,9 +123,9 @@ fn begin() -> Weight { // Proof Size summary in bytes: // Measured: `94` - // Estimated: `10646` - // Minimum execution time: 8_519_000 picoseconds. - Weight::from_parts(8_729_000, 10646) + // Estimated: `3593` + // Minimum execution time: 6_131_000 picoseconds. + Weight::from_parts(6_351_000, 3593) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -135,11 +137,11 @@ fn set_data(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `96` - // Estimated: `3590` - // Minimum execution time: 6_062_000 picoseconds. - Weight::from_parts(7_193_727, 3590) - // Standard Error: 1_844 - .saturating_add(Weight::from_parts(876_826, 0).saturating_mul(b.into())) + // Estimated: `3494` + // Minimum execution time: 4_522_000 picoseconds. + Weight::from_parts(4_569_839, 3494) + // Standard Error: 253 + .saturating_add(Weight::from_parts(743_780, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(b.into()))) } @@ -148,12 +150,14 @@ /// Storage: EVM AccountCodes (r:0 w:1) /// Proof Skipped: EVM AccountCodes (max_values: None, max_size: None, mode: Measured) /// The range of component `b` is `[0, 80]`. - fn finish(_b: u32, ) -> Weight { + fn finish(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `96` - // Estimated: `3590` - // Minimum execution time: 7_452_000 picoseconds. - Weight::from_parts(8_531_888, 3590) + // Estimated: `3494` + // Minimum execution time: 5_329_000 picoseconds. + Weight::from_parts(5_677_312, 3494) + // Standard Error: 22 + .saturating_add(Weight::from_parts(1_369, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -162,20 +166,20 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_377_000 picoseconds. - Weight::from_parts(3_388_877, 0) - // Standard Error: 1_205 - .saturating_add(Weight::from_parts(696_701, 0).saturating_mul(b.into())) + // Minimum execution time: 890_000 picoseconds. + Weight::from_parts(1_279_871, 0) + // Standard Error: 112 + .saturating_add(Weight::from_parts(408_968, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 200]`. fn insert_events(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_671_000 picoseconds. - Weight::from_parts(4_402_497, 0) - // Standard Error: 723 - .saturating_add(Weight::from_parts(1_338_678, 0).saturating_mul(b.into())) + // Minimum execution time: 896_000 picoseconds. + Weight::from_parts(1_975_680, 0) + // Standard Error: 117 + .saturating_add(Weight::from_parts(1_003_721, 0).saturating_mul(b.into())) } } --- a/pallets/foreign-assets/src/weights.rs +++ b/pallets/foreign-assets/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_foreign_assets //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/foreign-assets/src/weights.rs @@ -56,6 +56,8 @@ /// Proof: ForeignAssets AssetMetadatas (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: ForeignAssets AssetBinding (r:1 w:1) /// Proof: ForeignAssets AssetBinding (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) + /// Storage: Common AdminAmount (r:0 w:1) + /// Proof: Common AdminAmount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) /// Storage: Common CollectionPropertyPermissions (r:0 w:1) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Common CollectionProperties (r:0 w:1) @@ -65,11 +67,11 @@ fn register_foreign_asset() -> Weight { // Proof Size summary in bytes: // Measured: `286` - // Estimated: `25838` - // Minimum execution time: 37_778_000 picoseconds. - Weight::from_parts(38_334_000, 25838) + // Estimated: `6196` + // Minimum execution time: 33_294_000 picoseconds. + Weight::from_parts(34_011_000, 6196) .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(11_u64)) + .saturating_add(T::DbWeight::get().writes(12_u64)) } /// Storage: ForeignAssets ForeignAssetLocations (r:1 w:1) /// Proof: ForeignAssets ForeignAssetLocations (max_values: None, max_size: Some(614), added: 3089, mode: MaxEncodedLen) @@ -78,9 +80,9 @@ fn update_foreign_asset() -> Weight { // Proof Size summary in bytes: // Measured: `197` - // Estimated: `7615` - // Minimum execution time: 13_739_000 picoseconds. - Weight::from_parts(22_366_000, 7615) + // Estimated: `4079` + // Minimum execution time: 9_296_000 picoseconds. + Weight::from_parts(9_594_000, 4079) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -104,6 +106,8 @@ /// Proof: ForeignAssets AssetMetadatas (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) /// Storage: ForeignAssets AssetBinding (r:1 w:1) /// Proof: ForeignAssets AssetBinding (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) + /// Storage: Common AdminAmount (r:0 w:1) + /// Proof: Common AdminAmount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) /// Storage: Common CollectionPropertyPermissions (r:0 w:1) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Common CollectionProperties (r:0 w:1) @@ -113,11 +117,11 @@ fn register_foreign_asset() -> Weight { // Proof Size summary in bytes: // Measured: `286` - // Estimated: `25838` - // Minimum execution time: 37_778_000 picoseconds. - Weight::from_parts(38_334_000, 25838) + // Estimated: `6196` + // Minimum execution time: 33_294_000 picoseconds. + Weight::from_parts(34_011_000, 6196) .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(11_u64)) + .saturating_add(RocksDbWeight::get().writes(12_u64)) } /// Storage: ForeignAssets ForeignAssetLocations (r:1 w:1) /// Proof: ForeignAssets ForeignAssetLocations (max_values: None, max_size: Some(614), added: 3089, mode: MaxEncodedLen) @@ -126,9 +130,9 @@ fn update_foreign_asset() -> Weight { // Proof Size summary in bytes: // Measured: `197` - // Estimated: `7615` - // Minimum execution time: 13_739_000 picoseconds. - Weight::from_parts(22_366_000, 7615) + // Estimated: `4079` + // Minimum execution time: 9_296_000 picoseconds. + Weight::from_parts(9_594_000, 4079) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } --- a/pallets/fungible/src/common.rs +++ b/pallets/fungible/src/common.rs @@ -25,7 +25,7 @@ weights::WeightInfo as _, SelfWeightOf as PalletCommonWeightOf, }; use pallet_structure::Error as StructureError; -use sp_runtime::ArithmeticError; +use sp_runtime::{ArithmeticError, DispatchError}; use sp_std::{vec::Vec, vec}; use up_data_structs::{Property, PropertyKey, PropertyValue, PropertyKeyPermission}; @@ -364,6 +364,18 @@ fail!(>::SettingPropertiesNotAllowed) } + fn get_token_properties_raw( + &self, + _token_id: TokenId, + ) -> Option { + // No token properties are defined on fungibles + None + } + + fn set_token_properties_raw(&self, _token_id: TokenId, _map: up_data_structs::TokenProperties) { + // No token properties are defined on fungibles + } + fn check_nesting( &self, _sender: ::CrossAccountId, @@ -402,6 +414,15 @@ Err(TokenOwnerError::MultipleOwners) } + fn check_token_indirect_owner( + &self, + _token: TokenId, + _maybe_owner: &T::CrossAccountId, + _nesting_budget: &dyn Budget, + ) -> Result { + Ok(false) + } + /// Returns 10 tokens owners in no particular order. fn token_owners(&self, token: TokenId) -> Vec { >::token_owners(self.id, token).unwrap_or_default() --- a/pallets/fungible/src/weights.rs +++ b/pallets/fungible/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_fungible //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/fungible/src/weights.rs @@ -54,9 +54,9 @@ fn create_item() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `7035` - // Minimum execution time: 10_168_000 picoseconds. - Weight::from_parts(10_453_000, 7035) + // Estimated: `3542` + // Minimum execution time: 7_228_000 picoseconds. + Weight::from_parts(7_472_000, 3542) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -68,11 +68,11 @@ fn create_multiple_items_ex(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `4483 + b * (2552 ±0)` - // Minimum execution time: 3_248_000 picoseconds. - Weight::from_parts(12_455_981, 4483) - // Standard Error: 2_698 - .saturating_add(Weight::from_parts(3_426_148, 0).saturating_mul(b.into())) + // Estimated: `3493 + b * (2552 ±0)` + // Minimum execution time: 2_398_000 picoseconds. + Weight::from_parts(4_432_908, 3493) + // Standard Error: 263 + .saturating_add(Weight::from_parts(2_617_422, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -86,9 +86,9 @@ fn burn_item() -> Weight { // Proof Size summary in bytes: // Measured: `197` - // Estimated: `7035` - // Minimum execution time: 12_717_000 picoseconds. - Weight::from_parts(13_031_000, 7035) + // Estimated: `3542` + // Minimum execution time: 9_444_000 picoseconds. + Weight::from_parts(9_742_000, 3542) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -98,8 +98,8 @@ // Proof Size summary in bytes: // Measured: `182` // Estimated: `6094` - // Minimum execution time: 13_640_000 picoseconds. - Weight::from_parts(13_935_000, 6094) + // Minimum execution time: 9_553_000 picoseconds. + Weight::from_parts(9_852_000, 6094) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -111,8 +111,8 @@ // Proof Size summary in bytes: // Measured: `182` // Estimated: `3542` - // Minimum execution time: 11_769_000 picoseconds. - Weight::from_parts(12_072_000, 3542) + // Minimum execution time: 8_435_000 picoseconds. + Weight::from_parts(8_714_000, 3542) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -124,8 +124,8 @@ // Proof Size summary in bytes: // Measured: `170` // Estimated: `3542` - // Minimum execution time: 11_603_000 picoseconds. - Weight::from_parts(12_003_000, 3542) + // Minimum execution time: 8_475_000 picoseconds. + Weight::from_parts(8_735_000, 3542) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -135,8 +135,8 @@ // Proof Size summary in bytes: // Measured: `210` // Estimated: `3558` - // Minimum execution time: 5_682_000 picoseconds. - Weight::from_parts(5_892_000, 3558) + // Minimum execution time: 4_426_000 picoseconds. + Weight::from_parts(4_604_000, 3558) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: Fungible Allowance (r:0 w:1) @@ -145,8 +145,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_415_000 picoseconds. - Weight::from_parts(6_599_000, 0) + // Minimum execution time: 4_130_000 picoseconds. + Weight::from_parts(4_275_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Fungible Allowance (r:1 w:1) @@ -158,9 +158,9 @@ fn burn_from() -> Weight { // Proof Size summary in bytes: // Measured: `315` - // Estimated: `10593` - // Minimum execution time: 20_257_000 picoseconds. - Weight::from_parts(20_625_000, 10593) + // Estimated: `3558` + // Minimum execution time: 14_878_000 picoseconds. + Weight::from_parts(15_263_000, 3558) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -175,9 +175,9 @@ fn create_item() -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `7035` - // Minimum execution time: 10_168_000 picoseconds. - Weight::from_parts(10_453_000, 7035) + // Estimated: `3542` + // Minimum execution time: 7_228_000 picoseconds. + Weight::from_parts(7_472_000, 3542) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -189,11 +189,11 @@ fn create_multiple_items_ex(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `42` - // Estimated: `4483 + b * (2552 ±0)` - // Minimum execution time: 3_248_000 picoseconds. - Weight::from_parts(12_455_981, 4483) - // Standard Error: 2_698 - .saturating_add(Weight::from_parts(3_426_148, 0).saturating_mul(b.into())) + // Estimated: `3493 + b * (2552 ±0)` + // Minimum execution time: 2_398_000 picoseconds. + Weight::from_parts(4_432_908, 3493) + // Standard Error: 263 + .saturating_add(Weight::from_parts(2_617_422, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -207,9 +207,9 @@ fn burn_item() -> Weight { // Proof Size summary in bytes: // Measured: `197` - // Estimated: `7035` - // Minimum execution time: 12_717_000 picoseconds. - Weight::from_parts(13_031_000, 7035) + // Estimated: `3542` + // Minimum execution time: 9_444_000 picoseconds. + Weight::from_parts(9_742_000, 3542) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -219,8 +219,8 @@ // Proof Size summary in bytes: // Measured: `182` // Estimated: `6094` - // Minimum execution time: 13_640_000 picoseconds. - Weight::from_parts(13_935_000, 6094) + // Minimum execution time: 9_553_000 picoseconds. + Weight::from_parts(9_852_000, 6094) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -232,8 +232,8 @@ // Proof Size summary in bytes: // Measured: `182` // Estimated: `3542` - // Minimum execution time: 11_769_000 picoseconds. - Weight::from_parts(12_072_000, 3542) + // Minimum execution time: 8_435_000 picoseconds. + Weight::from_parts(8_714_000, 3542) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -245,8 +245,8 @@ // Proof Size summary in bytes: // Measured: `170` // Estimated: `3542` - // Minimum execution time: 11_603_000 picoseconds. - Weight::from_parts(12_003_000, 3542) + // Minimum execution time: 8_475_000 picoseconds. + Weight::from_parts(8_735_000, 3542) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -256,8 +256,8 @@ // Proof Size summary in bytes: // Measured: `210` // Estimated: `3558` - // Minimum execution time: 5_682_000 picoseconds. - Weight::from_parts(5_892_000, 3558) + // Minimum execution time: 4_426_000 picoseconds. + Weight::from_parts(4_604_000, 3558) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: Fungible Allowance (r:0 w:1) @@ -266,8 +266,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_415_000 picoseconds. - Weight::from_parts(6_599_000, 0) + // Minimum execution time: 4_130_000 picoseconds. + Weight::from_parts(4_275_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Fungible Allowance (r:1 w:1) @@ -279,9 +279,9 @@ fn burn_from() -> Weight { // Proof Size summary in bytes: // Measured: `315` - // Estimated: `10593` - // Minimum execution time: 20_257_000 picoseconds. - Weight::from_parts(20_625_000, 10593) + // Estimated: `3558` + // Minimum execution time: 14_878_000 picoseconds. + Weight::from_parts(15_263_000, 3558) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } --- a/pallets/identity/src/weights.rs +++ b/pallets/identity/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_identity //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-27, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/identity/src/weights.rs @@ -64,10 +64,10 @@ // Proof Size summary in bytes: // Measured: `31 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 9_094_000 picoseconds. - Weight::from_parts(10_431_627, 2626) - // Standard Error: 1_046 - .saturating_add(Weight::from_parts(99_468, 0).saturating_mul(r.into())) + // Minimum execution time: 6_759_000 picoseconds. + Weight::from_parts(7_254_560, 2626) + // Standard Error: 231 + .saturating_add(Weight::from_parts(64_513, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -79,12 +79,12 @@ // Proof Size summary in bytes: // Measured: `441 + r * (5 ±0)` // Estimated: `11003` - // Minimum execution time: 18_662_000 picoseconds. - Weight::from_parts(17_939_760, 11003) - // Standard Error: 2_371 - .saturating_add(Weight::from_parts(22_184, 0).saturating_mul(r.into())) - // Standard Error: 462 - .saturating_add(Weight::from_parts(151_368, 0).saturating_mul(x.into())) + // Minimum execution time: 14_134_000 picoseconds. + Weight::from_parts(12_591_985, 11003) + // Standard Error: 562 + .saturating_add(Weight::from_parts(77_682, 0).saturating_mul(r.into())) + // Standard Error: 109 + .saturating_add(Weight::from_parts(96_303, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -98,11 +98,11 @@ fn set_subs_new(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `100` - // Estimated: `18716 + s * (2589 ±0)` - // Minimum execution time: 6_921_000 picoseconds. - Weight::from_parts(16_118_195, 18716) - // Standard Error: 1_786 - .saturating_add(Weight::from_parts(1_350_155, 0).saturating_mul(s.into())) + // Estimated: `11003 + s * (2589 ±0)` + // Minimum execution time: 4_763_000 picoseconds. + Weight::from_parts(11_344_974, 11003) + // Standard Error: 401 + .saturating_add(Weight::from_parts(1_141_028, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -119,11 +119,11 @@ fn set_subs_old(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `193 + p * (32 ±0)` - // Estimated: `17726` - // Minimum execution time: 6_858_000 picoseconds. - Weight::from_parts(16_222_054, 17726) - // Standard Error: 1_409 - .saturating_add(Weight::from_parts(593_588, 0).saturating_mul(p.into())) + // Estimated: `11003` + // Minimum execution time: 4_783_000 picoseconds. + Weight::from_parts(11_531_027, 11003) + // Standard Error: 369 + .saturating_add(Weight::from_parts(542_102, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) @@ -140,15 +140,15 @@ fn clear_identity(r: u32, s: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `468 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `17726` - // Minimum execution time: 27_212_000 picoseconds. - Weight::from_parts(19_030_840, 17726) - // Standard Error: 3_118 - .saturating_add(Weight::from_parts(29_836, 0).saturating_mul(r.into())) - // Standard Error: 608 - .saturating_add(Weight::from_parts(590_661, 0).saturating_mul(s.into())) - // Standard Error: 608 - .saturating_add(Weight::from_parts(110_108, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 23_175_000 picoseconds. + Weight::from_parts(16_503_215, 11003) + // Standard Error: 625 + .saturating_add(Weight::from_parts(1_175, 0).saturating_mul(r.into())) + // Standard Error: 122 + .saturating_add(Weight::from_parts(533_184, 0).saturating_mul(s.into())) + // Standard Error: 122 + .saturating_add(Weight::from_parts(94_600, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -162,13 +162,13 @@ fn request_judgement(r: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `366 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `13629` - // Minimum execution time: 19_771_000 picoseconds. - Weight::from_parts(18_917_892, 13629) - // Standard Error: 1_957 - .saturating_add(Weight::from_parts(57_465, 0).saturating_mul(r.into())) - // Standard Error: 381 - .saturating_add(Weight::from_parts(168_586, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 15_322_000 picoseconds. + Weight::from_parts(13_671_670, 11003) + // Standard Error: 722 + .saturating_add(Weight::from_parts(73_665, 0).saturating_mul(r.into())) + // Standard Error: 140 + .saturating_add(Weight::from_parts(124_598, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -180,12 +180,12 @@ // Proof Size summary in bytes: // Measured: `397 + x * (66 ±0)` // Estimated: `11003` - // Minimum execution time: 17_411_000 picoseconds. - Weight::from_parts(16_856_331, 11003) - // Standard Error: 7_002 - .saturating_add(Weight::from_parts(34_389, 0).saturating_mul(r.into())) - // Standard Error: 1_366 - .saturating_add(Weight::from_parts(165_686, 0).saturating_mul(x.into())) + // Minimum execution time: 13_268_000 picoseconds. + Weight::from_parts(12_489_352, 11003) + // Standard Error: 544 + .saturating_add(Weight::from_parts(35_424, 0).saturating_mul(r.into())) + // Standard Error: 106 + .saturating_add(Weight::from_parts(123_149, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -196,10 +196,10 @@ // Proof Size summary in bytes: // Measured: `88 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_089_000 picoseconds. - Weight::from_parts(7_750_487, 2626) - // Standard Error: 1_625 - .saturating_add(Weight::from_parts(101_135, 0).saturating_mul(r.into())) + // Minimum execution time: 4_845_000 picoseconds. + Weight::from_parts(5_147_478, 2626) + // Standard Error: 169 + .saturating_add(Weight::from_parts(55_561, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -210,10 +210,10 @@ // Proof Size summary in bytes: // Measured: `88 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 6_300_000 picoseconds. - Weight::from_parts(6_836_140, 2626) - // Standard Error: 655 - .saturating_add(Weight::from_parts(102_284, 0).saturating_mul(r.into())) + // Minimum execution time: 4_191_000 picoseconds. + Weight::from_parts(4_478_351, 2626) + // Standard Error: 138 + .saturating_add(Weight::from_parts(53_627, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -224,10 +224,10 @@ // Proof Size summary in bytes: // Measured: `88 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 6_257_000 picoseconds. - Weight::from_parts(6_917_052, 2626) - // Standard Error: 2_628 - .saturating_add(Weight::from_parts(71_362, 0).saturating_mul(r.into())) + // Minimum execution time: 4_003_000 picoseconds. + Weight::from_parts(4_303_365, 2626) + // Standard Error: 147 + .saturating_add(Weight::from_parts(52_472, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -240,13 +240,13 @@ fn provide_judgement(r: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `444 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `13629` - // Minimum execution time: 16_021_000 picoseconds. - Weight::from_parts(15_553_670, 13629) - // Standard Error: 5_797 - .saturating_add(Weight::from_parts(42_423, 0).saturating_mul(r.into())) - // Standard Error: 1_072 - .saturating_add(Weight::from_parts(252_721, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 11_465_000 picoseconds. + Weight::from_parts(10_326_049, 11003) + // Standard Error: 660 + .saturating_add(Weight::from_parts(48_922, 0).saturating_mul(r.into())) + // Standard Error: 122 + .saturating_add(Weight::from_parts(185_374, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -264,15 +264,15 @@ fn kill_identity(r: u32, s: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `665 + r * (12 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `23922` - // Minimum execution time: 40_801_000 picoseconds. - Weight::from_parts(34_079_397, 23922) - // Standard Error: 3_750 - .saturating_add(Weight::from_parts(31_496, 0).saturating_mul(r.into())) - // Standard Error: 732 - .saturating_add(Weight::from_parts(599_691, 0).saturating_mul(s.into())) - // Standard Error: 732 - .saturating_add(Weight::from_parts(101_683, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 34_933_000 picoseconds. + Weight::from_parts(28_994_022, 11003) + // Standard Error: 668 + .saturating_add(Weight::from_parts(21_722, 0).saturating_mul(r.into())) + // Standard Error: 130 + .saturating_add(Weight::from_parts(540_580, 0).saturating_mul(s.into())) + // Standard Error: 130 + .saturating_add(Weight::from_parts(89_348, 0).saturating_mul(x.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -285,12 +285,12 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_412_000 picoseconds. - Weight::from_parts(4_592_000, 0) - // Standard Error: 703_509 - .saturating_add(Weight::from_parts(43_647_925, 0).saturating_mul(x.into())) - // Standard Error: 117_043 - .saturating_add(Weight::from_parts(9_312_431, 0).saturating_mul(n.into())) + // Minimum execution time: 2_770_000 picoseconds. + Weight::from_parts(2_875_000, 0) + // Standard Error: 281_295 + .saturating_add(Weight::from_parts(37_513_186, 0).saturating_mul(x.into())) + // Standard Error: 46_799 + .saturating_add(Weight::from_parts(7_949_936, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) } /// Storage: Identity SubsOf (r:600 w:0) @@ -303,12 +303,12 @@ // Proof Size summary in bytes: // Measured: `41` // Estimated: `990 + n * (5733 ±0)` - // Minimum execution time: 3_824_000 picoseconds. - Weight::from_parts(3_950_000, 990) - // Standard Error: 2_864 - .saturating_add(Weight::from_parts(55_678, 0).saturating_mul(x.into())) - // Standard Error: 476 - .saturating_add(Weight::from_parts(1_138_349, 0).saturating_mul(n.into())) + // Minimum execution time: 2_751_000 picoseconds. + Weight::from_parts(2_862_000, 990) + // Standard Error: 953 + .saturating_add(Weight::from_parts(28_947, 0).saturating_mul(x.into())) + // Standard Error: 158 + .saturating_add(Weight::from_parts(994_085, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 5733).saturating_mul(n.into())) @@ -323,12 +323,12 @@ // Proof Size summary in bytes: // Measured: `41` // Estimated: `990 + n * (5733 ±0)` - // Minimum execution time: 4_196_000 picoseconds. - Weight::from_parts(4_340_000, 990) - // Standard Error: 2_081_979 - .saturating_add(Weight::from_parts(130_653_903, 0).saturating_mul(s.into())) - // Standard Error: 346_381 - .saturating_add(Weight::from_parts(23_046_001, 0).saturating_mul(n.into())) + // Minimum execution time: 2_671_000 picoseconds. + Weight::from_parts(2_814_000, 990) + // Standard Error: 785_159 + .saturating_add(Weight::from_parts(109_659_566, 0).saturating_mul(s.into())) + // Standard Error: 130_628 + .saturating_add(Weight::from_parts(19_169_269, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -344,11 +344,11 @@ fn add_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `474 + s * (36 ±0)` - // Estimated: `21305` - // Minimum execution time: 15_289_000 picoseconds. - Weight::from_parts(21_319_844, 21305) - // Standard Error: 893 - .saturating_add(Weight::from_parts(53_159, 0).saturating_mul(s.into())) + // Estimated: `11003` + // Minimum execution time: 12_571_000 picoseconds. + Weight::from_parts(16_366_301, 11003) + // Standard Error: 217 + .saturating_add(Weight::from_parts(42_542, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -360,11 +360,11 @@ fn rename_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `590 + s * (3 ±0)` - // Estimated: `14582` - // Minimum execution time: 9_867_000 picoseconds. - Weight::from_parts(12_546_245, 14582) - // Standard Error: 509 - .saturating_add(Weight::from_parts(10_078, 0).saturating_mul(s.into())) + // Estimated: `11003` + // Minimum execution time: 7_278_000 picoseconds. + Weight::from_parts(9_227_799, 11003) + // Standard Error: 104 + .saturating_add(Weight::from_parts(14_014, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -378,11 +378,11 @@ fn remove_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `637 + s * (35 ±0)` - // Estimated: `21305` - // Minimum execution time: 19_299_000 picoseconds. - Weight::from_parts(24_125_576, 21305) - // Standard Error: 1_479 - .saturating_add(Weight::from_parts(22_611, 0).saturating_mul(s.into())) + // Estimated: `11003` + // Minimum execution time: 15_771_000 picoseconds. + Weight::from_parts(18_105_475, 11003) + // Standard Error: 129 + .saturating_add(Weight::from_parts(32_074, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -390,16 +390,18 @@ /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) /// Storage: Identity SubsOf (r:1 w:1) /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:0) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `s` is `[0, 99]`. fn quit_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `563 + s * (37 ±0)` - // Estimated: `10302` - // Minimum execution time: 14_183_000 picoseconds. - Weight::from_parts(17_343_547, 10302) - // Standard Error: 454 - .saturating_add(Weight::from_parts(45_925, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `703 + s * (37 ±0)` + // Estimated: `6723` + // Minimum execution time: 14_093_000 picoseconds. + Weight::from_parts(16_125_177, 6723) + // Standard Error: 146 + .saturating_add(Weight::from_parts(39_270, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } } @@ -413,10 +415,10 @@ // Proof Size summary in bytes: // Measured: `31 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 9_094_000 picoseconds. - Weight::from_parts(10_431_627, 2626) - // Standard Error: 1_046 - .saturating_add(Weight::from_parts(99_468, 0).saturating_mul(r.into())) + // Minimum execution time: 6_759_000 picoseconds. + Weight::from_parts(7_254_560, 2626) + // Standard Error: 231 + .saturating_add(Weight::from_parts(64_513, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -428,12 +430,12 @@ // Proof Size summary in bytes: // Measured: `441 + r * (5 ±0)` // Estimated: `11003` - // Minimum execution time: 18_662_000 picoseconds. - Weight::from_parts(17_939_760, 11003) - // Standard Error: 2_371 - .saturating_add(Weight::from_parts(22_184, 0).saturating_mul(r.into())) - // Standard Error: 462 - .saturating_add(Weight::from_parts(151_368, 0).saturating_mul(x.into())) + // Minimum execution time: 14_134_000 picoseconds. + Weight::from_parts(12_591_985, 11003) + // Standard Error: 562 + .saturating_add(Weight::from_parts(77_682, 0).saturating_mul(r.into())) + // Standard Error: 109 + .saturating_add(Weight::from_parts(96_303, 0).saturating_mul(x.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -447,11 +449,11 @@ fn set_subs_new(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `100` - // Estimated: `18716 + s * (2589 ±0)` - // Minimum execution time: 6_921_000 picoseconds. - Weight::from_parts(16_118_195, 18716) - // Standard Error: 1_786 - .saturating_add(Weight::from_parts(1_350_155, 0).saturating_mul(s.into())) + // Estimated: `11003 + s * (2589 ±0)` + // Minimum execution time: 4_763_000 picoseconds. + Weight::from_parts(11_344_974, 11003) + // Standard Error: 401 + .saturating_add(Weight::from_parts(1_141_028, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(s.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -468,11 +470,11 @@ fn set_subs_old(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `193 + p * (32 ±0)` - // Estimated: `17726` - // Minimum execution time: 6_858_000 picoseconds. - Weight::from_parts(16_222_054, 17726) - // Standard Error: 1_409 - .saturating_add(Weight::from_parts(593_588, 0).saturating_mul(p.into())) + // Estimated: `11003` + // Minimum execution time: 4_783_000 picoseconds. + Weight::from_parts(11_531_027, 11003) + // Standard Error: 369 + .saturating_add(Weight::from_parts(542_102, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(p.into()))) @@ -489,15 +491,15 @@ fn clear_identity(r: u32, s: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `468 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `17726` - // Minimum execution time: 27_212_000 picoseconds. - Weight::from_parts(19_030_840, 17726) - // Standard Error: 3_118 - .saturating_add(Weight::from_parts(29_836, 0).saturating_mul(r.into())) - // Standard Error: 608 - .saturating_add(Weight::from_parts(590_661, 0).saturating_mul(s.into())) - // Standard Error: 608 - .saturating_add(Weight::from_parts(110_108, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 23_175_000 picoseconds. + Weight::from_parts(16_503_215, 11003) + // Standard Error: 625 + .saturating_add(Weight::from_parts(1_175, 0).saturating_mul(r.into())) + // Standard Error: 122 + .saturating_add(Weight::from_parts(533_184, 0).saturating_mul(s.into())) + // Standard Error: 122 + .saturating_add(Weight::from_parts(94_600, 0).saturating_mul(x.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -511,13 +513,13 @@ fn request_judgement(r: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `366 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `13629` - // Minimum execution time: 19_771_000 picoseconds. - Weight::from_parts(18_917_892, 13629) - // Standard Error: 1_957 - .saturating_add(Weight::from_parts(57_465, 0).saturating_mul(r.into())) - // Standard Error: 381 - .saturating_add(Weight::from_parts(168_586, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 15_322_000 picoseconds. + Weight::from_parts(13_671_670, 11003) + // Standard Error: 722 + .saturating_add(Weight::from_parts(73_665, 0).saturating_mul(r.into())) + // Standard Error: 140 + .saturating_add(Weight::from_parts(124_598, 0).saturating_mul(x.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -529,12 +531,12 @@ // Proof Size summary in bytes: // Measured: `397 + x * (66 ±0)` // Estimated: `11003` - // Minimum execution time: 17_411_000 picoseconds. - Weight::from_parts(16_856_331, 11003) - // Standard Error: 7_002 - .saturating_add(Weight::from_parts(34_389, 0).saturating_mul(r.into())) - // Standard Error: 1_366 - .saturating_add(Weight::from_parts(165_686, 0).saturating_mul(x.into())) + // Minimum execution time: 13_268_000 picoseconds. + Weight::from_parts(12_489_352, 11003) + // Standard Error: 544 + .saturating_add(Weight::from_parts(35_424, 0).saturating_mul(r.into())) + // Standard Error: 106 + .saturating_add(Weight::from_parts(123_149, 0).saturating_mul(x.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -545,10 +547,10 @@ // Proof Size summary in bytes: // Measured: `88 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_089_000 picoseconds. - Weight::from_parts(7_750_487, 2626) - // Standard Error: 1_625 - .saturating_add(Weight::from_parts(101_135, 0).saturating_mul(r.into())) + // Minimum execution time: 4_845_000 picoseconds. + Weight::from_parts(5_147_478, 2626) + // Standard Error: 169 + .saturating_add(Weight::from_parts(55_561, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -559,10 +561,10 @@ // Proof Size summary in bytes: // Measured: `88 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 6_300_000 picoseconds. - Weight::from_parts(6_836_140, 2626) - // Standard Error: 655 - .saturating_add(Weight::from_parts(102_284, 0).saturating_mul(r.into())) + // Minimum execution time: 4_191_000 picoseconds. + Weight::from_parts(4_478_351, 2626) + // Standard Error: 138 + .saturating_add(Weight::from_parts(53_627, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -573,10 +575,10 @@ // Proof Size summary in bytes: // Measured: `88 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 6_257_000 picoseconds. - Weight::from_parts(6_917_052, 2626) - // Standard Error: 2_628 - .saturating_add(Weight::from_parts(71_362, 0).saturating_mul(r.into())) + // Minimum execution time: 4_003_000 picoseconds. + Weight::from_parts(4_303_365, 2626) + // Standard Error: 147 + .saturating_add(Weight::from_parts(52_472, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -589,13 +591,13 @@ fn provide_judgement(r: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `444 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `13629` - // Minimum execution time: 16_021_000 picoseconds. - Weight::from_parts(15_553_670, 13629) - // Standard Error: 5_797 - .saturating_add(Weight::from_parts(42_423, 0).saturating_mul(r.into())) - // Standard Error: 1_072 - .saturating_add(Weight::from_parts(252_721, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 11_465_000 picoseconds. + Weight::from_parts(10_326_049, 11003) + // Standard Error: 660 + .saturating_add(Weight::from_parts(48_922, 0).saturating_mul(r.into())) + // Standard Error: 122 + .saturating_add(Weight::from_parts(185_374, 0).saturating_mul(x.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -613,15 +615,15 @@ fn kill_identity(r: u32, s: u32, x: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `665 + r * (12 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `23922` - // Minimum execution time: 40_801_000 picoseconds. - Weight::from_parts(34_079_397, 23922) - // Standard Error: 3_750 - .saturating_add(Weight::from_parts(31_496, 0).saturating_mul(r.into())) - // Standard Error: 732 - .saturating_add(Weight::from_parts(599_691, 0).saturating_mul(s.into())) - // Standard Error: 732 - .saturating_add(Weight::from_parts(101_683, 0).saturating_mul(x.into())) + // Estimated: `11003` + // Minimum execution time: 34_933_000 picoseconds. + Weight::from_parts(28_994_022, 11003) + // Standard Error: 668 + .saturating_add(Weight::from_parts(21_722, 0).saturating_mul(r.into())) + // Standard Error: 130 + .saturating_add(Weight::from_parts(540_580, 0).saturating_mul(s.into())) + // Standard Error: 130 + .saturating_add(Weight::from_parts(89_348, 0).saturating_mul(x.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -634,12 +636,12 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_412_000 picoseconds. - Weight::from_parts(4_592_000, 0) - // Standard Error: 703_509 - .saturating_add(Weight::from_parts(43_647_925, 0).saturating_mul(x.into())) - // Standard Error: 117_043 - .saturating_add(Weight::from_parts(9_312_431, 0).saturating_mul(n.into())) + // Minimum execution time: 2_770_000 picoseconds. + Weight::from_parts(2_875_000, 0) + // Standard Error: 281_295 + .saturating_add(Weight::from_parts(37_513_186, 0).saturating_mul(x.into())) + // Standard Error: 46_799 + .saturating_add(Weight::from_parts(7_949_936, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) } /// Storage: Identity SubsOf (r:600 w:0) @@ -652,12 +654,12 @@ // Proof Size summary in bytes: // Measured: `41` // Estimated: `990 + n * (5733 ±0)` - // Minimum execution time: 3_824_000 picoseconds. - Weight::from_parts(3_950_000, 990) - // Standard Error: 2_864 - .saturating_add(Weight::from_parts(55_678, 0).saturating_mul(x.into())) - // Standard Error: 476 - .saturating_add(Weight::from_parts(1_138_349, 0).saturating_mul(n.into())) + // Minimum execution time: 2_751_000 picoseconds. + Weight::from_parts(2_862_000, 990) + // Standard Error: 953 + .saturating_add(Weight::from_parts(28_947, 0).saturating_mul(x.into())) + // Standard Error: 158 + .saturating_add(Weight::from_parts(994_085, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 5733).saturating_mul(n.into())) @@ -672,12 +674,12 @@ // Proof Size summary in bytes: // Measured: `41` // Estimated: `990 + n * (5733 ±0)` - // Minimum execution time: 4_196_000 picoseconds. - Weight::from_parts(4_340_000, 990) - // Standard Error: 2_081_979 - .saturating_add(Weight::from_parts(130_653_903, 0).saturating_mul(s.into())) - // Standard Error: 346_381 - .saturating_add(Weight::from_parts(23_046_001, 0).saturating_mul(n.into())) + // Minimum execution time: 2_671_000 picoseconds. + Weight::from_parts(2_814_000, 990) + // Standard Error: 785_159 + .saturating_add(Weight::from_parts(109_659_566, 0).saturating_mul(s.into())) + // Standard Error: 130_628 + .saturating_add(Weight::from_parts(19_169_269, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -693,11 +695,11 @@ fn add_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `474 + s * (36 ±0)` - // Estimated: `21305` - // Minimum execution time: 15_289_000 picoseconds. - Weight::from_parts(21_319_844, 21305) - // Standard Error: 893 - .saturating_add(Weight::from_parts(53_159, 0).saturating_mul(s.into())) + // Estimated: `11003` + // Minimum execution time: 12_571_000 picoseconds. + Weight::from_parts(16_366_301, 11003) + // Standard Error: 217 + .saturating_add(Weight::from_parts(42_542, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -709,11 +711,11 @@ fn rename_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `590 + s * (3 ±0)` - // Estimated: `14582` - // Minimum execution time: 9_867_000 picoseconds. - Weight::from_parts(12_546_245, 14582) - // Standard Error: 509 - .saturating_add(Weight::from_parts(10_078, 0).saturating_mul(s.into())) + // Estimated: `11003` + // Minimum execution time: 7_278_000 picoseconds. + Weight::from_parts(9_227_799, 11003) + // Standard Error: 104 + .saturating_add(Weight::from_parts(14_014, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -727,11 +729,11 @@ fn remove_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `637 + s * (35 ±0)` - // Estimated: `21305` - // Minimum execution time: 19_299_000 picoseconds. - Weight::from_parts(24_125_576, 21305) - // Standard Error: 1_479 - .saturating_add(Weight::from_parts(22_611, 0).saturating_mul(s.into())) + // Estimated: `11003` + // Minimum execution time: 15_771_000 picoseconds. + Weight::from_parts(18_105_475, 11003) + // Standard Error: 129 + .saturating_add(Weight::from_parts(32_074, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -739,16 +741,18 @@ /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) /// Storage: Identity SubsOf (r:1 w:1) /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:0) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `s` is `[0, 99]`. fn quit_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `563 + s * (37 ±0)` - // Estimated: `10302` - // Minimum execution time: 14_183_000 picoseconds. - Weight::from_parts(17_343_547, 10302) - // Standard Error: 454 - .saturating_add(Weight::from_parts(45_925, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `703 + s * (37 ±0)` + // Estimated: `6723` + // Minimum execution time: 14_093_000 picoseconds. + Weight::from_parts(16_125_177, 6723) + // Standard Error: 146 + .saturating_add(Weight::from_parts(39_270, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } } --- a/pallets/maintenance/src/weights.rs +++ b/pallets/maintenance/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_maintenance //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/maintenance/src/weights.rs @@ -47,8 +47,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_407_000 picoseconds. - Weight::from_parts(4_556_000, 0) + // Minimum execution time: 3_015_000 picoseconds. + Weight::from_parts(3_184_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Maintenance Enabled (r:0 w:1) @@ -57,8 +57,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_868_000 picoseconds. - Weight::from_parts(6_100_000, 0) + // Minimum execution time: 2_976_000 picoseconds. + Weight::from_parts(3_111_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Preimage StatusFor (r:1 w:0) @@ -68,9 +68,9 @@ fn execute_preimage() -> Weight { // Proof Size summary in bytes: // Measured: `209` - // Estimated: `7230` - // Minimum execution time: 14_046_000 picoseconds. - Weight::from_parts(14_419_000, 7230) + // Estimated: `3674` + // Minimum execution time: 7_359_000 picoseconds. + Weight::from_parts(7_613_000, 3674) .saturating_add(T::DbWeight::get().reads(2_u64)) } } @@ -83,8 +83,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_407_000 picoseconds. - Weight::from_parts(4_556_000, 0) + // Minimum execution time: 3_015_000 picoseconds. + Weight::from_parts(3_184_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Maintenance Enabled (r:0 w:1) @@ -93,8 +93,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_868_000 picoseconds. - Weight::from_parts(6_100_000, 0) + // Minimum execution time: 2_976_000 picoseconds. + Weight::from_parts(3_111_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Preimage StatusFor (r:1 w:0) @@ -104,9 +104,9 @@ fn execute_preimage() -> Weight { // Proof Size summary in bytes: // Measured: `209` - // Estimated: `7230` - // Minimum execution time: 14_046_000 picoseconds. - Weight::from_parts(14_419_000, 7230) + // Estimated: `3674` + // Minimum execution time: 7_359_000 picoseconds. + Weight::from_parts(7_613_000, 3674) .saturating_add(RocksDbWeight::get().reads(2_u64)) } } --- a/pallets/nonfungible/src/benchmarking.rs +++ b/pallets/nonfungible/src/benchmarking.rs @@ -20,7 +20,9 @@ use frame_benchmarking::{benchmarks, account}; use pallet_common::{ bench_init, - benchmarking::{create_collection_raw, property_key, property_value}, + benchmarking::{ + create_collection_raw, property_key, property_value, load_is_admin_and_property_permissions, + }, CommonCollectionOperations, }; use sp_std::prelude::*; @@ -198,8 +200,49 @@ value: property_value(), }).collect::>(); let item = create_max_item(&collection, &owner, owner.clone())?; - }: {>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?} + }: {>::set_token_properties(&collection, &owner, item, props.into_iter(), &Unlimited)?} + + init_token_properties { + let b in 0..MAX_PROPERTIES_PER_ITEM; + bench_init!{ + owner: sub; collection: collection(owner); + owner: cross_from_sub; + }; + let perms = (0..b).map(|k| PropertyKeyPermission { + key: property_key(k as usize), + permission: PropertyPermission { + mutable: false, + collection_admin: true, + token_owner: true, + }, + }).collect::>(); + >::set_token_property_permissions(&collection, &owner, perms)?; + let props = (0..b).map(|k| Property { + key: property_key(k as usize), + value: property_value(), + }).collect::>(); + let item = create_max_item(&collection, &owner, owner.clone())?; + + let (is_collection_admin, property_permissions) = load_is_admin_and_property_permissions(&collection, &owner); + }: { + let mut property_writer = pallet_common::collection_info_loaded_property_writer( + &collection, + is_collection_admin, + property_permissions, + ); + + property_writer.write_token_properties( + true, + item, + props.into_iter(), + crate::erc::ERC721TokenEvent::TokenChanged { + token_id: item.into(), + } + .to_log(T::ContractAddress::get()), + )? + } + delete_token_properties { let b in 0..MAX_PROPERTIES_PER_ITEM; bench_init!{ @@ -220,7 +263,7 @@ value: property_value(), }).collect::>(); let item = create_max_item(&collection, &owner, owner.clone())?; - >::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?; + >::set_token_properties(&collection, &owner, item, props.into_iter(), &Unlimited)?; let to_delete = (0..b).map(|k| property_key(k as usize)).collect::>(); }: {>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?} --- a/pallets/nonfungible/src/common.rs +++ b/pallets/nonfungible/src/common.rs @@ -23,47 +23,40 @@ }; use pallet_common::{ CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight, - weights::WeightInfo as _, SelfWeightOf as PalletCommonWeightOf, + weights::WeightInfo as _, SelfWeightOf as PalletCommonWeightOf, init_token_properties_delta, }; +use pallet_structure::Pallet as PalletStructure; use sp_runtime::DispatchError; use sp_std::{vec::Vec, vec}; use crate::{ AccountBalance, Allowance, Config, CreateItemData, Error, NonfungibleHandle, Owned, Pallet, - SelfWeightOf, TokenData, weights::WeightInfo, TokensMinted, + SelfWeightOf, TokenData, weights::WeightInfo, TokensMinted, TokenProperties, }; pub struct CommonWeights(PhantomData); impl CommonWeightInfo for CommonWeights { fn create_multiple_items_ex(data: &CreateItemExData) -> Weight { match data { - CreateItemExData::NFT(t) => { - >::create_multiple_items_ex(t.len() as u32) - + t.iter() - .filter_map(|t| { - if t.properties.len() > 0 { - Some(Self::set_token_properties(t.properties.len() as u32)) - } else { - None - } - }) - .fold(Weight::zero(), |a, b| a.saturating_add(b)) - } + CreateItemExData::NFT(t) => >::create_multiple_items_ex(t.len() as u32) + .saturating_add(init_token_properties_delta::( + t.iter().map(|t| t.properties.len() as u32), + >::init_token_properties, + )), _ => Weight::zero(), } } fn create_multiple_items(data: &[up_data_structs::CreateItemData]) -> Weight { - >::create_multiple_items(data.len() as u32) - + data - .iter() - .filter_map(|t| match t { - up_data_structs::CreateItemData::NFT(n) if n.properties.len() > 0 => { - Some(Self::set_token_properties(n.properties.len() as u32)) - } - _ => None, - }) - .fold(Weight::zero(), |a, b| a.saturating_add(b)) + >::create_multiple_items(data.len() as u32).saturating_add( + init_token_properties_delta::( + data.iter().map(|t| match t { + up_data_structs::CreateItemData::NFT(n) => n.properties.len() as u32, + _ => 0, + }), + >::init_token_properties, + ), + ) } fn burn_item() -> Weight { @@ -245,7 +238,6 @@ &sender, token_id, properties.into_iter(), - pallet_common::SetPropertyMode::ExistingToken, nesting_budget, ), weight, @@ -273,6 +265,17 @@ ) } + fn get_token_properties_raw( + &self, + token_id: TokenId, + ) -> Option { + >::get((self.id, token_id)) + } + + fn set_token_properties_raw(&self, token_id: TokenId, map: up_data_structs::TokenProperties) { + >::insert((self.id, token_id), map) + } + fn set_token_property_permissions( &self, sender: &T::CrossAccountId, @@ -457,19 +460,36 @@ .ok_or(TokenOwnerError::NotFound) } + fn check_token_indirect_owner( + &self, + token: TokenId, + maybe_owner: &T::CrossAccountId, + nesting_budget: &dyn Budget, + ) -> Result { + >::check_indirectly_owned( + maybe_owner.clone(), + self.id, + token, + None, + nesting_budget, + ) + } + /// Returns token owners. fn token_owners(&self, token: TokenId) -> Vec { self.token_owner(token).map_or_else(|_| vec![], |t| vec![t]) } fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option { - >::token_properties((self.id, token_id)) + >::token_properties((self.id, token_id))? .get(key) .cloned() } fn token_properties(&self, token_id: TokenId, keys: Option>) -> Vec { - let properties = >::token_properties((self.id, token_id)); + let Some(properties) = >::token_properties((self.id, token_id)) else { + return vec![]; + }; keys.map(|keys| { keys.into_iter() --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -203,7 +203,6 @@ &caller, TokenId(token_id), properties.into_iter(), - pallet_common::SetPropertyMode::ExistingToken, &nesting_budget, ) .map_err(dispatch_to_evm::) @@ -273,7 +272,8 @@ .try_into() .map_err(|_| "key too long")?; - let props = >::get((self.id, token_id)); + let props = + >::get((self.id, token_id)).ok_or("token properties not found")?; let prop = props.get(&key).ok_or("key not found")?; Ok(prop.to_vec().into()) @@ -367,7 +367,7 @@ .transpose() .map_err(|e| { Error::Revert(alloc::format!( - "Can not convert value \"baseURI\" to string with error \"{e}\"" + "can not convert value \"baseURI\" to string with error \"{e}\"" )) })?; @@ -658,7 +658,7 @@ let key = key::url(); let permission = get_token_permission::(self.id, &key)?; if !permission.collection_admin { - return Err("Operation is not allowed".into()); + return Err("operation is not allowed".into()); } let caller = T::CrossAccountId::from_eth(caller); @@ -685,7 +685,7 @@ .try_into() .map_err(|_| "token uri is too long")?, }) - .map_err(|e| Error::Revert(alloc::format!("Can't add property: {e:?}")))?; + .map_err(|e| Error::Revert(alloc::format!("can't add property: {e:?}")))?; >::create_item( self, @@ -708,12 +708,12 @@ ) -> Result { collection.consume_store_reads(1)?; let properties = >::try_get((collection.id, token_id)) - .map_err(|_| Error::Revert("Token properties not found".into()))?; + .map_err(|_| Error::Revert("token properties not found".into()))?; if let Some(property) = properties.get(key) { return Ok(String::from_utf8_lossy(property).into()); } - Err("Property tokenURI not found".into()) + Err("property tokenURI not found".into()) } fn get_token_permission( @@ -721,13 +721,13 @@ key: &PropertyKey, ) -> Result { let token_property_permissions = CollectionPropertyPermissions::::try_get(collection_id) - .map_err(|_| Error::Revert("No permissions for collection".into()))?; + .map_err(|_| Error::Revert("no permissions for collection".into()))?; let a = token_property_permissions .get(key) .map(Clone::clone) .ok_or_else(|| { let key = String::from_utf8(key.clone().into_inner()).unwrap_or_default(); - Error::Revert(alloc::format!("No permission for key {key}")) + Error::Revert(alloc::format!("no permission for key {key}")) })?; Ok(a) } @@ -1058,7 +1058,7 @@ .try_into() .map_err(|_| "token uri is too long")?, }) - .map_err(|e| Error::Revert(alloc::format!("Can't add property: {e:?}")))?; + .map_err(|e| Error::Revert(alloc::format!("can't add property: {e:?}")))?; data.push(CreateItemData:: { properties, --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -102,14 +102,14 @@ use up_data_structs::{ AccessMode, CollectionId, CustomDataLimit, TokenId, CreateCollectionData, CreateNftExData, mapping::TokenAddressMapping, budget::Budget, Property, PropertyKey, PropertyValue, - PropertyKeyPermission, PropertyScope, TrySetProperty, TokenChild, AuxPropertyValue, - PropertiesPermissionMap, TokenProperties as TokenPropertiesT, + PropertyKeyPermission, PropertyScope, TokenChild, AuxPropertyValue, PropertiesPermissionMap, + TokenProperties as TokenPropertiesT, }; use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm}; use pallet_common::{ Error as CommonError, Pallet as PalletCommon, Event as CommonEvent, CollectionHandle, eth::collection_id_to_address, SelfWeightOf as PalletCommonWeightOf, - weights::WeightInfo as CommonWeightInfo, helpers::add_weight_to_post_info, SetPropertyMode, + weights::WeightInfo as CommonWeightInfo, helpers::add_weight_to_post_info, }; use pallet_structure::{Pallet as PalletStructure, Error as StructureError}; use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder}; @@ -201,7 +201,7 @@ pub type TokenProperties = StorageNMap< Key = (Key, Key), Value = TokenPropertiesT, - QueryKind = ValueQuery, + QueryKind = OptionQuery, >; /// Custom data of a token that is serialized to bytes, @@ -340,38 +340,6 @@ /// - `token`: Token ID. pub fn token_exists(collection: &NonfungibleHandle, token: TokenId) -> bool { >::contains_key((collection.id, token)) - } - - /// Set the token property with the scope. - /// - /// - `property`: Contains key-value pair. - pub fn set_scoped_token_property( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - property: Property, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |properties| { - properties.try_scoped_set(scope, property.key, property.value) - }) - .map_err(>::from)?; - - Ok(()) - } - - /// Batch operation to set multiple properties with the same scope. - pub fn set_scoped_token_properties( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - properties: impl Iterator, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |stored_properties| { - stored_properties.try_scoped_set_from_iter(scope, properties) - }) - .map_err(>::from)?; - - Ok(()) } /// Add or edit auxiliary data for the property. @@ -598,42 +566,16 @@ sender: &T::CrossAccountId, token_id: TokenId, properties_updates: impl Iterator)>, - mode: SetPropertyMode, nesting_budget: &dyn Budget, ) -> DispatchResult { - let mut is_token_owner = pallet_common::LazyValue::new(|| { - if let SetPropertyMode::NewToken { - mint_target_is_sender, - } = mode - { - return Ok(mint_target_is_sender); - } - - let is_owned = >::check_indirectly_owned( - sender.clone(), - collection.id, - token_id, - None, - nesting_budget, - )?; - - Ok(is_owned) - }); + let mut property_writer = + pallet_common::property_writer_for_existing_token(collection, sender); - let mut is_token_exist = - pallet_common::LazyValue::new(|| Self::token_exists(collection, token_id)); - - let stored_properties = >::get((collection.id, token_id)); - - >::modify_token_properties( - collection, + property_writer.write_token_properties( sender, token_id, - &mut is_token_exist, properties_updates, - stored_properties, - &mut is_token_owner, - |properties| >::set((collection.id, token_id), properties), + nesting_budget, erc::ERC721TokenEvent::TokenChanged { token_id: token_id.into(), } @@ -664,7 +606,6 @@ sender: &T::CrossAccountId, token_id: TokenId, properties: impl Iterator, - mode: SetPropertyMode, nesting_budget: &dyn Budget, ) -> DispatchResult { Self::modify_token_properties( @@ -672,7 +613,6 @@ sender, token_id, properties.map(|p| (p.key, Some(p.value))), - mode, nesting_budget, ) } @@ -694,7 +634,6 @@ sender, token_id, [property].into_iter(), - SetPropertyMode::ExistingToken, nesting_budget, ) } @@ -716,7 +655,6 @@ sender, token_id, property_keys.into_iter().map(|key| (key, None)), - SetPropertyMode::ExistingToken, nesting_budget, ) } @@ -978,6 +916,8 @@ // ========= + let mut property_writer = pallet_common::property_writer_for_new_token(collection, sender); + with_transaction(|| { for (i, data) in data.iter().enumerate() { let token = first_token + i as u32 + 1; @@ -990,21 +930,22 @@ }, ); + let token = TokenId(token); + >::nest_if_sent_to_token_unchecked( &data.owner, collection.id, - TokenId(token), + token, ); - if let Err(e) = Self::set_token_properties( - collection, - sender, - TokenId(token), + if let Err(e) = property_writer.write_token_properties( + sender.conv_eq(&data.owner), + token, data.properties.clone().into_iter(), - SetPropertyMode::NewToken { - mint_target_is_sender: sender.conv_eq(&data.owner), - }, - nesting_budget, + erc::ERC721TokenEvent::TokenChanged { + token_id: token.into(), + } + .to_log(T::ContractAddress::get()), ) { return TransactionOutcome::Rollback(Err(e)); } @@ -1421,7 +1362,9 @@ pub fn repair_item(collection: &NonfungibleHandle, token: TokenId) -> DispatchResult { >::mutate((collection.id, token), |properties| { - properties.recompute_consumed_space(); + if let Some(properties) = properties { + properties.recompute_consumed_space(); + } }); Ok(()) --- a/pallets/nonfungible/src/weights.rs +++ b/pallets/nonfungible/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_nonfungible //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-30, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/nonfungible/src/weights.rs @@ -46,6 +46,7 @@ fn burn_from() -> Weight; fn set_token_property_permissions(b: u32, ) -> Weight; fn set_token_properties(b: u32, ) -> Weight; + fn init_token_properties(b: u32, ) -> Weight; fn delete_token_properties(b: u32, ) -> Weight; fn token_owner() -> Weight; fn set_allowance_for_all() -> Weight; @@ -60,31 +61,23 @@ /// Proof: Nonfungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Nonfungible AccountBalance (r:1 w:1) /// Proof: Nonfungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Nonfungible TokenProperties (r:1 w:1) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenData (r:0 w:1) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// Storage: Nonfungible Owned (r:0 w:1) /// Proof: Nonfungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn create_item() -> Weight { // Proof Size summary in bytes: - // Measured: `390` - // Estimated: `63471` - // Minimum execution time: 25_892_000 picoseconds. - Weight::from_parts(26_424_000, 63471) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) + // Measured: `142` + // Estimated: `3530` + // Minimum execution time: 9_726_000 picoseconds. + Weight::from_parts(10_059_000, 3530) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: Nonfungible TokensMinted (r:1 w:1) /// Proof: Nonfungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Nonfungible AccountBalance (r:1 w:1) /// Proof: Nonfungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Nonfungible TokenProperties (r:200 w:200) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenData (r:0 w:200) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// Storage: Nonfungible Owned (r:0 w:200) @@ -92,26 +85,20 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `390` - // Estimated: `28192 + b * (35279 ±0)` - // Minimum execution time: 4_612_000 picoseconds. - Weight::from_parts(6_399_460, 28192) - // Standard Error: 5_119 - .saturating_add(Weight::from_parts(7_230_389, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) + // Measured: `142` + // Estimated: `3530` + // Minimum execution time: 3_270_000 picoseconds. + Weight::from_parts(3_693_659, 3530) + // Standard Error: 255 + .saturating_add(Weight::from_parts(3_024_284, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) - .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 35279).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(b.into()))) } /// Storage: Nonfungible TokensMinted (r:1 w:1) /// Proof: Nonfungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Nonfungible AccountBalance (r:200 w:200) /// Proof: Nonfungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Nonfungible TokenProperties (r:200 w:200) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenData (r:0 w:200) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// Storage: Nonfungible Owned (r:0 w:200) @@ -119,17 +106,17 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items_ex(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `390` - // Estimated: `25652 + b * (37819 ±0)` - // Minimum execution time: 4_538_000 picoseconds. - Weight::from_parts(4_686_000, 25652) - // Standard Error: 3_518 - .saturating_add(Weight::from_parts(8_905_771, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b.into()))) + // Measured: `142` + // Estimated: `3481 + b * (2540 ±0)` + // Minimum execution time: 3_188_000 picoseconds. + Weight::from_parts(3_307_000, 3481) + // Standard Error: 567 + .saturating_add(Weight::from_parts(4_320_449, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) - .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 37819).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 2540).saturating_mul(b.into())) } /// Storage: Nonfungible TokenData (r:1 w:1) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) @@ -148,9 +135,9 @@ fn burn_item() -> Weight { // Proof Size summary in bytes: // Measured: `380` - // Estimated: `17561` - // Minimum execution time: 24_230_000 picoseconds. - Weight::from_parts(24_672_000, 17561) + // Estimated: `3530` + // Minimum execution time: 18_062_000 picoseconds. + Weight::from_parts(18_433_000, 3530) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -171,9 +158,9 @@ fn burn_recursively_self_raw() -> Weight { // Proof Size summary in bytes: // Measured: `380` - // Estimated: `17561` - // Minimum execution time: 30_521_000 picoseconds. - Weight::from_parts(31_241_000, 17561) + // Estimated: `3530` + // Minimum execution time: 22_942_000 picoseconds. + Weight::from_parts(23_527_000, 3530) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -196,17 +183,17 @@ /// The range of component `b` is `[0, 200]`. fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1467 + b * (58 ±0)` - // Estimated: `24230 + b * (10097 ±0)` - // Minimum execution time: 31_734_000 picoseconds. - Weight::from_parts(32_162_000, 24230) - // Standard Error: 210_514 - .saturating_add(Weight::from_parts(71_382_804, 0).saturating_mul(b.into())) + // Measured: `1500 + b * (58 ±0)` + // Estimated: `5874 + b * (5032 ±0)` + // Minimum execution time: 22_709_000 picoseconds. + Weight::from_parts(23_287_000, 5874) + // Standard Error: 89_471 + .saturating_add(Weight::from_parts(63_285_201, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(6_u64)) .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 10097).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 5032).saturating_mul(b.into())) } /// Storage: Nonfungible TokenData (r:1 w:1) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) @@ -219,9 +206,9 @@ fn transfer_raw() -> Weight { // Proof Size summary in bytes: // Measured: `380` - // Estimated: `13114` - // Minimum execution time: 18_305_000 picoseconds. - Weight::from_parts(18_859_000, 13114) + // Estimated: `6070` + // Minimum execution time: 13_652_000 picoseconds. + Weight::from_parts(13_981_000, 6070) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -232,9 +219,9 @@ fn approve() -> Weight { // Proof Size summary in bytes: // Measured: `326` - // Estimated: `7044` - // Minimum execution time: 10_977_000 picoseconds. - Weight::from_parts(11_184_000, 7044) + // Estimated: `3522` + // Minimum execution time: 7_837_000 picoseconds. + Weight::from_parts(8_113_000, 3522) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -245,9 +232,9 @@ fn approve_from() -> Weight { // Proof Size summary in bytes: // Measured: `313` - // Estimated: `7044` - // Minimum execution time: 11_456_000 picoseconds. - Weight::from_parts(11_731_000, 7044) + // Estimated: `3522` + // Minimum execution time: 7_769_000 picoseconds. + Weight::from_parts(7_979_000, 3522) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -257,8 +244,8 @@ // Proof Size summary in bytes: // Measured: `362` // Estimated: `3522` - // Minimum execution time: 5_771_000 picoseconds. - Weight::from_parts(5_972_000, 3522) + // Minimum execution time: 4_194_000 picoseconds. + Weight::from_parts(4_353_000, 3522) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: Nonfungible Allowance (r:1 w:1) @@ -278,9 +265,9 @@ fn burn_from() -> Weight { // Proof Size summary in bytes: // Measured: `463` - // Estimated: `17561` - // Minimum execution time: 30_633_000 picoseconds. - Weight::from_parts(31_136_000, 17561) + // Estimated: `3530` + // Minimum execution time: 21_978_000 picoseconds. + Weight::from_parts(22_519_000, 3530) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -289,45 +276,62 @@ /// The range of component `b` is `[0, 64]`. fn set_token_property_permissions(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `281` + // Measured: `314` // Estimated: `20191` - // Minimum execution time: 2_300_000 picoseconds. - Weight::from_parts(2_382_000, 20191) - // Standard Error: 45_076 - .saturating_add(Weight::from_parts(12_000_777, 0).saturating_mul(b.into())) + // Minimum execution time: 1_457_000 picoseconds. + Weight::from_parts(1_563_000, 20191) + // Standard Error: 14_041 + .saturating_add(Weight::from_parts(8_452_415, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: Common CollectionPropertyPermissions (r:1 w:0) + /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenProperties (r:1 w:1) /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenData (r:1 w:0) + /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn set_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `584 + b * (261 ±0)` - // Estimated: `56460` - // Minimum execution time: 12_422_000 picoseconds. - Weight::from_parts(5_523_689, 56460) - // Standard Error: 74_137 - .saturating_add(Weight::from_parts(6_320_501, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `640 + b * (261 ±0)` + // Estimated: `36269` + // Minimum execution time: 963_000 picoseconds. + Weight::from_parts(1_126_511, 36269) + // Standard Error: 9_175 + .saturating_add(Weight::from_parts(5_096_011, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nonfungible TokenProperties (r:1 w:1) + /// Storage: Nonfungible TokenProperties (r:0 w:1) /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) + /// The range of component `b` is `[0, 64]`. + fn init_token_properties(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 194_000 picoseconds. + Weight::from_parts(222_000, 0) + // Standard Error: 7_295 + .saturating_add(Weight::from_parts(4_499_463, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: Common CollectionPropertyPermissions (r:1 w:0) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenData (r:1 w:0) + /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenProperties (r:1 w:1) + /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn delete_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `589 + b * (33291 ±0)` - // Estimated: `56460` - // Minimum execution time: 12_006_000 picoseconds. - Weight::from_parts(12_216_000, 56460) - // Standard Error: 83_431 - .saturating_add(Weight::from_parts(24_556_999, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `699 + b * (33291 ±0)` + // Estimated: `36269` + // Minimum execution time: 992_000 picoseconds. + Weight::from_parts(1_043_000, 36269) + // Standard Error: 37_370 + .saturating_add(Weight::from_parts(23_672_870, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Nonfungible TokenData (r:1 w:0) @@ -336,8 +340,8 @@ // Proof Size summary in bytes: // Measured: `326` // Estimated: `3522` - // Minimum execution time: 4_827_000 picoseconds. - Weight::from_parts(4_984_000, 3522) + // Minimum execution time: 3_743_000 picoseconds. + Weight::from_parts(3_908_000, 3522) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: Nonfungible CollectionAllowance (r:0 w:1) @@ -346,28 +350,28 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_151_000 picoseconds. - Weight::from_parts(6_394_000, 0) + // Minimum execution time: 4_106_000 picoseconds. + Weight::from_parts(4_293_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Nonfungible CollectionAllowance (r:1 w:0) /// Proof: Nonfungible CollectionAllowance (max_values: None, max_size: Some(111), added: 2586, mode: MaxEncodedLen) fn allowance_for_all() -> Weight { // Proof Size summary in bytes: - // Measured: `109` + // Measured: `142` // Estimated: `3576` - // Minimum execution time: 3_791_000 picoseconds. - Weight::from_parts(3_950_000, 3576) + // Minimum execution time: 2_775_000 picoseconds. + Weight::from_parts(2_923_000, 3576) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: Nonfungible TokenProperties (r:1 w:1) /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn repair_item() -> Weight { // Proof Size summary in bytes: - // Measured: `300` + // Measured: `279` // Estimated: `36269` - // Minimum execution time: 5_364_000 picoseconds. - Weight::from_parts(5_539_000, 36269) + // Minimum execution time: 3_033_000 picoseconds. + Weight::from_parts(3_174_000, 36269) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -379,31 +383,23 @@ /// Proof: Nonfungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Nonfungible AccountBalance (r:1 w:1) /// Proof: Nonfungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Nonfungible TokenProperties (r:1 w:1) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenData (r:0 w:1) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// Storage: Nonfungible Owned (r:0 w:1) /// Proof: Nonfungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn create_item() -> Weight { // Proof Size summary in bytes: - // Measured: `390` - // Estimated: `63471` - // Minimum execution time: 25_892_000 picoseconds. - Weight::from_parts(26_424_000, 63471) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(5_u64)) + // Measured: `142` + // Estimated: `3530` + // Minimum execution time: 9_726_000 picoseconds. + Weight::from_parts(10_059_000, 3530) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: Nonfungible TokensMinted (r:1 w:1) /// Proof: Nonfungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Nonfungible AccountBalance (r:1 w:1) /// Proof: Nonfungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Nonfungible TokenProperties (r:200 w:200) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenData (r:0 w:200) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// Storage: Nonfungible Owned (r:0 w:200) @@ -411,26 +407,20 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `390` - // Estimated: `28192 + b * (35279 ±0)` - // Minimum execution time: 4_612_000 picoseconds. - Weight::from_parts(6_399_460, 28192) - // Standard Error: 5_119 - .saturating_add(Weight::from_parts(7_230_389, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b.into()))) + // Measured: `142` + // Estimated: `3530` + // Minimum execution time: 3_270_000 picoseconds. + Weight::from_parts(3_693_659, 3530) + // Standard Error: 255 + .saturating_add(Weight::from_parts(3_024_284, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) - .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 35279).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(b.into()))) } /// Storage: Nonfungible TokensMinted (r:1 w:1) /// Proof: Nonfungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Nonfungible AccountBalance (r:200 w:200) /// Proof: Nonfungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Nonfungible TokenProperties (r:200 w:200) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Nonfungible TokenData (r:0 w:200) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// Storage: Nonfungible Owned (r:0 w:200) @@ -438,17 +428,17 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items_ex(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `390` - // Estimated: `25652 + b * (37819 ±0)` - // Minimum execution time: 4_538_000 picoseconds. - Weight::from_parts(4_686_000, 25652) - // Standard Error: 3_518 - .saturating_add(Weight::from_parts(8_905_771, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(b.into()))) + // Measured: `142` + // Estimated: `3481 + b * (2540 ±0)` + // Minimum execution time: 3_188_000 picoseconds. + Weight::from_parts(3_307_000, 3481) + // Standard Error: 567 + .saturating_add(Weight::from_parts(4_320_449, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) - .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 37819).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 2540).saturating_mul(b.into())) } /// Storage: Nonfungible TokenData (r:1 w:1) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) @@ -467,9 +457,9 @@ fn burn_item() -> Weight { // Proof Size summary in bytes: // Measured: `380` - // Estimated: `17561` - // Minimum execution time: 24_230_000 picoseconds. - Weight::from_parts(24_672_000, 17561) + // Estimated: `3530` + // Minimum execution time: 18_062_000 picoseconds. + Weight::from_parts(18_433_000, 3530) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -490,9 +480,9 @@ fn burn_recursively_self_raw() -> Weight { // Proof Size summary in bytes: // Measured: `380` - // Estimated: `17561` - // Minimum execution time: 30_521_000 picoseconds. - Weight::from_parts(31_241_000, 17561) + // Estimated: `3530` + // Minimum execution time: 22_942_000 picoseconds. + Weight::from_parts(23_527_000, 3530) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -515,17 +505,17 @@ /// The range of component `b` is `[0, 200]`. fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1467 + b * (58 ±0)` - // Estimated: `24230 + b * (10097 ±0)` - // Minimum execution time: 31_734_000 picoseconds. - Weight::from_parts(32_162_000, 24230) - // Standard Error: 210_514 - .saturating_add(Weight::from_parts(71_382_804, 0).saturating_mul(b.into())) + // Measured: `1500 + b * (58 ±0)` + // Estimated: `5874 + b * (5032 ±0)` + // Minimum execution time: 22_709_000 picoseconds. + Weight::from_parts(23_287_000, 5874) + // Standard Error: 89_471 + .saturating_add(Weight::from_parts(63_285_201, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(6_u64)) .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 10097).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 5032).saturating_mul(b.into())) } /// Storage: Nonfungible TokenData (r:1 w:1) /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) @@ -538,9 +528,9 @@ fn transfer_raw() -> Weight { // Proof Size summary in bytes: // Measured: `380` - // Estimated: `13114` - // Minimum execution time: 18_305_000 picoseconds. - Weight::from_parts(18_859_000, 13114) + // Estimated: `6070` + // Minimum execution time: 13_652_000 picoseconds. + Weight::from_parts(13_981_000, 6070) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -551,9 +541,9 @@ fn approve() -> Weight { // Proof Size summary in bytes: // Measured: `326` - // Estimated: `7044` - // Minimum execution time: 10_977_000 picoseconds. - Weight::from_parts(11_184_000, 7044) + // Estimated: `3522` + // Minimum execution time: 7_837_000 picoseconds. + Weight::from_parts(8_113_000, 3522) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -564,9 +554,9 @@ fn approve_from() -> Weight { // Proof Size summary in bytes: // Measured: `313` - // Estimated: `7044` - // Minimum execution time: 11_456_000 picoseconds. - Weight::from_parts(11_731_000, 7044) + // Estimated: `3522` + // Minimum execution time: 7_769_000 picoseconds. + Weight::from_parts(7_979_000, 3522) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -576,8 +566,8 @@ // Proof Size summary in bytes: // Measured: `362` // Estimated: `3522` - // Minimum execution time: 5_771_000 picoseconds. - Weight::from_parts(5_972_000, 3522) + // Minimum execution time: 4_194_000 picoseconds. + Weight::from_parts(4_353_000, 3522) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: Nonfungible Allowance (r:1 w:1) @@ -597,9 +587,9 @@ fn burn_from() -> Weight { // Proof Size summary in bytes: // Measured: `463` - // Estimated: `17561` - // Minimum execution time: 30_633_000 picoseconds. - Weight::from_parts(31_136_000, 17561) + // Estimated: `3530` + // Minimum execution time: 21_978_000 picoseconds. + Weight::from_parts(22_519_000, 3530) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -608,45 +598,62 @@ /// The range of component `b` is `[0, 64]`. fn set_token_property_permissions(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `281` + // Measured: `314` // Estimated: `20191` - // Minimum execution time: 2_300_000 picoseconds. - Weight::from_parts(2_382_000, 20191) - // Standard Error: 45_076 - .saturating_add(Weight::from_parts(12_000_777, 0).saturating_mul(b.into())) + // Minimum execution time: 1_457_000 picoseconds. + Weight::from_parts(1_563_000, 20191) + // Standard Error: 14_041 + .saturating_add(Weight::from_parts(8_452_415, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nonfungible TokenProperties (r:1 w:1) - /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) /// Storage: Common CollectionPropertyPermissions (r:1 w:0) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenProperties (r:1 w:1) + /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenData (r:1 w:0) + /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn set_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `584 + b * (261 ±0)` - // Estimated: `56460` - // Minimum execution time: 12_422_000 picoseconds. - Weight::from_parts(5_523_689, 56460) - // Standard Error: 74_137 - .saturating_add(Weight::from_parts(6_320_501, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `640 + b * (261 ±0)` + // Estimated: `36269` + // Minimum execution time: 963_000 picoseconds. + Weight::from_parts(1_126_511, 36269) + // Standard Error: 9_175 + .saturating_add(Weight::from_parts(5_096_011, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nonfungible TokenProperties (r:1 w:1) + /// Storage: Nonfungible TokenProperties (r:0 w:1) /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) + /// The range of component `b` is `[0, 64]`. + fn init_token_properties(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 194_000 picoseconds. + Weight::from_parts(222_000, 0) + // Standard Error: 7_295 + .saturating_add(Weight::from_parts(4_499_463, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } /// Storage: Common CollectionPropertyPermissions (r:1 w:0) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenData (r:1 w:0) + /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + /// Storage: Nonfungible TokenProperties (r:1 w:1) + /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn delete_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `589 + b * (33291 ±0)` - // Estimated: `56460` - // Minimum execution time: 12_006_000 picoseconds. - Weight::from_parts(12_216_000, 56460) - // Standard Error: 83_431 - .saturating_add(Weight::from_parts(24_556_999, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `699 + b * (33291 ±0)` + // Estimated: `36269` + // Minimum execution time: 992_000 picoseconds. + Weight::from_parts(1_043_000, 36269) + // Standard Error: 37_370 + .saturating_add(Weight::from_parts(23_672_870, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Nonfungible TokenData (r:1 w:0) @@ -655,8 +662,8 @@ // Proof Size summary in bytes: // Measured: `326` // Estimated: `3522` - // Minimum execution time: 4_827_000 picoseconds. - Weight::from_parts(4_984_000, 3522) + // Minimum execution time: 3_743_000 picoseconds. + Weight::from_parts(3_908_000, 3522) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: Nonfungible CollectionAllowance (r:0 w:1) @@ -665,28 +672,28 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_151_000 picoseconds. - Weight::from_parts(6_394_000, 0) + // Minimum execution time: 4_106_000 picoseconds. + Weight::from_parts(4_293_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Nonfungible CollectionAllowance (r:1 w:0) /// Proof: Nonfungible CollectionAllowance (max_values: None, max_size: Some(111), added: 2586, mode: MaxEncodedLen) fn allowance_for_all() -> Weight { // Proof Size summary in bytes: - // Measured: `109` + // Measured: `142` // Estimated: `3576` - // Minimum execution time: 3_791_000 picoseconds. - Weight::from_parts(3_950_000, 3576) + // Minimum execution time: 2_775_000 picoseconds. + Weight::from_parts(2_923_000, 3576) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: Nonfungible TokenProperties (r:1 w:1) /// Proof: Nonfungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn repair_item() -> Weight { // Proof Size summary in bytes: - // Measured: `300` + // Measured: `279` // Estimated: `36269` - // Minimum execution time: 5_364_000 picoseconds. - Weight::from_parts(5_539_000, 36269) + // Minimum execution time: 3_033_000 picoseconds. + Weight::from_parts(3_174_000, 36269) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } --- a/pallets/refungible/src/benchmarking.rs +++ b/pallets/refungible/src/benchmarking.rs @@ -22,7 +22,9 @@ use frame_benchmarking::{benchmarks, account}; use pallet_common::{ bench_init, - benchmarking::{create_collection_raw, property_key, property_value}, + benchmarking::{ + create_collection_raw, property_key, property_value, load_is_admin_and_property_permissions, + }, }; use sp_std::prelude::*; use up_data_structs::{ @@ -255,8 +257,49 @@ value: property_value(), }).collect::>(); let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - }: {>::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?} + }: {>::set_token_properties(&collection, &owner, item, props.into_iter(), &Unlimited)?} + + init_token_properties { + let b in 0..MAX_PROPERTIES_PER_ITEM; + bench_init!{ + owner: sub; collection: collection(owner); + owner: cross_from_sub; + }; + let perms = (0..b).map(|k| PropertyKeyPermission { + key: property_key(k as usize), + permission: PropertyPermission { + mutable: false, + collection_admin: true, + token_owner: true, + }, + }).collect::>(); + >::set_token_property_permissions(&collection, &owner, perms)?; + let props = (0..b).map(|k| Property { + key: property_key(k as usize), + value: property_value(), + }).collect::>(); + let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; + + let (is_collection_admin, property_permissions) = load_is_admin_and_property_permissions(&collection, &owner); + }: { + let mut property_writer = pallet_common::collection_info_loaded_property_writer( + &collection, + is_collection_admin, + property_permissions, + ); + + property_writer.write_token_properties( + true, + item, + props.into_iter(), + crate::erc::ERC721TokenEvent::TokenChanged { + token_id: item.into(), + } + .to_log(T::ContractAddress::get()), + )? + } + delete_token_properties { let b in 0..MAX_PROPERTIES_PER_ITEM; bench_init!{ @@ -277,7 +320,7 @@ value: property_value(), }).collect::>(); let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - >::set_token_properties(&collection, &owner, item, props.into_iter(), SetPropertyMode::ExistingToken, &Unlimited)?; + >::set_token_properties(&collection, &owner, item, props.into_iter(), &Unlimited)?; let to_delete = (0..b).map(|k| property_key(k as usize)).collect::>(); }: {>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?} --- a/pallets/refungible/src/common.rs +++ b/pallets/refungible/src/common.rs @@ -20,20 +20,20 @@ use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight, traits::Get}; use up_data_structs::{ CollectionId, TokenId, CreateItemExData, budget::Budget, Property, PropertyKey, PropertyValue, - PropertyKeyPermission, CollectionPropertiesVec, CreateRefungibleExMultipleOwners, - CreateRefungibleExSingleOwner, TokenOwnerError, + PropertyKeyPermission, CreateRefungibleExMultipleOwners, CreateRefungibleExSingleOwner, + TokenOwnerError, }; use pallet_common::{ CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight, - weights::WeightInfo as _, + weights::WeightInfo as _, init_token_properties_delta, }; -use pallet_structure::Error as StructureError; +use pallet_structure::{Pallet as PalletStructure, Error as StructureError}; use sp_runtime::{DispatchError}; use sp_std::{vec::Vec, vec}; use crate::{ AccountBalance, Allowance, Balance, Config, Error, Owned, Pallet, RefungibleHandle, - SelfWeightOf, weights::WeightInfo, TokensMinted, TotalSupply, CreateItemData, + SelfWeightOf, weights::WeightInfo, TokensMinted, TotalSupply, CreateItemData, TokenProperties, }; macro_rules! max_weight_of { @@ -43,28 +43,21 @@ .max(>::$method($($args)*)) )* }; -} - -fn properties_weight(properties: &CollectionPropertiesVec) -> Weight { - if properties.len() > 0 { - >::set_token_properties(properties.len() as u32) - } else { - Weight::zero() - } } pub struct CommonWeights(PhantomData); impl CommonWeightInfo for CommonWeights { fn create_multiple_items(data: &[up_data_structs::CreateItemData]) -> Weight { >::create_multiple_items(data.len() as u32).saturating_add( - data.iter() - .map(|data| match data { + init_token_properties_delta::( + data.iter().map(|data| match data { up_data_structs::CreateItemData::ReFungible(rft_data) => { - properties_weight::(&rft_data.properties) + rft_data.properties.len() as u32 } - _ => Weight::zero(), - }) - .fold(Weight::zero(), |a, b| a.saturating_add(b)), + _ => 0, + }), + >::init_token_properties, + ), ) } @@ -72,15 +65,17 @@ match call { CreateItemExData::RefungibleMultipleOwners(i) => { >::create_multiple_items_ex_multiple_owners(i.users.len() as u32) - .saturating_add(properties_weight::(&i.properties)) + .saturating_add(init_token_properties_delta::( + [i.properties.len() as u32].into_iter(), + >::init_token_properties, + )) } CreateItemExData::RefungibleMultipleItems(i) => { >::create_multiple_items_ex_multiple_items(i.len() as u32) - .saturating_add( - i.iter() - .map(|d| properties_weight::(&d.properties)) - .fold(Weight::zero(), |a, b| a.saturating_add(b)), - ) + .saturating_add(init_token_properties_delta::( + i.iter().map(|d| d.properties.len() as u32), + >::init_token_properties, + )) } _ => Weight::zero(), } @@ -399,7 +394,6 @@ &sender, token_id, properties.into_iter(), - pallet_common::SetPropertyMode::ExistingToken, nesting_budget, ), weight, @@ -441,6 +435,17 @@ ) } + fn get_token_properties_raw( + &self, + token_id: TokenId, + ) -> Option { + >::get((self.id, token_id)) + } + + fn set_token_properties_raw(&self, token_id: TokenId, map: up_data_structs::TokenProperties) { + >::insert((self.id, token_id), map) + } + fn check_nesting( &self, _sender: ::CrossAccountId, @@ -479,19 +484,44 @@ >::token_owner(self.id, token) } + fn check_token_indirect_owner( + &self, + token: TokenId, + maybe_owner: &T::CrossAccountId, + nesting_budget: &dyn Budget, + ) -> Result { + let balance = self.balance(maybe_owner.clone(), token); + let total_pieces: u128 = >::total_pieces(self.id, token).unwrap_or(u128::MAX); + if balance != total_pieces { + return Ok(false); + } + + let is_bundle_owner = >::check_indirectly_owned( + maybe_owner.clone(), + self.id, + token, + None, + nesting_budget, + )?; + + Ok(is_bundle_owner) + } + /// Returns 10 token in no particular order. fn token_owners(&self, token: TokenId) -> Vec { >::token_owners(self.id, token).unwrap_or_default() } fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option { - >::token_properties((self.id, token_id)) + >::token_properties((self.id, token_id))? .get(key) .cloned() } fn token_properties(&self, token_id: TokenId, keys: Option>) -> Vec { - let properties = >::token_properties((self.id, token_id)); + let Some(properties) = >::token_properties((self.id, token_id)) else { + return vec![]; + }; keys.map(|keys| { keys.into_iter() --- a/pallets/refungible/src/erc.rs +++ b/pallets/refungible/src/erc.rs @@ -214,7 +214,6 @@ &caller, TokenId(token_id), properties.into_iter(), - pallet_common::SetPropertyMode::ExistingToken, &nesting_budget, ) .map_err(dispatch_to_evm::) @@ -284,7 +283,8 @@ .try_into() .map_err(|_| "key too long")?; - let props = >::get((self.id, token_id)); + let props = + >::get((self.id, token_id)).ok_or("token properties not found")?; let prop = props.get(&key).ok_or("key not found")?; Ok(prop.to_vec().into()) @@ -372,7 +372,7 @@ .transpose() .map_err(|e| { Error::Revert(alloc::format!( - "Can not convert value \"baseURI\" to string with error \"{e}\"" + "can not convert value \"baseURI\" to string with error \"{e}\"" )) })?; @@ -697,7 +697,7 @@ let key = key::url(); let permission = get_token_permission::(self.id, &key)?; if !permission.collection_admin { - return Err("Operation is not allowed".into()); + return Err("operation is not allowed".into()); } let caller = T::CrossAccountId::from_eth(caller); @@ -724,7 +724,7 @@ .try_into() .map_err(|_| "token uri is too long")?, }) - .map_err(|e| Error::Revert(alloc::format!("Can't add property: {e:?}")))?; + .map_err(|e| Error::Revert(alloc::format!("can't add property: {e:?}")))?; let users = [(to, 1)] .into_iter() @@ -749,12 +749,12 @@ ) -> Result { collection.consume_store_reads(1)?; let properties = >::try_get((collection.id, token_id)) - .map_err(|_| Error::Revert("Token properties not found".into()))?; + .map_err(|_| Error::Revert("token properties not found".into()))?; if let Some(property) = properties.get(key) { return Ok(String::from_utf8_lossy(property).into()); } - Err("Property tokenURI not found".into()) + Err("property tokenURI not found".into()) } fn get_token_permission( @@ -762,13 +762,13 @@ key: &PropertyKey, ) -> Result { let token_property_permissions = CollectionPropertyPermissions::::try_get(collection_id) - .map_err(|_| Error::Revert("No permissions for collection".into()))?; + .map_err(|_| Error::Revert("no permissions for collection".into()))?; let a = token_property_permissions .get(key) .map(Clone::clone) .ok_or_else(|| { let key = String::from_utf8(key.clone().into_inner()).unwrap_or_default(); - Error::Revert(alloc::format!("No permission for key {key}")) + Error::Revert(alloc::format!("no permission for key {key}")) })?; Ok(a) } @@ -1133,7 +1133,7 @@ .try_into() .map_err(|_| "token uri is too long")?, }) - .map_err(|e| Error::Revert(alloc::format!("Can't add property: {e:?}")))?; + .map_err(|e| Error::Revert(alloc::format!("can't add property: {e:?}")))?; let create_item_data = CreateItemData:: { users: users.clone(), --- a/pallets/refungible/src/lib.rs +++ b/pallets/refungible/src/lib.rs @@ -96,8 +96,8 @@ use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm}; use pallet_evm_coder_substrate::WithRecorder; use pallet_common::{ - CommonCollectionOperations, Error as CommonError, eth::collection_id_to_address, - Event as CommonEvent, Pallet as PalletCommon, SetPropertyMode, + Error as CommonError, eth::collection_id_to_address, Event as CommonEvent, + Pallet as PalletCommon, }; use pallet_structure::Pallet as PalletStructure; use sp_core::{Get, H160}; @@ -106,8 +106,8 @@ use up_data_structs::{ AccessMode, budget::Budget, CollectionId, CreateCollectionData, mapping::TokenAddressMapping, MAX_REFUNGIBLE_PIECES, Property, PropertyKey, PropertyKeyPermission, PropertyScope, - PropertyValue, TokenId, TrySetProperty, PropertiesPermissionMap, - CreateRefungibleExMultipleOwners, TokenOwnerError, TokenProperties as TokenPropertiesT, + PropertyValue, TokenId, PropertiesPermissionMap, CreateRefungibleExMultipleOwners, + TokenOwnerError, TokenProperties as TokenPropertiesT, }; pub use pallet::*; @@ -175,7 +175,7 @@ pub type TokenProperties = StorageNMap< Key = (Key, Key), Value = TokenPropertiesT, - QueryKind = ValueQuery, + QueryKind = OptionQuery, >; /// Total amount of pieces for token @@ -292,34 +292,6 @@ /// - `token`: Token ID. pub fn token_exists(collection: &RefungibleHandle, token: TokenId) -> bool { >::contains_key((collection.id, token)) - } - - pub fn set_scoped_token_property( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - property: Property, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |properties| { - properties.try_scoped_set(scope, property.key, property.value) - }) - .map_err(>::from)?; - - Ok(()) - } - - pub fn set_scoped_token_properties( - collection_id: CollectionId, - token_id: TokenId, - scope: PropertyScope, - properties: impl Iterator, - ) -> DispatchResult { - TokenProperties::::try_mutate((collection_id, token_id), |stored_properties| { - stored_properties.try_scoped_set_from_iter(scope, properties) - }) - .map_err(>::from)?; - - Ok(()) } } @@ -533,50 +505,16 @@ sender: &T::CrossAccountId, token_id: TokenId, properties_updates: impl Iterator)>, - mode: SetPropertyMode, nesting_budget: &dyn Budget, ) -> DispatchResult { - let mut is_token_owner = - pallet_common::LazyValue::new(|| -> Result { - if let SetPropertyMode::NewToken { - mint_target_is_sender, - } = mode - { - return Ok(mint_target_is_sender); - } - - let balance = collection.balance(sender.clone(), token_id); - let total_pieces: u128 = - Self::total_pieces(collection.id, token_id).unwrap_or(u128::MAX); - if balance != total_pieces { - return Ok(false); - } - - let is_bundle_owner = >::check_indirectly_owned( - sender.clone(), - collection.id, - token_id, - None, - nesting_budget, - )?; - - Ok(is_bundle_owner) - }); + let mut property_writer = + pallet_common::property_writer_for_existing_token(collection, sender); - let mut is_token_exist = - pallet_common::LazyValue::new(|| Self::token_exists(collection, token_id)); - - let stored_properties = >::get((collection.id, token_id)); - - >::modify_token_properties( - collection, + property_writer.write_token_properties( sender, token_id, - &mut is_token_exist, properties_updates, - stored_properties, - &mut is_token_owner, - |properties| >::set((collection.id, token_id), properties), + nesting_budget, erc::ERC721TokenEvent::TokenChanged { token_id: token_id.into(), } @@ -602,7 +540,6 @@ sender: &T::CrossAccountId, token_id: TokenId, properties: impl Iterator, - mode: SetPropertyMode, nesting_budget: &dyn Budget, ) -> DispatchResult { Self::modify_token_properties( @@ -610,7 +547,6 @@ sender, token_id, properties.map(|p| (p.key, Some(p.value))), - mode, nesting_budget, ) } @@ -627,7 +563,6 @@ sender, token_id, [property].into_iter(), - SetPropertyMode::ExistingToken, nesting_budget, ) } @@ -644,7 +579,6 @@ sender, token_id, property_keys.into_iter().map(|key| (key, None)), - SetPropertyMode::ExistingToken, nesting_budget, ) } @@ -925,11 +859,15 @@ // ========= + let mut property_writer = pallet_common::property_writer_for_new_token(collection, sender); + with_transaction(|| { for (i, data) in data.iter().enumerate() { let token_id = first_token_id + i as u32 + 1; >::insert((collection.id, token_id), totals[i]); + let token = TokenId(token_id); + let mut mint_target_is_sender = true; for (user, amount) in data.users.iter() { if *amount == 0 { @@ -939,23 +877,22 @@ mint_target_is_sender = mint_target_is_sender && sender.conv_eq(user); >::insert((collection.id, token_id, &user), amount); - >::insert((collection.id, &user, TokenId(token_id)), true); + >::insert((collection.id, &user, token), true); >::nest_if_sent_to_token_unchecked( user, collection.id, - TokenId(token_id), + token, ); } - if let Err(e) = Self::set_token_properties( - collection, - sender, - TokenId(token_id), + if let Err(e) = property_writer.write_token_properties( + mint_target_is_sender, + token, data.properties.clone().into_iter(), - SetPropertyMode::NewToken { - mint_target_is_sender, - }, - nesting_budget, + erc::ERC721TokenEvent::TokenChanged { + token_id: token.into(), + } + .to_log(T::ContractAddress::get()), ) { return TransactionOutcome::Rollback(Err(e)); } @@ -1461,7 +1398,9 @@ pub fn repair_item(collection: &RefungibleHandle, token: TokenId) -> DispatchResult { >::mutate((collection.id, token), |properties| { - properties.recompute_consumed_space(); + if let Some(properties) = properties { + properties.recompute_consumed_space(); + } }); Ok(()) --- a/pallets/refungible/src/weights.rs +++ b/pallets/refungible/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_refungible //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-30, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/refungible/src/weights.rs @@ -52,6 +52,7 @@ fn burn_from() -> Weight; fn set_token_property_permissions(b: u32, ) -> Weight; fn set_token_properties(b: u32, ) -> Weight; + fn init_token_properties(b: u32, ) -> Weight; fn delete_token_properties(b: u32, ) -> Weight; fn repartition_item() -> Weight; fn token_owner() -> Weight; @@ -67,10 +68,6 @@ /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:1 w:1) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:1 w:1) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:1) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:1) @@ -79,21 +76,17 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn create_item() -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `63471` - // Minimum execution time: 30_759_000 picoseconds. - Weight::from_parts(31_321_000, 63471) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(6_u64)) + // Measured: `4` + // Estimated: `3530` + // Minimum execution time: 11_341_000 picoseconds. + Weight::from_parts(11_741_000, 3530) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: Refungible TokensMinted (r:1 w:1) /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:1 w:1) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:200 w:200) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:200) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:200) @@ -103,26 +96,20 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `28192 + b * (35279 ±0)` - // Minimum execution time: 4_024_000 picoseconds. - Weight::from_parts(4_145_000, 28192) - // Standard Error: 3_332 - .saturating_add(Weight::from_parts(8_967_757, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) + // Measured: `4` + // Estimated: `3530` + // Minimum execution time: 2_665_000 picoseconds. + Weight::from_parts(2_791_000, 3530) + // Standard Error: 996 + .saturating_add(Weight::from_parts(4_343_736, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) - .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 35279).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(b.into()))) } /// Storage: Refungible TokensMinted (r:1 w:1) /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:200 w:200) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:200 w:200) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:200) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:200) @@ -132,26 +119,22 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `25652 + b * (37819 ±0)` - // Minimum execution time: 3_715_000 picoseconds. - Weight::from_parts(3_881_000, 25652) - // Standard Error: 3_275 - .saturating_add(Weight::from_parts(10_525_271, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b.into()))) + // Measured: `4` + // Estimated: `3481 + b * (2540 ±0)` + // Minimum execution time: 2_616_000 picoseconds. + Weight::from_parts(2_726_000, 3481) + // Standard Error: 665 + .saturating_add(Weight::from_parts(5_554_066, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) - .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 37819).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 2540).saturating_mul(b.into())) } /// Storage: Refungible TokensMinted (r:1 w:1) /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:200 w:200) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:1 w:1) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:200) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:1) @@ -161,15 +144,15 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `60931 + b * (2540 ±0)` - // Minimum execution time: 13_150_000 picoseconds. - Weight::from_parts(15_655_930, 60931) - // Standard Error: 4_170 - .saturating_add(Weight::from_parts(5_673_702, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) + // Measured: `4` + // Estimated: `3481 + b * (2540 ±0)` + // Minimum execution time: 3_697_000 picoseconds. + Weight::from_parts(2_136_481, 3481) + // Standard Error: 567 + .saturating_add(Weight::from_parts(4_390_621, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(b.into()))) .saturating_add(Weight::from_parts(0, 2540).saturating_mul(b.into())) } @@ -183,10 +166,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn burn_item_partial() -> Weight { // Proof Size summary in bytes: - // Measured: `490` - // Estimated: `15717` - // Minimum execution time: 28_992_000 picoseconds. - Weight::from_parts(29_325_000, 15717) + // Measured: `456` + // Estimated: `8682` + // Minimum execution time: 22_859_000 picoseconds. + Weight::from_parts(23_295_000, 8682) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -204,10 +187,10 @@ /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn burn_item_fully() -> Weight { // Proof Size summary in bytes: - // Measured: `375` - // Estimated: `14070` - // Minimum execution time: 27_980_000 picoseconds. - Weight::from_parts(28_582_000, 14070) + // Measured: `341` + // Estimated: `3554` + // Minimum execution time: 21_477_000 picoseconds. + Weight::from_parts(22_037_000, 3554) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -217,10 +200,10 @@ /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) fn transfer_normal() -> Weight { // Proof Size summary in bytes: - // Measured: `398` - // Estimated: `9623` - // Minimum execution time: 18_746_000 picoseconds. - Weight::from_parts(19_096_000, 9623) + // Measured: `365` + // Estimated: `6118` + // Minimum execution time: 13_714_000 picoseconds. + Weight::from_parts(14_050_000, 6118) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -234,10 +217,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `375` - // Estimated: `13153` - // Minimum execution time: 21_719_000 picoseconds. - Weight::from_parts(22_219_000, 13153) + // Measured: `341` + // Estimated: `6118` + // Minimum execution time: 15_879_000 picoseconds. + Weight::from_parts(16_266_000, 6118) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -251,10 +234,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `490` - // Estimated: `13153` - // Minimum execution time: 24_784_000 picoseconds. - Weight::from_parts(25_231_000, 13153) + // Measured: `456` + // Estimated: `6118` + // Minimum execution time: 18_186_000 picoseconds. + Weight::from_parts(18_682_000, 6118) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -268,10 +251,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_creating_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `375` - // Estimated: `15693` - // Minimum execution time: 24_865_000 picoseconds. - Weight::from_parts(25_253_000, 15693) + // Measured: `341` + // Estimated: `6118` + // Minimum execution time: 17_943_000 picoseconds. + Weight::from_parts(18_333_000, 6118) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -281,10 +264,10 @@ /// Proof: Refungible Allowance (max_values: None, max_size: Some(105), added: 2580, mode: MaxEncodedLen) fn approve() -> Weight { // Proof Size summary in bytes: - // Measured: `256` + // Measured: `223` // Estimated: `3554` - // Minimum execution time: 12_318_000 picoseconds. - Weight::from_parts(12_597_000, 3554) + // Minimum execution time: 8_391_000 picoseconds. + Weight::from_parts(8_637_000, 3554) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -294,10 +277,10 @@ /// Proof: Refungible Allowance (max_values: None, max_size: Some(105), added: 2580, mode: MaxEncodedLen) fn approve_from() -> Weight { // Proof Size summary in bytes: - // Measured: `244` + // Measured: `211` // Estimated: `3554` - // Minimum execution time: 12_276_000 picoseconds. - Weight::from_parts(12_557_000, 3554) + // Minimum execution time: 8_519_000 picoseconds. + Weight::from_parts(8_760_000, 3554) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -309,10 +292,10 @@ /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) fn transfer_from_normal() -> Weight { // Proof Size summary in bytes: - // Measured: `528` - // Estimated: `13193` - // Minimum execution time: 26_852_000 picoseconds. - Weight::from_parts(27_427_000, 13193) + // Measured: `495` + // Estimated: `6118` + // Minimum execution time: 19_554_000 picoseconds. + Weight::from_parts(20_031_000, 6118) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -328,10 +311,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_from_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `16723` - // Minimum execution time: 29_893_000 picoseconds. - Weight::from_parts(30_345_000, 16723) + // Measured: `471` + // Estimated: `6118` + // Minimum execution time: 21_338_000 picoseconds. + Weight::from_parts(21_803_000, 6118) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -347,10 +330,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_from_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `620` - // Estimated: `16723` - // Minimum execution time: 32_784_000 picoseconds. - Weight::from_parts(33_322_000, 16723) + // Measured: `586` + // Estimated: `6118` + // Minimum execution time: 24_179_000 picoseconds. + Weight::from_parts(24_647_000, 6118) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -366,10 +349,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_from_creating_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `19263` - // Minimum execution time: 32_987_000 picoseconds. - Weight::from_parts(33_428_000, 19263) + // Measured: `471` + // Estimated: `6118` + // Minimum execution time: 24_008_000 picoseconds. + Weight::from_parts(24_545_000, 6118) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -389,10 +372,10 @@ /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn burn_from() -> Weight { // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `17640` - // Minimum execution time: 38_277_000 picoseconds. - Weight::from_parts(38_983_000, 17640) + // Measured: `471` + // Estimated: `3570` + // Minimum execution time: 27_907_000 picoseconds. + Weight::from_parts(28_489_000, 3570) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -401,45 +384,62 @@ /// The range of component `b` is `[0, 64]`. fn set_token_property_permissions(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `281` + // Measured: `314` // Estimated: `20191` - // Minimum execution time: 2_254_000 picoseconds. - Weight::from_parts(2_335_000, 20191) - // Standard Error: 44_906 - .saturating_add(Weight::from_parts(12_118_499, 0).saturating_mul(b.into())) + // Minimum execution time: 1_460_000 picoseconds. + Weight::from_parts(1_564_000, 20191) + // Standard Error: 14_117 + .saturating_add(Weight::from_parts(8_196_214, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: Common CollectionPropertyPermissions (r:1 w:0) + /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible TokenProperties (r:1 w:1) /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Refungible TotalSupply (r:1 w:0) + /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn set_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `458 + b * (261 ±0)` - // Estimated: `56460` - // Minimum execution time: 11_249_000 picoseconds. - Weight::from_parts(11_420_000, 56460) - // Standard Error: 72_033 - .saturating_add(Weight::from_parts(7_008_012, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `502 + b * (261 ±0)` + // Estimated: `36269` + // Minimum execution time: 1_012_000 picoseconds. + Weight::from_parts(1_081_000, 36269) + // Standard Error: 6_838 + .saturating_add(Weight::from_parts(5_801_181, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Refungible TokenProperties (r:1 w:1) + /// Storage: Refungible TokenProperties (r:0 w:1) /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) + /// The range of component `b` is `[0, 64]`. + fn init_token_properties(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 229_000 picoseconds. + Weight::from_parts(253_000, 0) + // Standard Error: 100_218 + .saturating_add(Weight::from_parts(12_632_221, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: Common CollectionPropertyPermissions (r:1 w:0) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Refungible TotalSupply (r:1 w:0) + /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: Refungible TokenProperties (r:1 w:1) + /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn delete_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `463 + b * (33291 ±0)` - // Estimated: `56460` - // Minimum execution time: 11_368_000 picoseconds. - Weight::from_parts(11_546_000, 56460) - // Standard Error: 85_444 - .saturating_add(Weight::from_parts(24_644_980, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `561 + b * (33291 ±0)` + // Estimated: `36269` + // Minimum execution time: 1_014_000 picoseconds. + Weight::from_parts(1_065_000, 36269) + // Standard Error: 39_536 + .saturating_add(Weight::from_parts(24_125_838, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Refungible TotalSupply (r:1 w:1) @@ -448,10 +448,10 @@ /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn repartition_item() -> Weight { // Proof Size summary in bytes: - // Measured: `321` - // Estimated: `7059` - // Minimum execution time: 13_586_000 picoseconds. - Weight::from_parts(14_489_000, 7059) + // Measured: `288` + // Estimated: `3554` + // Minimum execution time: 10_315_000 picoseconds. + Weight::from_parts(10_601_000, 3554) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -459,10 +459,10 @@ /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn token_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `321` + // Measured: `288` // Estimated: `6118` - // Minimum execution time: 7_049_000 picoseconds. - Weight::from_parts(7_320_000, 6118) + // Minimum execution time: 4_898_000 picoseconds. + Weight::from_parts(5_136_000, 6118) .saturating_add(T::DbWeight::get().reads(2_u64)) } /// Storage: Refungible CollectionAllowance (r:0 w:1) @@ -471,8 +471,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_432_000 picoseconds. - Weight::from_parts(6_642_000, 0) + // Minimum execution time: 4_146_000 picoseconds. + Weight::from_parts(4_337_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Refungible CollectionAllowance (r:1 w:0) @@ -481,18 +481,18 @@ // Proof Size summary in bytes: // Measured: `4` // Estimated: `3576` - // Minimum execution time: 3_030_000 picoseconds. - Weight::from_parts(3_206_000, 3576) + // Minimum execution time: 2_170_000 picoseconds. + Weight::from_parts(2_301_000, 3576) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: Refungible TokenProperties (r:1 w:1) /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn repair_item() -> Weight { // Proof Size summary in bytes: - // Measured: `174` + // Measured: `120` // Estimated: `36269` - // Minimum execution time: 4_371_000 picoseconds. - Weight::from_parts(4_555_000, 36269) + // Minimum execution time: 2_098_000 picoseconds. + Weight::from_parts(2_251_000, 36269) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -504,10 +504,6 @@ /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:1 w:1) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:1 w:1) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:1) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:1) @@ -516,21 +512,17 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn create_item() -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `63471` - // Minimum execution time: 30_759_000 picoseconds. - Weight::from_parts(31_321_000, 63471) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + // Measured: `4` + // Estimated: `3530` + // Minimum execution time: 11_341_000 picoseconds. + Weight::from_parts(11_741_000, 3530) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: Refungible TokensMinted (r:1 w:1) /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:1 w:1) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:200 w:200) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:200) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:200) @@ -540,26 +532,20 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `28192 + b * (35279 ±0)` - // Minimum execution time: 4_024_000 picoseconds. - Weight::from_parts(4_145_000, 28192) - // Standard Error: 3_332 - .saturating_add(Weight::from_parts(8_967_757, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b.into()))) + // Measured: `4` + // Estimated: `3530` + // Minimum execution time: 2_665_000 picoseconds. + Weight::from_parts(2_791_000, 3530) + // Standard Error: 996 + .saturating_add(Weight::from_parts(4_343_736, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) - .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 35279).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(b.into()))) } /// Storage: Refungible TokensMinted (r:1 w:1) /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:200 w:200) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:200 w:200) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:200) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:200) @@ -569,26 +555,22 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `25652 + b * (37819 ±0)` - // Minimum execution time: 3_715_000 picoseconds. - Weight::from_parts(3_881_000, 25652) - // Standard Error: 3_275 - .saturating_add(Weight::from_parts(10_525_271, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(b.into()))) + // Measured: `4` + // Estimated: `3481 + b * (2540 ±0)` + // Minimum execution time: 2_616_000 picoseconds. + Weight::from_parts(2_726_000, 3481) + // Standard Error: 665 + .saturating_add(Weight::from_parts(5_554_066, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) - .saturating_add(RocksDbWeight::get().writes((5_u64).saturating_mul(b.into()))) - .saturating_add(Weight::from_parts(0, 37819).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 2540).saturating_mul(b.into())) } /// Storage: Refungible TokensMinted (r:1 w:1) /// Proof: Refungible TokensMinted (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) /// Storage: Refungible AccountBalance (r:200 w:200) /// Proof: Refungible AccountBalance (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Refungible TokenProperties (r:1 w:1) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) - /// Storage: Common CollectionPropertyPermissions (r:1 w:0) - /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Refungible Balance (r:0 w:200) /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) /// Storage: Refungible TotalSupply (r:0 w:1) @@ -598,15 +580,15 @@ /// The range of component `b` is `[0, 200]`. fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `60931 + b * (2540 ±0)` - // Minimum execution time: 13_150_000 picoseconds. - Weight::from_parts(15_655_930, 60931) - // Standard Error: 4_170 - .saturating_add(Weight::from_parts(5_673_702, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + // Measured: `4` + // Estimated: `3481 + b * (2540 ±0)` + // Minimum execution time: 3_697_000 picoseconds. + Weight::from_parts(2_136_481, 3481) + // Standard Error: 567 + .saturating_add(Weight::from_parts(4_390_621, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(b.into()))) .saturating_add(Weight::from_parts(0, 2540).saturating_mul(b.into())) } @@ -620,10 +602,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn burn_item_partial() -> Weight { // Proof Size summary in bytes: - // Measured: `490` - // Estimated: `15717` - // Minimum execution time: 28_992_000 picoseconds. - Weight::from_parts(29_325_000, 15717) + // Measured: `456` + // Estimated: `8682` + // Minimum execution time: 22_859_000 picoseconds. + Weight::from_parts(23_295_000, 8682) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -641,10 +623,10 @@ /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn burn_item_fully() -> Weight { // Proof Size summary in bytes: - // Measured: `375` - // Estimated: `14070` - // Minimum execution time: 27_980_000 picoseconds. - Weight::from_parts(28_582_000, 14070) + // Measured: `341` + // Estimated: `3554` + // Minimum execution time: 21_477_000 picoseconds. + Weight::from_parts(22_037_000, 3554) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -654,10 +636,10 @@ /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) fn transfer_normal() -> Weight { // Proof Size summary in bytes: - // Measured: `398` - // Estimated: `9623` - // Minimum execution time: 18_746_000 picoseconds. - Weight::from_parts(19_096_000, 9623) + // Measured: `365` + // Estimated: `6118` + // Minimum execution time: 13_714_000 picoseconds. + Weight::from_parts(14_050_000, 6118) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -671,10 +653,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `375` - // Estimated: `13153` - // Minimum execution time: 21_719_000 picoseconds. - Weight::from_parts(22_219_000, 13153) + // Measured: `341` + // Estimated: `6118` + // Minimum execution time: 15_879_000 picoseconds. + Weight::from_parts(16_266_000, 6118) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -688,10 +670,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `490` - // Estimated: `13153` - // Minimum execution time: 24_784_000 picoseconds. - Weight::from_parts(25_231_000, 13153) + // Measured: `456` + // Estimated: `6118` + // Minimum execution time: 18_186_000 picoseconds. + Weight::from_parts(18_682_000, 6118) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -705,10 +687,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_creating_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `375` - // Estimated: `15693` - // Minimum execution time: 24_865_000 picoseconds. - Weight::from_parts(25_253_000, 15693) + // Measured: `341` + // Estimated: `6118` + // Minimum execution time: 17_943_000 picoseconds. + Weight::from_parts(18_333_000, 6118) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -718,10 +700,10 @@ /// Proof: Refungible Allowance (max_values: None, max_size: Some(105), added: 2580, mode: MaxEncodedLen) fn approve() -> Weight { // Proof Size summary in bytes: - // Measured: `256` + // Measured: `223` // Estimated: `3554` - // Minimum execution time: 12_318_000 picoseconds. - Weight::from_parts(12_597_000, 3554) + // Minimum execution time: 8_391_000 picoseconds. + Weight::from_parts(8_637_000, 3554) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -731,10 +713,10 @@ /// Proof: Refungible Allowance (max_values: None, max_size: Some(105), added: 2580, mode: MaxEncodedLen) fn approve_from() -> Weight { // Proof Size summary in bytes: - // Measured: `244` + // Measured: `211` // Estimated: `3554` - // Minimum execution time: 12_276_000 picoseconds. - Weight::from_parts(12_557_000, 3554) + // Minimum execution time: 8_519_000 picoseconds. + Weight::from_parts(8_760_000, 3554) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -746,10 +728,10 @@ /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) fn transfer_from_normal() -> Weight { // Proof Size summary in bytes: - // Measured: `528` - // Estimated: `13193` - // Minimum execution time: 26_852_000 picoseconds. - Weight::from_parts(27_427_000, 13193) + // Measured: `495` + // Estimated: `6118` + // Minimum execution time: 19_554_000 picoseconds. + Weight::from_parts(20_031_000, 6118) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -765,10 +747,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_from_creating() -> Weight { // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `16723` - // Minimum execution time: 29_893_000 picoseconds. - Weight::from_parts(30_345_000, 16723) + // Measured: `471` + // Estimated: `6118` + // Minimum execution time: 21_338_000 picoseconds. + Weight::from_parts(21_803_000, 6118) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -784,10 +766,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_from_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `620` - // Estimated: `16723` - // Minimum execution time: 32_784_000 picoseconds. - Weight::from_parts(33_322_000, 16723) + // Measured: `586` + // Estimated: `6118` + // Minimum execution time: 24_179_000 picoseconds. + Weight::from_parts(24_647_000, 6118) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -803,10 +785,10 @@ /// Proof: Refungible Owned (max_values: None, max_size: Some(74), added: 2549, mode: MaxEncodedLen) fn transfer_from_creating_removing() -> Weight { // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `19263` - // Minimum execution time: 32_987_000 picoseconds. - Weight::from_parts(33_428_000, 19263) + // Measured: `471` + // Estimated: `6118` + // Minimum execution time: 24_008_000 picoseconds. + Weight::from_parts(24_545_000, 6118) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -826,10 +808,10 @@ /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn burn_from() -> Weight { // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `17640` - // Minimum execution time: 38_277_000 picoseconds. - Weight::from_parts(38_983_000, 17640) + // Measured: `471` + // Estimated: `3570` + // Minimum execution time: 27_907_000 picoseconds. + Weight::from_parts(28_489_000, 3570) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -838,45 +820,62 @@ /// The range of component `b` is `[0, 64]`. fn set_token_property_permissions(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `281` + // Measured: `314` // Estimated: `20191` - // Minimum execution time: 2_254_000 picoseconds. - Weight::from_parts(2_335_000, 20191) - // Standard Error: 44_906 - .saturating_add(Weight::from_parts(12_118_499, 0).saturating_mul(b.into())) + // Minimum execution time: 1_460_000 picoseconds. + Weight::from_parts(1_564_000, 20191) + // Standard Error: 14_117 + .saturating_add(Weight::from_parts(8_196_214, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Refungible TokenProperties (r:1 w:1) - /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) /// Storage: Common CollectionPropertyPermissions (r:1 w:0) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Refungible TokenProperties (r:1 w:1) + /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) + /// Storage: Refungible TotalSupply (r:1 w:0) + /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn set_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `458 + b * (261 ±0)` - // Estimated: `56460` - // Minimum execution time: 11_249_000 picoseconds. - Weight::from_parts(11_420_000, 56460) - // Standard Error: 72_033 - .saturating_add(Weight::from_parts(7_008_012, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `502 + b * (261 ±0)` + // Estimated: `36269` + // Minimum execution time: 1_012_000 picoseconds. + Weight::from_parts(1_081_000, 36269) + // Standard Error: 6_838 + .saturating_add(Weight::from_parts(5_801_181, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Refungible TokenProperties (r:1 w:1) + /// Storage: Refungible TokenProperties (r:0 w:1) /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) + /// The range of component `b` is `[0, 64]`. + fn init_token_properties(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 229_000 picoseconds. + Weight::from_parts(253_000, 0) + // Standard Error: 100_218 + .saturating_add(Weight::from_parts(12_632_221, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } /// Storage: Common CollectionPropertyPermissions (r:1 w:0) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) + /// Storage: Refungible TotalSupply (r:1 w:0) + /// Proof: Refungible TotalSupply (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: Refungible TokenProperties (r:1 w:1) + /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) /// The range of component `b` is `[0, 64]`. fn delete_token_properties(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `463 + b * (33291 ±0)` - // Estimated: `56460` - // Minimum execution time: 11_368_000 picoseconds. - Weight::from_parts(11_546_000, 56460) - // Standard Error: 85_444 - .saturating_add(Weight::from_parts(24_644_980, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `561 + b * (33291 ±0)` + // Estimated: `36269` + // Minimum execution time: 1_014_000 picoseconds. + Weight::from_parts(1_065_000, 36269) + // Standard Error: 39_536 + .saturating_add(Weight::from_parts(24_125_838, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Refungible TotalSupply (r:1 w:1) @@ -885,10 +884,10 @@ /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn repartition_item() -> Weight { // Proof Size summary in bytes: - // Measured: `321` - // Estimated: `7059` - // Minimum execution time: 13_586_000 picoseconds. - Weight::from_parts(14_489_000, 7059) + // Measured: `288` + // Estimated: `3554` + // Minimum execution time: 10_315_000 picoseconds. + Weight::from_parts(10_601_000, 3554) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -896,10 +895,10 @@ /// Proof: Refungible Balance (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) fn token_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `321` + // Measured: `288` // Estimated: `6118` - // Minimum execution time: 7_049_000 picoseconds. - Weight::from_parts(7_320_000, 6118) + // Minimum execution time: 4_898_000 picoseconds. + Weight::from_parts(5_136_000, 6118) .saturating_add(RocksDbWeight::get().reads(2_u64)) } /// Storage: Refungible CollectionAllowance (r:0 w:1) @@ -908,8 +907,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_432_000 picoseconds. - Weight::from_parts(6_642_000, 0) + // Minimum execution time: 4_146_000 picoseconds. + Weight::from_parts(4_337_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Refungible CollectionAllowance (r:1 w:0) @@ -918,18 +917,18 @@ // Proof Size summary in bytes: // Measured: `4` // Estimated: `3576` - // Minimum execution time: 3_030_000 picoseconds. - Weight::from_parts(3_206_000, 3576) + // Minimum execution time: 2_170_000 picoseconds. + Weight::from_parts(2_301_000, 3576) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: Refungible TokenProperties (r:1 w:1) /// Proof: Refungible TokenProperties (max_values: None, max_size: Some(32804), added: 35279, mode: MaxEncodedLen) fn repair_item() -> Weight { // Proof Size summary in bytes: - // Measured: `174` + // Measured: `120` // Estimated: `36269` - // Minimum execution time: 4_371_000 picoseconds. - Weight::from_parts(4_555_000, 36269) + // Minimum execution time: 2_098_000 picoseconds. + Weight::from_parts(2_251_000, 36269) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } --- a/pallets/structure/src/weights.rs +++ b/pallets/structure/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_structure //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/structure/src/weights.rs @@ -45,10 +45,10 @@ /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) fn find_parent() -> Weight { // Proof Size summary in bytes: - // Measured: `634` - // Estimated: `7847` - // Minimum execution time: 10_781_000 picoseconds. - Weight::from_parts(11_675_000, 7847) + // Measured: `667` + // Estimated: `4325` + // Minimum execution time: 7_344_000 picoseconds. + Weight::from_parts(7_578_000, 4325) .saturating_add(T::DbWeight::get().reads(2_u64)) } } @@ -61,10 +61,10 @@ /// Proof: Nonfungible TokenData (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) fn find_parent() -> Weight { // Proof Size summary in bytes: - // Measured: `634` - // Estimated: `7847` - // Minimum execution time: 10_781_000 picoseconds. - Weight::from_parts(11_675_000, 7847) + // Measured: `667` + // Estimated: `4325` + // Minimum execution time: 7_344_000 picoseconds. + Weight::from_parts(7_578_000, 4325) .saturating_add(RocksDbWeight::get().reads(2_u64)) } } --- a/pallets/unique/src/weights.rs +++ b/pallets/unique/src/weights.rs @@ -3,13 +3,13 @@ //! Autogenerated weights for pallet_unique //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: `80`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: `400`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `bench-host`, CPU: `Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -20,7 +20,7 @@ // * // --template=.maintain/frame-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./pallets/unique/src/weights.rs @@ -57,6 +57,8 @@ /// Proof: Common DestroyedCollectionCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Common AdminAmount (r:0 w:1) + /// Proof: Common AdminAmount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) /// Storage: Common CollectionPropertyPermissions (r:0 w:1) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Common CollectionProperties (r:0 w:1) @@ -66,11 +68,11 @@ fn create_collection() -> Weight { // Proof Size summary in bytes: // Measured: `245` - // Estimated: `9174` - // Minimum execution time: 31_198_000 picoseconds. - Weight::from_parts(32_046_000, 9174) + // Estimated: `6196` + // Minimum execution time: 26_618_000 picoseconds. + Weight::from_parts(27_287_000, 6196) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(6_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) } /// Storage: Common CollectionById (r:1 w:1) /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) @@ -88,10 +90,10 @@ /// Proof: Common CollectionProperties (max_values: None, max_size: Some(40992), added: 43467, mode: MaxEncodedLen) fn destroy_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `1086` - // Estimated: `9336` - // Minimum execution time: 48_208_000 picoseconds. - Weight::from_parts(49_031_000, 9336) + // Measured: `1200` + // Estimated: `4325` + // Minimum execution time: 37_428_000 picoseconds. + Weight::from_parts(38_258_000, 4325) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -101,10 +103,10 @@ /// Proof: Common Allowlist (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) fn add_to_allow_list() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 14_852_000 picoseconds. - Weight::from_parts(15_268_000, 4325) + // Minimum execution time: 9_968_000 picoseconds. + Weight::from_parts(10_388_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -114,10 +116,10 @@ /// Proof: Common Allowlist (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) fn remove_from_allow_list() -> Weight { // Proof Size summary in bytes: - // Measured: `1000` + // Measured: `1033` // Estimated: `4325` - // Minimum execution time: 14_595_000 picoseconds. - Weight::from_parts(14_933_000, 4325) + // Minimum execution time: 9_600_000 picoseconds. + Weight::from_parts(9_974_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -125,10 +127,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn change_collection_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 14_132_000 picoseconds. - Weight::from_parts(14_501_000, 4325) + // Minimum execution time: 9_185_000 picoseconds. + Weight::from_parts(9_525_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -140,10 +142,10 @@ /// Proof: Common AdminAmount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) fn add_collection_admin() -> Weight { // Proof Size summary in bytes: - // Measured: `967` - // Estimated: `11349` - // Minimum execution time: 17_229_000 picoseconds. - Weight::from_parts(17_657_000, 11349) + // Measured: `1012` + // Estimated: `4325` + // Minimum execution time: 12_704_000 picoseconds. + Weight::from_parts(13_115_000, 4325) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -156,9 +158,9 @@ fn remove_collection_admin() -> Weight { // Proof Size summary in bytes: // Measured: `1107` - // Estimated: `11349` - // Minimum execution time: 19_827_000 picoseconds. - Weight::from_parts(20_479_000, 11349) + // Estimated: `4325` + // Minimum execution time: 14_185_000 picoseconds. + Weight::from_parts(14_492_000, 4325) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -166,10 +168,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn set_collection_sponsor() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 14_049_000 picoseconds. - Weight::from_parts(14_420_000, 4325) + // Minimum execution time: 9_217_000 picoseconds. + Weight::from_parts(9_499_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -177,10 +179,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn confirm_sponsorship() -> Weight { // Proof Size summary in bytes: - // Measured: `999` + // Measured: `1032` // Estimated: `4325` - // Minimum execution time: 13_689_000 picoseconds. - Weight::from_parts(14_044_000, 4325) + // Minimum execution time: 8_993_000 picoseconds. + Weight::from_parts(9_264_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -188,10 +190,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn remove_collection_sponsor() -> Weight { // Proof Size summary in bytes: - // Measured: `999` + // Measured: `1032` // Estimated: `4325` - // Minimum execution time: 13_275_000 picoseconds. - Weight::from_parts(13_598_000, 4325) + // Minimum execution time: 8_804_000 picoseconds. + Weight::from_parts(9_302_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -199,10 +201,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn set_transfers_enabled_flag() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 9_411_000 picoseconds. - Weight::from_parts(9_706_000, 4325) + // Minimum execution time: 5_985_000 picoseconds. + Weight::from_parts(6_155_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -210,10 +212,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn set_collection_limits() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 13_864_000 picoseconds. - Weight::from_parts(14_368_000, 4325) + // Minimum execution time: 9_288_000 picoseconds. + Weight::from_parts(9_608_000, 4325) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -221,10 +223,10 @@ /// Proof: Common CollectionProperties (max_values: None, max_size: Some(40992), added: 43467, mode: MaxEncodedLen) fn force_repair_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `265` + // Measured: `298` // Estimated: `44457` - // Minimum execution time: 7_104_000 picoseconds. - Weight::from_parts(7_293_000, 44457) + // Minimum execution time: 4_904_000 picoseconds. + Weight::from_parts(5_142_000, 44457) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -238,6 +240,8 @@ /// Proof: Common DestroyedCollectionCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: System Account (r:2 w:2) /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Common AdminAmount (r:0 w:1) + /// Proof: Common AdminAmount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) /// Storage: Common CollectionPropertyPermissions (r:0 w:1) /// Proof: Common CollectionPropertyPermissions (max_values: None, max_size: Some(16726), added: 19201, mode: MaxEncodedLen) /// Storage: Common CollectionProperties (r:0 w:1) @@ -247,11 +251,11 @@ fn create_collection() -> Weight { // Proof Size summary in bytes: // Measured: `245` - // Estimated: `9174` - // Minimum execution time: 31_198_000 picoseconds. - Weight::from_parts(32_046_000, 9174) + // Estimated: `6196` + // Minimum execution time: 26_618_000 picoseconds. + Weight::from_parts(27_287_000, 6196) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } /// Storage: Common CollectionById (r:1 w:1) /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) @@ -269,10 +273,10 @@ /// Proof: Common CollectionProperties (max_values: None, max_size: Some(40992), added: 43467, mode: MaxEncodedLen) fn destroy_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `1086` - // Estimated: `9336` - // Minimum execution time: 48_208_000 picoseconds. - Weight::from_parts(49_031_000, 9336) + // Measured: `1200` + // Estimated: `4325` + // Minimum execution time: 37_428_000 picoseconds. + Weight::from_parts(38_258_000, 4325) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -282,10 +286,10 @@ /// Proof: Common Allowlist (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) fn add_to_allow_list() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 14_852_000 picoseconds. - Weight::from_parts(15_268_000, 4325) + // Minimum execution time: 9_968_000 picoseconds. + Weight::from_parts(10_388_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -295,10 +299,10 @@ /// Proof: Common Allowlist (max_values: None, max_size: Some(70), added: 2545, mode: MaxEncodedLen) fn remove_from_allow_list() -> Weight { // Proof Size summary in bytes: - // Measured: `1000` + // Measured: `1033` // Estimated: `4325` - // Minimum execution time: 14_595_000 picoseconds. - Weight::from_parts(14_933_000, 4325) + // Minimum execution time: 9_600_000 picoseconds. + Weight::from_parts(9_974_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -306,10 +310,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn change_collection_owner() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 14_132_000 picoseconds. - Weight::from_parts(14_501_000, 4325) + // Minimum execution time: 9_185_000 picoseconds. + Weight::from_parts(9_525_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -321,10 +325,10 @@ /// Proof: Common AdminAmount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) fn add_collection_admin() -> Weight { // Proof Size summary in bytes: - // Measured: `967` - // Estimated: `11349` - // Minimum execution time: 17_229_000 picoseconds. - Weight::from_parts(17_657_000, 11349) + // Measured: `1012` + // Estimated: `4325` + // Minimum execution time: 12_704_000 picoseconds. + Weight::from_parts(13_115_000, 4325) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -337,9 +341,9 @@ fn remove_collection_admin() -> Weight { // Proof Size summary in bytes: // Measured: `1107` - // Estimated: `11349` - // Minimum execution time: 19_827_000 picoseconds. - Weight::from_parts(20_479_000, 11349) + // Estimated: `4325` + // Minimum execution time: 14_185_000 picoseconds. + Weight::from_parts(14_492_000, 4325) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -347,10 +351,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn set_collection_sponsor() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 14_049_000 picoseconds. - Weight::from_parts(14_420_000, 4325) + // Minimum execution time: 9_217_000 picoseconds. + Weight::from_parts(9_499_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -358,10 +362,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn confirm_sponsorship() -> Weight { // Proof Size summary in bytes: - // Measured: `999` + // Measured: `1032` // Estimated: `4325` - // Minimum execution time: 13_689_000 picoseconds. - Weight::from_parts(14_044_000, 4325) + // Minimum execution time: 8_993_000 picoseconds. + Weight::from_parts(9_264_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -369,10 +373,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn remove_collection_sponsor() -> Weight { // Proof Size summary in bytes: - // Measured: `999` + // Measured: `1032` // Estimated: `4325` - // Minimum execution time: 13_275_000 picoseconds. - Weight::from_parts(13_598_000, 4325) + // Minimum execution time: 8_804_000 picoseconds. + Weight::from_parts(9_302_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -380,10 +384,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn set_transfers_enabled_flag() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 9_411_000 picoseconds. - Weight::from_parts(9_706_000, 4325) + // Minimum execution time: 5_985_000 picoseconds. + Weight::from_parts(6_155_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -391,10 +395,10 @@ /// Proof: Common CollectionById (max_values: None, max_size: Some(860), added: 3335, mode: MaxEncodedLen) fn set_collection_limits() -> Weight { // Proof Size summary in bytes: - // Measured: `967` + // Measured: `1000` // Estimated: `4325` - // Minimum execution time: 13_864_000 picoseconds. - Weight::from_parts(14_368_000, 4325) + // Minimum execution time: 9_288_000 picoseconds. + Weight::from_parts(9_608_000, 4325) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -402,10 +406,10 @@ /// Proof: Common CollectionProperties (max_values: None, max_size: Some(40992), added: 43467, mode: MaxEncodedLen) fn force_repair_collection() -> Weight { // Proof Size summary in bytes: - // Measured: `265` + // Measured: `298` // Estimated: `44457` - // Minimum execution time: 7_104_000 picoseconds. - Weight::from_parts(7_293_000, 44457) + // Minimum execution time: 4_904_000 picoseconds. + Weight::from_parts(5_142_000, 44457) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } --- a/primitives/common/src/constants.rs +++ b/primitives/common/src/constants.rs @@ -52,10 +52,10 @@ pub const SESSION_LENGTH: BlockNumber = HOURS; // Targeting 0.1 UNQ per transfer -pub const WEIGHT_TO_FEE_COEFF: u64 = /**/76_840_511_488_584_762/**/; +pub const WEIGHT_TO_FEE_COEFF: u64 = /**/77_334_604_063_436_322/**/; // Targeting 0.15 UNQ per transfer via ETH -pub const MIN_GAS_PRICE: u64 = /**/1_906_626_161_453/**/; +pub const MIN_GAS_PRICE: u64 = /**/1_920_639_188_722/**/; /// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. /// This is used to limit the maximal weight of a single extrinsic. --- a/runtime/common/runtime_apis.rs +++ b/runtime/common/runtime_apis.rs @@ -692,7 +692,7 @@ { use codec::Decode; - let uxt_decode = <::Extrinsic as Decode>::decode(&mut &uxt) + let uxt_decode = <::Extrinsic as Decode>::decode(&mut &*uxt) .map_err(|_| DispatchError::Other("failed to decode the extrinsic")); let uxt = match uxt_decode { --- a/runtime/common/weights/xcm.rs +++ b/runtime/common/weights/xcm.rs @@ -3,12 +3,12 @@ //! Autogenerated weights for pallet_xcm //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-09-26, STEPS: `50`, REPEAT: 400, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// target/release/unique-collator +// target/production/unique-collator // benchmark // pallet // --pallet @@ -19,7 +19,7 @@ // * // --template=.maintain/external-weight-template.hbs // --steps=50 -// --repeat=80 +// --repeat=400 // --heap-pages=4096 // --output=./runtime/common/weights/xcm.rs @@ -47,10 +47,10 @@ /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `211` - // Estimated: `10460` - // Minimum execution time: 17_089_000 picoseconds. - Weight::from_parts(17_615_000, 10460) + // Measured: `278` + // Estimated: `3743` + // Minimum execution time: 12_999_000 picoseconds. + Weight::from_parts(13_426_000, 3743) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -58,28 +58,28 @@ /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn teleport_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `136` + // Measured: `169` // Estimated: `1489` - // Minimum execution time: 14_443_000 picoseconds. - Weight::from_parts(14_895_000, 1489) + // Minimum execution time: 10_299_000 picoseconds. + Weight::from_parts(10_647_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `136` + // Measured: `169` // Estimated: `1489` - // Minimum execution time: 14_340_000 picoseconds. - Weight::from_parts(14_748_000, 1489) + // Minimum execution time: 10_094_000 picoseconds. + Weight::from_parts(10_464_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) } fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_266_000 picoseconds. - Weight::from_parts(5_430_000, 0) + // Minimum execution time: 3_485_000 picoseconds. + Weight::from_parts(3_664_000, 0) } /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) @@ -87,8 +87,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_621_000 picoseconds. - Weight::from_parts(5_888_000, 0) + // Minimum execution time: 3_717_000 picoseconds. + Weight::from_parts(3_866_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) @@ -97,8 +97,8 @@ // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_087_000 picoseconds. - Weight::from_parts(2_218_000, 0) + // Minimum execution time: 1_328_000 picoseconds. + Weight::from_parts(1_400_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) @@ -119,10 +119,10 @@ /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `211` - // Estimated: `16043` - // Minimum execution time: 21_067_000 picoseconds. - Weight::from_parts(21_466_000, 16043) + // Measured: `278` + // Estimated: `3743` + // Minimum execution time: 16_057_000 picoseconds. + Weight::from_parts(16_483_000, 3743) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -142,21 +142,31 @@ /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `394` - // Estimated: `15628` - // Minimum execution time: 23_986_000 picoseconds. - Weight::from_parts(25_328_000, 15628) + // Measured: `461` + // Estimated: `3926` + // Minimum execution time: 18_009_000 picoseconds. + Weight::from_parts(18_565_000, 3926) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_378_000 picoseconds. + Weight::from_parts(1_447_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `131` - // Estimated: `11021` - // Minimum execution time: 15_073_000 picoseconds. - Weight::from_parts(15_451_000, 11021) + // Measured: `196` + // Estimated: `11086` + // Minimum execution time: 10_770_000 picoseconds. + Weight::from_parts(11_090_000, 11086) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -164,10 +174,10 @@ /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `135` - // Estimated: `11025` - // Minimum execution time: 14_840_000 picoseconds. - Weight::from_parts(15_347_000, 11025) + // Measured: `200` + // Estimated: `11090` + // Minimum execution time: 10_760_000 picoseconds. + Weight::from_parts(11_091_000, 11090) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -175,10 +185,10 @@ /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn already_notified_target() -> Weight { // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `13507` - // Minimum execution time: 16_215_000 picoseconds. - Weight::from_parts(16_461_000, 13507) + // Measured: `207` + // Estimated: `13572` + // Minimum execution time: 12_026_000 picoseconds. + Weight::from_parts(12_321_000, 13572) .saturating_add(T::DbWeight::get().reads(5_u64)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) @@ -195,10 +205,10 @@ /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `278` - // Estimated: `17013` - // Minimum execution time: 21_705_000 picoseconds. - Weight::from_parts(22_313_000, 17013) + // Measured: `345` + // Estimated: `6285` + // Minimum execution time: 15_508_000 picoseconds. + Weight::from_parts(15_885_000, 6285) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -206,20 +216,20 @@ /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: - // Measured: `172` - // Estimated: `8587` - // Minimum execution time: 7_869_000 picoseconds. - Weight::from_parts(8_052_000, 8587) + // Measured: `239` + // Estimated: `8654` + // Minimum execution time: 5_580_000 picoseconds. + Weight::from_parts(5_753_000, 8654) .saturating_add(T::DbWeight::get().reads(3_u64)) } /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `11032` - // Minimum execution time: 15_340_000 picoseconds. - Weight::from_parts(15_738_000, 11032) + // Measured: `207` + // Estimated: `11097` + // Minimum execution time: 10_951_000 picoseconds. + Weight::from_parts(11_341_000, 11097) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -237,16 +247,12 @@ /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `284` - // Estimated: `21999` - // Minimum execution time: 27_809_000 picoseconds. - Weight::from_parts(28_290_000, 21999) + // Measured: `349` + // Estimated: `11239` + // Minimum execution time: 19_990_000 picoseconds. + Weight::from_parts(20_433_000, 11239) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) - } - - fn force_suspension() -> Weight { - Default::default() } } --- a/runtime/tests/src/tests.rs +++ b/runtime/tests/src/tests.rs @@ -168,6 +168,7 @@ fn get_token_properties(collection_id: CollectionId, token_id: TokenId) -> Vec { >::token_properties((collection_id, token_id)) + .unwrap_or_default() .into_iter() .map(|(key, value)| Property { key, value }) .collect() --- a/tests/package.json +++ b/tests/package.json @@ -48,6 +48,7 @@ "testEthFractionalizer": "yarn _test './**/eth/fractionalizer/**/*.*test.ts'", "testEthMarketplace": "yarn _test './**/eth/marketplace/**/*.*test.ts'", "testEthMarket": "yarn _test './**/eth/marketplace-v2/**/*.*test.ts'", + "testPerformance": "yarn _test ./**/performance.*test.ts", "testSub": "yarn _test './**/sub/**/*.*test.ts'", "testSubNesting": "yarn _test './**/sub/nesting/**/*.*test.ts'", "testEvent": "yarn _test ./src/check-event/*.*test.ts", --- a/tests/src/migrations/942057-appPromotion/lockedToFreeze.ts +++ b/tests/src/migrations/942057-appPromotion/lockedToFreeze.ts @@ -4,9 +4,10 @@ import path, {dirname} from 'path'; import {isInteger, parse} from 'lossless-json'; import {fileURLToPath} from 'url'; +import config from '../../config'; -const WS_ENDPOINT = 'ws://localhost:9944'; +const WS_ENDPOINT = config.substrateUrl; const DONOR_SEED = '//Alice'; const UPDATE_IF_VERSION = 942057; --- a/tests/src/migrations/correctStateAfterMaintenance.ts +++ b/tests/src/migrations/correctStateAfterMaintenance.ts @@ -1,8 +1,9 @@ +import config from '../config'; import {usingPlaygrounds} from '../util'; -const WS_ENDPOINT = 'ws://localhost:9944'; +const WS_ENDPOINT = config.substrateUrl; const DONOR_SEED = '//Alice'; export const main = async(options: { wsEndpoint: string; donorSeed: string } = { @@ -66,4 +67,4 @@ const chunk = (arr: T[], size: number) => Array.from({length: Math.ceil(arr.length / size)}, (_: any, i: number) => - arr.slice(i * size, i * size + size)); \ No newline at end of file + arr.slice(i * size, i * size + size)); --- /dev/null +++ b/tests/src/performance.seq.test.ts @@ -0,0 +1,166 @@ +// Copyright 2019-2023 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network 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. + +// Unique Network 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 Unique Network. If not, see . + +import {ApiPromise} from '@polkadot/api'; +import {IKeyringPair} from '@polkadot/types/types'; +import {expect, itSub, usingPlaygrounds} from './util'; +import {ICrossAccountId, IProperty} from './util/playgrounds/types'; +import {UniqueHelper} from './util/playgrounds/unique'; + +describe('Performace tests', () => { + let alice: IKeyringPair; + const MAX_TOKENS_TO_MINT = 200; + + before(async () => { + await usingPlaygrounds(async (helper, privateKey) => { + const donor = await privateKey({url: import.meta.url}); + [alice] = await helper.arrange.createAccounts([100_000n], donor); + }); + }); + + itSub('NFT tokens minting', async ({helper}) => { + const propertyKey = 'prop-a'; + const collection = await helper.nft.mintCollection(alice, { + name: 'test properties', + description: 'test properties collection', + tokenPrefix: 'TPC', + tokenPropertyPermissions: [ + {key: propertyKey, permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}, + ], + }); + + + const results = []; + const step = 1_000; + const sizeOfKey = sizeOfEncodedStr(propertyKey); + let currentSize = step; + let startCount = 0; + let minterFunc = tryMintUnsafeRPC; + try { + startCount = await tryMintUnsafeRPC(helper, alice, MAX_TOKENS_TO_MINT, collection.collectionId, {Substrate: alice.address}); + } + catch (e) { + startCount = await tryMintExplicit(helper, alice, MAX_TOKENS_TO_MINT, collection.collectionId, {Substrate: alice.address}); + minterFunc = tryMintExplicit; + } + results.push({propertySize: 0, tokens: startCount}); + + while(currentSize <= 32_000) { + const property = {key: propertyKey, value: 'A'.repeat(currentSize - sizeOfKey - sizeOfInt(currentSize))}; + const maxTokens = Math.ceil(results.map(x => x.tokens).reduce((a, b) => a + b) / results.length); + const tokens = await minterFunc(helper, alice, maxTokens, collection.collectionId, {Substrate: alice.address}, property); + results.push({propertySize: sizeOfProperty(property), tokens}); + currentSize += step; + await helper.wait.newBlocks(2); + } + + expect(results).to.be.deep.equal([ + {propertySize: 0, tokens: 200}, + {propertySize: 1000, tokens: 149}, + {propertySize: 2000, tokens: 149}, + {propertySize: 3000, tokens: 149}, + {propertySize: 4000, tokens: 149}, + {propertySize: 5000, tokens: 149}, + {propertySize: 6000, tokens: 149}, + {propertySize: 7000, tokens: 149}, + {propertySize: 8000, tokens: 149}, + {propertySize: 9000, tokens: 149}, + {propertySize: 10000, tokens: 149}, + {propertySize: 11000, tokens: 149}, + {propertySize: 12000, tokens: 149}, + {propertySize: 13000, tokens: 149}, + {propertySize: 14000, tokens: 149}, + {propertySize: 15000, tokens: 149}, + {propertySize: 16000, tokens: 149}, + {propertySize: 17000, tokens: 149}, + {propertySize: 18000, tokens: 149}, + {propertySize: 19000, tokens: 149}, + {propertySize: 20000, tokens: 149}, + {propertySize: 21000, tokens: 149}, + {propertySize: 22000, tokens: 149}, + {propertySize: 23000, tokens: 149}, + {propertySize: 24000, tokens: 149}, + {propertySize: 25000, tokens: 149}, + {propertySize: 26000, tokens: 149}, + {propertySize: 27000, tokens: 145}, + {propertySize: 28000, tokens: 140}, + {propertySize: 29000, tokens: 135}, + {propertySize: 30000, tokens: 130}, + {propertySize: 31000, tokens: 126}, + {propertySize: 32000, tokens: 122}, + ]); + }); +}); + + +const dryRun = async (api: ApiPromise, signer: IKeyringPair, tx: any) => { + const signed = await tx.signAsync(signer); + const dryRun = await api.rpc.system.dryRun(signed.toHex()); + return dryRun.isOk && dryRun.asOk.isOk; +}; + +const getTokens = (tokensCount: number, owner: ICrossAccountId, property?: IProperty) => (new Array(tokensCount)).fill(0).map(() => { + const token = {owner} as {owner: ICrossAccountId, properties?: IProperty[]}; + if(property) token.properties = [property]; + return token; +}); + +const tryMintUnsafeRPC = async (helper: UniqueHelper, signer: IKeyringPair, tokensCount: number, collectionId: number, owner: ICrossAccountId, property?: IProperty): Promise => { + if(tokensCount < 10) console.log('try mint', tokensCount, 'tokens'); + const tokens = getTokens(tokensCount, owner, property); + const tx = helper.constructApiCall('api.tx.unique.createMultipleItemsEx', [collectionId, {NFT: tokens}]); + if(!(await dryRun(helper.getApi(), signer, tx))) { + if(tokensCount < 2) return 0; + return await tryMintUnsafeRPC(helper, signer, tokensCount - 1, collectionId, owner, property); + } + await helper.executeExtrinsic(signer, 'api.tx.unique.createMultipleItemsEx', [collectionId, {NFT: tokens}]); + return tokensCount; +}; + +const tryMintExplicit = async (helper: UniqueHelper, signer: IKeyringPair, tokensCount: number, collectionId: number, owner: ICrossAccountId, property?: IProperty): Promise => { + const tokens = getTokens(tokensCount, owner, property); + try { + await helper.executeExtrinsic(signer, 'api.tx.unique.createMultipleItemsEx', [collectionId, {NFT: tokens}]); + } + catch (e) { + if(tokensCount < 2) return 0; + return await tryMintExplicit(helper, signer, tokensCount - 1, collectionId, owner, property); + } + return tokensCount; +}; + +function sizeOfProperty(prop: IProperty) { + return sizeOfEncodedStr(prop.key) + sizeOfEncodedStr(prop.value!); +} + +function sizeOfInt(i: number) { + if(i < 0 || i > 0xffffffff) throw new Error('out of range'); + if(i < 0b11_1111) { + return 1; + } else if(i < 0b11_1111_1111_1111) { + return 2; + } else if(i < 0b11_1111_1111_1111_1111_1111_1111_1111) { + return 4; + } else { + return 5; + } +} + +const UTF8_ENCODER = new TextEncoder(); +function sizeOfEncodedStr(v: string) { + const encoded = UTF8_ENCODER.encode(v); + return sizeOfInt(encoded.length) + encoded.length; +} -- gitstuff