diff --git a/.github/workflows/check_tests.yml b/.github/workflows/check_tests.yml index 02446a0e9..45af30623 100644 --- a/.github/workflows/check_tests.yml +++ b/.github/workflows/check_tests.yml @@ -9,8 +9,8 @@ concurrency: cancel-in-progress: true env: AWS_REGION: us-east-1 - AWS_INSTANCE_TYPE: c5.4xlarge - AWS_INSTANCE_ROOT_VOLUME_SIZE: 256 + AWS_INSTANCE_TYPE: c5.9xlarge + AWS_INSTANCE_ROOT_VOLUME_SIZE: 1024 AWS_IMAGE_SEARCH_PATTERN: ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-* AWS_IMAGE_SEARCH_OWNERS: '["099720109477"]' jobs: @@ -73,9 +73,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: Run Unit Tests env: @@ -210,9 +209,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: Run live benchmarks test env: diff --git a/.github/workflows/integration_test_calamari.yml b/.github/workflows/integration_test_calamari.yml index f0c57b312..42d20a45d 100644 --- a/.github/workflows/integration_test_calamari.yml +++ b/.github/workflows/integration_test_calamari.yml @@ -81,9 +81,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: build env: diff --git a/.github/workflows/integration_test_manta.yml b/.github/workflows/integration_test_manta.yml index 3697fd8a5..764c7a567 100644 --- a/.github/workflows/integration_test_manta.yml +++ b/.github/workflows/integration_test_manta.yml @@ -81,9 +81,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: build env: diff --git a/.github/workflows/metadata_diff.yml b/.github/workflows/metadata_diff.yml index bcdd6e7a0..db9020ede 100644 --- a/.github/workflows/metadata_diff.yml +++ b/.github/workflows/metadata_diff.yml @@ -77,9 +77,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: Build New Binary env: diff --git a/.github/workflows/run_all_benchmarks.yml b/.github/workflows/run_all_benchmarks.yml index c738aed28..7e4e4f415 100644 --- a/.github/workflows/run_all_benchmarks.yml +++ b/.github/workflows/run_all_benchmarks.yml @@ -64,9 +64,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: build benchmarking binary env: diff --git a/.github/workflows/try-runtime-mainnet.yml b/.github/workflows/try-runtime-mainnet.yml index f10b2fc04..588ecdc42 100644 --- a/.github/workflows/try-runtime-mainnet.yml +++ b/.github/workflows/try-runtime-mainnet.yml @@ -83,9 +83,8 @@ jobs: protoc --version curl -s https://sh.rustup.rs -sSf | sh -s -- -y source ${HOME}/.cargo/env - rustup toolchain install stable - rustup default stable - rustup update + rustup toolchain install nightly-2023-03-03 + rustup default nightly-2023-03-03 rustup target add wasm32-unknown-unknown - name: Build Binary env: diff --git a/Cargo.lock b/Cargo.lock index 80880dbdd..d6c9b9cf1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5552,6 +5552,7 @@ dependencies = [ "pallet-balances", "pallet-collective", "pallet-democracy", + "pallet-manta-pay", "pallet-manta-sbt", "pallet-manta-support", "pallet-membership", diff --git a/node/src/command.rs b/node/src/command.rs index de55b9033..29fe302c9 100644 --- a/node/src/command.rs +++ b/node/src/command.rs @@ -458,6 +458,12 @@ pub fn run_with(cli: Cli) -> Result { rpc::create_calamari_full, ).await .map_err(Into::into); + } else if config.chain_spec.is_manta() { + return crate::service::start_dev_nimbus_node::( + config, + rpc::create_manta_full, + ).await + .map_err(Into::into); } else { return Err("Dev mode not support for current chain".into()); } diff --git a/node/src/rpc/common.rs b/node/src/rpc/common.rs deleted file mode 100644 index b774df001..000000000 --- a/node/src/rpc/common.rs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2020-2023 Manta Network. -// This file is part of Manta. -// -// Manta 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. -// -// Manta 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 Manta. If not, see . - -//! Common RPC Extensions - -use super::*; - -/// Instantiate all RPC extensions for common nodes like calamari/manta. -pub fn create_common_full(deps: FullDeps) -> Result -where - C: ProvideRuntimeApi - + HeaderBackend - + AuxStore - + HeaderMetadata - + Send - + Sync - + 'static, - C::Api: frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, - C::Api: BlockBuilder, - P: TransactionPool + Sync + Send + 'static, -{ - use frame_rpc_system::{System, SystemApiServer}; - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; - - let mut module = RpcExtension::new(()); - let FullDeps { - client, - pool, - deny_unsafe, - } = deps; - - module - .merge(System::new(client.clone(), pool, deny_unsafe).into_rpc()) - .map_err(|e| sc_service::Error::Other(e.to_string()))?; - module - .merge(TransactionPayment::new(client).into_rpc()) - .map_err(|e| sc_service::Error::Other(e.to_string()))?; - - Ok(module) -} diff --git a/node/src/rpc/manta.rs b/node/src/rpc/manta.rs index fe039e7e0..489ce75ce 100644 --- a/node/src/rpc/manta.rs +++ b/node/src/rpc/manta.rs @@ -14,15 +14,19 @@ // You should have received a copy of the GNU General Public License // along with Manta. If not, see . -//! Calamari RPC Extensions +//! Manta RPC Extensions use super::*; +use pallet_manta_pay::{ + rpc::{Pull, PullApiServer}, + runtime::PullLedgerDiffApi, +}; use pallet_manta_sbt::{ rpc::{SBTPull, SBTPullApiServer}, runtime::SBTPullLedgerDiffApi, }; -/// Instantiate all RPC extensions for calamari. +/// Instantiate all RPC extensions for manta. pub fn create_manta_full(deps: FullDeps) -> Result where C: ProvideRuntimeApi @@ -35,6 +39,7 @@ where C::Api: frame_rpc_system::AccountNonceApi, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, C::Api: BlockBuilder, + C::Api: PullLedgerDiffApi, C::Api: SBTPullLedgerDiffApi, P: TransactionPool + Sync + Send + 'static, { @@ -55,6 +60,11 @@ where .merge(TransactionPayment::new(client.clone()).into_rpc()) .map_err(|e| sc_service::Error::Other(e.to_string()))?; + let manta_pay_rpc: jsonrpsee::RpcModule> = Pull::new(client.clone()).into_rpc(); + module + .merge(manta_pay_rpc) + .map_err(|e| sc_service::Error::Other(e.to_string()))?; + let manta_sbt_rpc: jsonrpsee::RpcModule> = SBTPull::new(client).into_rpc(); module .merge(manta_sbt_rpc) diff --git a/node/src/rpc/mod.rs b/node/src/rpc/mod.rs index 61543be48..5095fb24d 100644 --- a/node/src/rpc/mod.rs +++ b/node/src/rpc/mod.rs @@ -26,13 +26,11 @@ use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; use std::sync::Arc; mod calamari; -mod common; mod dolphin; mod manta; pub use self::manta::create_manta_full; pub use calamari::create_calamari_full; -pub use common::create_common_full; pub use dolphin::create_dolphin_full; /// A type representing all RPC extensions. diff --git a/runtime/manta/Cargo.toml b/runtime/manta/Cargo.toml index 5478f7fc1..d3eaa4e36 100644 --- a/runtime/manta/Cargo.toml +++ b/runtime/manta/Cargo.toml @@ -93,6 +93,7 @@ manta-collator-selection = { path = '../../pallets/collator-selection', default- manta-primitives = { path = '../../primitives/manta', default-features = false } manta-support = { package = "pallet-manta-support", path = "../../pallets/manta-support", default-features = false } pallet-asset-manager = { path = '../../pallets/asset-manager', default-features = false } +pallet-manta-pay = { path = '../../pallets/manta-pay', default-features = false, features = ["runtime"] } pallet-manta-sbt = { path = '../../pallets/manta-sbt', default-features = false, features = ["runtime"] } pallet-parachain-staking = { path = '../../pallets/parachain-staking', default-features = false } pallet-tx-pause = { path = '../../pallets/tx-pause', default-features = false } @@ -144,6 +145,7 @@ runtime-benchmarks = [ 'cumulus-pallet-xcmp-queue/runtime-benchmarks', 'orml-xtokens/runtime-benchmarks', 'cumulus-pallet-parachain-system/runtime-benchmarks', + 'pallet-manta-pay/runtime-benchmarks', 'pallet-xcm-benchmarks/runtime-benchmarks', 'pallet-manta-sbt/runtime-benchmarks', ] @@ -182,6 +184,7 @@ try-runtime = [ 'cumulus-pallet-xcmp-queue/try-runtime', 'cumulus-pallet-xcm/try-runtime', 'pallet-asset-manager/try-runtime', + 'pallet-manta-pay/try-runtime', 'orml-xtokens/try-runtime', 'pallet-manta-sbt/try-runtime', ] @@ -249,6 +252,8 @@ std = [ 'pallet-treasury/std', 'pallet-assets/std', 'pallet-asset-manager/std', + 'pallet-manta-pay/std', + 'manta-support/std', 'orml-traits/std', 'orml-xtokens/std', 'pallet-manta-sbt/std', diff --git a/runtime/manta/src/assets_config.rs b/runtime/manta/src/assets_config.rs index 9af9fb094..a64ac32a1 100644 --- a/runtime/manta/src/assets_config.rs +++ b/runtime/manta/src/assets_config.rs @@ -25,7 +25,7 @@ use manta_primitives::{ AssetConfig, AssetIdType, AssetLocation, AssetRegistry, AssetRegistryMetadata, AssetStorageMetadata, BalanceType, LocationType, NativeAndNonNative, }, - constants::{ASSET_MANAGER_PALLET_ID, MANTA_DECIMAL, MANTA_SBT_PALLET_ID}, + constants::{ASSET_MANAGER_PALLET_ID, MANTA_DECIMAL, MANTA_PAY_PALLET_ID, MANTA_SBT_PALLET_ID}, types::{AccountId, Balance, MantaAssetId}, }; @@ -184,9 +184,17 @@ impl pallet_asset_manager::Config for Runtime { } parameter_types! { + pub const MantaPayPalletId: PalletId = MANTA_PAY_PALLET_ID; pub const MantaSbtPalletId: PalletId = MANTA_SBT_PALLET_ID; } +impl pallet_manta_pay::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_manta_pay::SubstrateWeight; + type AssetConfig = MantaAssetConfig; + type PalletId = MantaPayPalletId; +} + impl pallet_manta_sbt::Config for Runtime { type RuntimeEvent = RuntimeEvent; type PalletId = MantaSbtPalletId; diff --git a/runtime/manta/src/lib.rs b/runtime/manta/src/lib.rs index bb9329957..52aae9eaf 100644 --- a/runtime/manta/src/lib.rs +++ b/runtime/manta/src/lib.rs @@ -64,7 +64,7 @@ use manta_primitives::{ constants::{time::*, RocksDbWeight, STAKING_PALLET_ID, TREASURY_PALLET_ID, WEIGHT_PER_SECOND}, types::{AccountId, Balance, BlockNumber, Hash, Header, Index, Signature}, }; -use manta_support::manta_pay::{PullResponse, RawCheckpoint}; +use manta_support::manta_pay::{InitialSyncResponse, PullResponse, RawCheckpoint}; pub use pallet_parachain_staking::{InflationInfo, Range}; use pallet_session::ShouldEndSession; use runtime_common::{ @@ -261,6 +261,7 @@ impl Contains for MantaFilter { | RuntimeCall::XTokens(orml_xtokens::Call::transfer {..}) | RuntimeCall::Balances(_) | RuntimeCall::Preimage(_) + | RuntimeCall::MantaPay(_) | RuntimeCall::MantaSbt(_) | RuntimeCall::TransactionPause(_) | RuntimeCall::AssetManager(pallet_asset_manager::Call::update_outgoing_filtered_assets {..}) @@ -812,6 +813,7 @@ construct_runtime!( // Assets management Assets: pallet_assets::{Pallet, Call, Storage, Event} = 45, AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Config, Event} = 46, + MantaPay: pallet_manta_pay::{Pallet, Call, Storage, Event} = 47, MantaSbt: pallet_manta_sbt::{Pallet, Call, Storage, Event} = 49, } ); @@ -883,6 +885,7 @@ mod benches { [pallet_tx_pause, TransactionPause] [manta_collator_selection, CollatorSelection] [pallet_parachain_staking, ParachainStaking] + [pallet_manta_pay, MantaPay] [pallet_manta_sbt, MantaSbt] // Nimbus pallets [pallet_author_inherent, AuthorInherent] @@ -1015,6 +1018,22 @@ impl_runtime_apis! { } } + impl pallet_manta_pay::runtime::PullLedgerDiffApi for Runtime { + fn pull_ledger_diff( + checkpoint: RawCheckpoint, + max_receiver: u64, + max_sender: u64 + ) -> PullResponse { + MantaPay::pull_ledger_diff(checkpoint.into(), max_receiver, max_sender) + } + fn pull_ledger_total_count() -> [u8; 16] { + MantaPay::pull_ledger_total_count() + } + fn initial_pull(checkpoint: RawCheckpoint, max_receiver: u64) -> InitialSyncResponse { + MantaPay::initial_pull(checkpoint.into(), max_receiver) + } + } + impl nimbus_primitives::NimbusApi for Runtime { fn can_author(author: NimbusId, relay_parent: u32, parent_header: &::Header) -> bool { let next_block_number = parent_header.number + 1; diff --git a/runtime/manta/src/weights/mod.rs b/runtime/manta/src/weights/mod.rs index 338aef480..868036cdd 100644 --- a/runtime/manta/src/weights/mod.rs +++ b/runtime/manta/src/weights/mod.rs @@ -25,6 +25,7 @@ pub mod pallet_author_inherent; pub mod pallet_balances; pub mod pallet_collective; pub mod pallet_democracy; +pub mod pallet_manta_pay; pub mod pallet_manta_sbt; pub mod pallet_membership; pub mod pallet_multisig; diff --git a/runtime/manta/src/weights/pallet_manta_pay.rs b/runtime/manta/src/weights/pallet_manta_pay.rs new file mode 100644 index 000000000..5e37cb143 --- /dev/null +++ b/runtime/manta/src/weights/pallet_manta_pay.rs @@ -0,0 +1,162 @@ +// Copyright 2020-2023 Manta Network. +// This file is part of Manta. +// +// Manta 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. +// +// Manta 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 Manta. If not, see . + +//! Autogenerated weights for pallet_manta_pay +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-23, STEPS: `50`, REPEAT: 40, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("manta-dev"), DB CACHE: 1024 + +// Executed Command: +// ./target/production/manta +// benchmark +// pallet +// --chain=manta-dev +// --steps=50 +// --repeat=40 +// --pallet=pallet_manta_pay +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./scripts/benchmarking/frame-weights-output/pallet_manta_pay.rs +// --template=.github/resources/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(clippy::unnecessary_cast)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; +use manta_primitives::constants::RocksDbWeight; + +/// Weight functions needed for pallet_manta_pay. +pub trait WeightInfo { + fn to_private() -> Weight; + fn to_public() -> Weight; + fn private_transfer() -> Weight; + fn public_transfer() -> Weight; +} + +/// Weights for pallet_manta_pay using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl pallet_manta_pay::WeightInfo for SubstrateWeight { + // Storage: Assets Asset (r:1 w:1) + // Storage: Assets Account (r:2 w:2) + // Storage: MantaPay UtxoSet (r:1 w:1) + // Storage: MantaPay NullifierSetSize (r:1 w:0) + // Storage: MantaPay ShardTrees (r:1 w:1) + // Storage: MantaPay UtxoAccumulatorOutputs (r:0 w:1) + // Storage: MantaPay Shards (r:0 w:1) + fn to_private() -> Weight { + // Minimum execution time: 39_313_587 nanoseconds. + Weight::from_ref_time(39_413_323_000) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(7)) + } + // Storage: Assets Asset (r:1 w:1) + // Storage: Assets Account (r:2 w:2) + // Storage: MantaPay UtxoAccumulatorOutputs (r:2 w:1) + // Storage: MantaPay NullifierCommitmentSet (r:2 w:2) + // Storage: MantaPay UtxoSet (r:1 w:1) + // Storage: MantaPay NullifierSetSize (r:1 w:1) + // Storage: MantaPay ShardTrees (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: MantaPay NullifierSetInsertionOrder (r:0 w:2) + // Storage: MantaPay Shards (r:0 w:1) + fn to_public() -> Weight { + // Minimum execution time: 52_555_094 nanoseconds. + Weight::from_ref_time(52_646_272_000) + .saturating_add(T::DbWeight::get().reads(11)) + .saturating_add(T::DbWeight::get().writes(13)) + } + // Storage: MantaPay UtxoAccumulatorOutputs (r:2 w:2) + // Storage: MantaPay NullifierCommitmentSet (r:2 w:2) + // Storage: MantaPay UtxoSet (r:2 w:2) + // Storage: MantaPay NullifierSetSize (r:1 w:1) + // Storage: MantaPay ShardTrees (r:2 w:2) + // Storage: MantaPay NullifierSetInsertionOrder (r:0 w:2) + // Storage: MantaPay Shards (r:0 w:2) + fn private_transfer() -> Weight { + // Minimum execution time: 69_769_388 nanoseconds. + Weight::from_ref_time(69_888_940_000) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(13)) + } + // Storage: Assets Asset (r:1 w:1) + // Storage: Assets Account (r:2 w:2) + fn public_transfer() -> Weight { + // Minimum execution time: 50_113 nanoseconds. + Weight::from_ref_time(50_860_000) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + // Storage: Assets Asset (r:1 w:1) + // Storage: Assets Account (r:2 w:2) + // Storage: MantaPay UtxoSet (r:1 w:1) + // Storage: MantaPay NullifierSetSize (r:1 w:0) + // Storage: MantaPay ShardTrees (r:1 w:1) + // Storage: MantaPay UtxoAccumulatorOutputs (r:0 w:1) + // Storage: MantaPay Shards (r:0 w:1) + fn to_private() -> Weight { + // Minimum execution time: 39_313_587 nanoseconds. + Weight::from_ref_time(39_413_323_000) + .saturating_add(RocksDbWeight::get().reads(6)) + .saturating_add(RocksDbWeight::get().writes(7)) + } + // Storage: Assets Asset (r:1 w:1) + // Storage: Assets Account (r:2 w:2) + // Storage: MantaPay UtxoAccumulatorOutputs (r:2 w:1) + // Storage: MantaPay NullifierCommitmentSet (r:2 w:2) + // Storage: MantaPay UtxoSet (r:1 w:1) + // Storage: MantaPay NullifierSetSize (r:1 w:1) + // Storage: MantaPay ShardTrees (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: MantaPay NullifierSetInsertionOrder (r:0 w:2) + // Storage: MantaPay Shards (r:0 w:1) + fn to_public() -> Weight { + // Minimum execution time: 52_555_094 nanoseconds. + Weight::from_ref_time(52_646_272_000) + .saturating_add(RocksDbWeight::get().reads(11)) + .saturating_add(RocksDbWeight::get().writes(13)) + } + // Storage: MantaPay UtxoAccumulatorOutputs (r:2 w:2) + // Storage: MantaPay NullifierCommitmentSet (r:2 w:2) + // Storage: MantaPay UtxoSet (r:2 w:2) + // Storage: MantaPay NullifierSetSize (r:1 w:1) + // Storage: MantaPay ShardTrees (r:2 w:2) + // Storage: MantaPay NullifierSetInsertionOrder (r:0 w:2) + // Storage: MantaPay Shards (r:0 w:2) + fn private_transfer() -> Weight { + // Minimum execution time: 69_769_388 nanoseconds. + Weight::from_ref_time(69_888_940_000) + .saturating_add(RocksDbWeight::get().reads(9)) + .saturating_add(RocksDbWeight::get().writes(13)) + } + // Storage: Assets Asset (r:1 w:1) + // Storage: Assets Account (r:2 w:2) + fn public_transfer() -> Weight { + // Minimum execution time: 50_113 nanoseconds. + Weight::from_ref_time(50_860_000) + .saturating_add(RocksDbWeight::get().reads(3)) + .saturating_add(RocksDbWeight::get().writes(3)) + } +}