From 192d143b298fac1daefe99392e3b2027e6d8aebe Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Fri, 23 Dec 2022 15:37:34 +0000 Subject: [PATCH] Merge pull request #730 from UniqueNetwork/feature/pov-estimate-api Feature/pov estimate api --- --- a/Cargo.lock +++ b/Cargo.lock @@ -5362,6 +5362,7 @@ "substrate-wasm-builder", "up-common", "up-data-structs", + "up-pov-estimate-rpc", "up-rpc", "up-sponsorship", "xcm", @@ -5806,6 +5807,7 @@ "sp-runtime", "sp-std", "up-data-structs", + "up-pov-estimate-rpc", ] [[package]] @@ -8917,6 +8919,7 @@ "substrate-wasm-builder", "up-common", "up-data-structs", + "up-pov-estimate-rpc", "up-rpc", "up-sponsorship", "xcm", @@ -12824,18 +12827,34 @@ dependencies = [ "anyhow", "app-promotion-rpc", + "frame-benchmarking", "jsonrpsee", + "opal-runtime", "pallet-common", "pallet-evm", "parity-scale-codec 3.2.1", + "quartz-runtime", "rmrk-rpc", + "sc-client-api", + "sc-executor", + "sc-rpc-api", + "sc-service", "sp-api", "sp-blockchain", "sp-core", + "sp-externalities", + "sp-keystore", "sp-rpc", "sp-runtime", + "sp-state-machine", + "sp-trie", + "trie-db", + "unique-runtime", + "up-common", "up-data-structs", + "up-pov-estimate-rpc", "up-rpc", + "zstd", ] [[package]] @@ -12978,10 +12997,12 @@ "substrate-prometheus-endpoint", "tokio", "try-runtime-cli", + "uc-rpc", "unique-rpc", "unique-runtime", "up-common", "up-data-structs", + "up-pov-estimate-rpc", "up-rpc", ] @@ -13032,6 +13053,7 @@ "uc-rpc", "up-common", "up-data-structs", + "up-pov-estimate-rpc", "up-rpc", ] @@ -13125,6 +13147,7 @@ "substrate-wasm-builder", "up-common", "up-data-structs", + "up-pov-estimate-rpc", "up-rpc", "up-sponsorship", "xcm", @@ -13194,6 +13217,19 @@ ] [[package]] +name = "up-pov-estimate-rpc" +version = "0.1.0" +dependencies = [ + "parity-scale-codec 3.2.1", + "scale-info", + "serde", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] name = "up-rpc" version = "0.1.3" dependencies = [ --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ 'runtime/unique', 'runtime/tests', ] -default-members = ['node/*', 'runtime/opal'] +default-members = ['node/*', 'client/*', 'runtime/opal'] package.version = "0.9.36" [profile.release] --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -7,16 +7,43 @@ [dependencies] pallet-common = { default-features = false, path = '../../pallets/common' } up-data-structs = { default-features = false, path = '../../primitives/data-structs' } +up-common = { default-features = false, path = '../../primitives/common' } up-rpc = { path = "../../primitives/rpc" } app-promotion-rpc = { path = "../../primitives/app_promotion_rpc" } rmrk-rpc = { path = "../../primitives/rmrk-rpc" } +up-pov-estimate-rpc = { path = "../../primitives/pov-estimate-rpc", optional = true } codec = { package = "parity-scale-codec", version = "3.1.2" } jsonrpsee = { version = "0.16.2", features = ["server", "macros"] } anyhow = "1.0.57" +zstd = { version = "0.11.2", default-features = false } +trie-db = { version = "0.24.0", default-features = false } +sc-rpc-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sc-service = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-blockchain = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-keystore = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-rpc = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-trie = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } + +frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } + +sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } + +unique-runtime = { path = '../../runtime/unique', optional = true } +quartz-runtime = { path = '../../runtime/quartz', optional = true } +opal-runtime = { path = '../../runtime/opal' } + +[features] +pov-estimate = [ + 'up-pov-estimate-rpc', + 'unique-runtime?/pov-estimate', + 'quartz-runtime?/pov-estimate', + 'opal-runtime/pov-estimate', +] --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -42,6 +42,9 @@ pub use app_promotion_unique_rpc::AppPromotionApiServer; pub use rmrk_unique_rpc::RmrkApiServer; +#[cfg(feature = "pov-estimate")] +pub mod pov_estimate; + #[rpc(server)] #[async_trait] pub trait UniqueApi { @@ -420,17 +423,18 @@ } } +#[macro_export] macro_rules! define_struct_for_server_api { - ($name:ident) => { - pub struct $name { - client: Arc, - _marker: std::marker::PhantomData

, + ($name:ident { $($arg:ident: $arg_ty:ty),+ $(,)? }) => { + pub struct $name { + $($arg: $arg_ty),+, + _marker: std::marker::PhantomData, } - impl $name { - pub fn new(client: Arc) -> Self { + impl $name { + pub fn new($($arg: $arg_ty),+) -> Self { Self { - client, + $($arg),+, _marker: Default::default(), } } @@ -438,9 +442,23 @@ }; } -define_struct_for_server_api!(Unique); -define_struct_for_server_api!(AppPromotion); -define_struct_for_server_api!(Rmrk); +define_struct_for_server_api! { + Unique { + client: Arc + } +} + +define_struct_for_server_api! { + AppPromotion { + client: Arc + } +} + +define_struct_for_server_api! { + Rmrk { + client: Arc + } +} macro_rules! pass_method { ( --- /dev/null +++ b/client/rpc/src/pov_estimate.rs @@ -0,0 +1,290 @@ +// Copyright 2019-2022 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 . + +use std::sync::Arc; + +use codec::{Encode, Decode}; +use sp_externalities::Extensions; + +use up_pov_estimate_rpc::{PovEstimateApi as PovEstimateRuntimeApi}; +use up_common::types::opaque::RuntimeId; + +use sc_service::{NativeExecutionDispatch, config::ExecutionStrategy}; +use sp_state_machine::{StateMachine, TrieBackendBuilder}; +use trie_db::{Trie, TrieDBBuilder}; + +use jsonrpsee::{core::RpcResult as Result, proc_macros::rpc}; +use anyhow::anyhow; + +use sc_client_api::backend::Backend; +use sp_blockchain::HeaderBackend; +use sp_core::{ + Bytes, + offchain::{ + testing::{TestOffchainExt, TestTransactionPoolExt}, + OffchainDbExt, OffchainWorkerExt, TransactionPoolExt, + }, + testing::TaskExecutor, + traits::TaskExecutorExt, +}; +use sp_keystore::{testing::KeyStore, KeystoreExt}; +use sp_api::{AsTrieBackend, BlockId, BlockT, ProvideRuntimeApi}; + +use sc_executor::NativeElseWasmExecutor; +use sc_rpc_api::DenyUnsafe; + +use sp_runtime::traits::Header; + +use up_pov_estimate_rpc::{PovInfo, TrieKeyValue}; + +use crate::define_struct_for_server_api; + +type HasherOf = <::Header as Header>::Hashing; +type StateOf = as Backend>::State; + +pub struct ExecutorParams { + pub wasm_method: sc_service::config::WasmExecutionMethod, + pub default_heap_pages: Option, + pub max_runtime_instances: usize, + pub runtime_cache_size: u8, +} + +#[cfg(feature = "unique-runtime")] +pub struct UniqueRuntimeExecutor; + +#[cfg(feature = "quartz-runtime")] +pub struct QuartzRuntimeExecutor; + +pub struct OpalRuntimeExecutor; + +#[cfg(feature = "unique-runtime")] +impl NativeExecutionDispatch for UniqueRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + + fn dispatch(method: &str, data: &[u8]) -> Option> { + unique_runtime::api::dispatch(method, data) + } + + fn native_version() -> sc_executor::NativeVersion { + unique_runtime::native_version() + } +} + +#[cfg(feature = "quartz-runtime")] +impl NativeExecutionDispatch for QuartzRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + + fn dispatch(method: &str, data: &[u8]) -> Option> { + quartz_runtime::api::dispatch(method, data) + } + + fn native_version() -> sc_executor::NativeVersion { + quartz_runtime::native_version() + } +} + +impl NativeExecutionDispatch for OpalRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + + fn dispatch(method: &str, data: &[u8]) -> Option> { + opal_runtime::api::dispatch(method, data) + } + + fn native_version() -> sc_executor::NativeVersion { + opal_runtime::native_version() + } +} + +#[cfg(feature = "pov-estimate")] +define_struct_for_server_api! { + PovEstimate { + client: Arc, + backend: Arc>, + deny_unsafe: DenyUnsafe, + exec_params: ExecutorParams, + runtime_id: RuntimeId, + } +} + +#[rpc(server)] +#[async_trait] +pub trait PovEstimateApi { + #[method(name = "povinfo_estimateExtrinsicPoV")] + fn estimate_extrinsic_pov( + &self, + encoded_xts: Vec, + at: Option, + ) -> Result; +} + +#[allow(deprecated)] +#[cfg(feature = "pov-estimate")] +impl PovEstimateApiServer<::Hash> for PovEstimate +where + Block: BlockT, + C: 'static + ProvideRuntimeApi + HeaderBackend, + C::Api: PovEstimateRuntimeApi, +{ + fn estimate_extrinsic_pov( + &self, + encoded_xts: Vec, + at: Option<::Hash>, + ) -> Result { + self.deny_unsafe.check_if_safe()?; + + let at = at.unwrap_or_else(|| self.client.info().best_hash); + let state = self + .backend + .state_at(at) + .map_err(|_| anyhow!("unable to fetch the state at {at:?}"))?; + + match &self.runtime_id { + #[cfg(feature = "unique-runtime")] + RuntimeId::Unique => execute_extrinsic_in_sandbox::( + state, + &self.exec_params, + encoded_xts, + ), + + #[cfg(feature = "quartz-runtime")] + RuntimeId::Quartz => execute_extrinsic_in_sandbox::( + state, + &self.exec_params, + encoded_xts, + ), + + RuntimeId::Opal => execute_extrinsic_in_sandbox::( + state, + &self.exec_params, + encoded_xts, + ), + + runtime_id => Err(anyhow!("unknown runtime id {:?}", runtime_id).into()), + } + } +} + +fn full_extensions() -> Extensions { + let mut extensions = Extensions::default(); + extensions.register(TaskExecutorExt::new(TaskExecutor::new())); + let (offchain, _offchain_state) = TestOffchainExt::new(); + let (pool, _pool_state) = TestTransactionPoolExt::new(); + extensions.register(OffchainDbExt::new(offchain.clone())); + extensions.register(OffchainWorkerExt::new(offchain)); + extensions.register(KeystoreExt(std::sync::Arc::new(KeyStore::new()))); + extensions.register(TransactionPoolExt::new(pool)); + + extensions +} + +fn execute_extrinsic_in_sandbox( + state: StateOf, + exec_params: &ExecutorParams, + encoded_xts: Vec, +) -> Result +where + Block: BlockT, + D: NativeExecutionDispatch + 'static, +{ + let backend = state.as_trie_backend().clone(); + let mut changes = Default::default(); + let runtime_code_backend = sp_state_machine::backend::BackendRuntimeCode::new(backend); + + let proving_backend = TrieBackendBuilder::wrap(&backend) + .with_recorder(Default::default()) + .build(); + + let runtime_code = runtime_code_backend + .runtime_code() + .map_err(|_| anyhow!("runtime code backend creation failed"))?; + + let pre_root = *backend.root(); + + let executor = NativeElseWasmExecutor::::new( + exec_params.wasm_method, + exec_params.default_heap_pages, + exec_params.max_runtime_instances, + exec_params.runtime_cache_size, + ); + let execution = ExecutionStrategy::NativeElseWasm; + + let mut results = Vec::new(); + + for encoded_xt in encoded_xts { + let encoded_bytes = encoded_xt.encode(); + + let xt_result = StateMachine::new( + &proving_backend, + &mut changes, + &executor, + "PovEstimateApi_pov_estimate", + encoded_bytes.as_slice(), + full_extensions(), + &runtime_code, + sp_core::testing::TaskExecutor::new(), + ) + .execute(execution.into()) + .map_err(|e| anyhow!("failed to execute the extrinsic {:?}", e))?; + + let xt_result = Decode::decode(&mut &*xt_result) + .map_err(|e| anyhow!("failed to decode the extrinsic result {:?}", e))?; + + results.push(xt_result); + } + + let root = proving_backend.root().clone(); + + let proof = proving_backend + .extract_proof() + .expect("A recorder was set and thus, a storage proof can be extracted; qed"); + let proof_size = proof.encoded_size(); + + let memory_db = proof.clone().into_memory_db(); + + let tree_db = + TrieDBBuilder::>>::new(&memory_db, &root).build(); + + let key_values = tree_db + .iter() + .map_err(|e| anyhow!("failed to retrieve tree db key values: {:?}", e))? + .filter_map(|item| { + let item = item.ok()?; + + Some(TrieKeyValue { + key: item.0, + value: item.1, + }) + }) + .collect(); + + let compact_proof = proof + .clone() + .into_compact_proof::>(pre_root) + .map_err(|e| anyhow!("failed to generate compact proof {:?}", e))?; + let compact_proof_size = compact_proof.encoded_size(); + + let compressed_proof = zstd::stream::encode_all(&compact_proof.encode()[..], 0) + .map_err(|e| anyhow!("failed to generate compact proof {:?}", e))?; + let compressed_proof_size = compressed_proof.len(); + + Ok(PovInfo { + proof_size: proof_size as u64, + compact_proof_size: compact_proof_size as u64, + compressed_proof_size: compressed_proof_size as u64, + results, + key_values, + }) +} --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -319,8 +319,10 @@ pallet-ethereum = { git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } unique-rpc = { default-features = false, path = "../rpc" } +uc-rpc = { default-features = false, path = "../../client/rpc" } app-promotion-rpc = { path = "../../primitives/app_promotion_rpc", default-features = false } rmrk-rpc = { path = "../../primitives/rmrk-rpc" } +up-pov-estimate-rpc = { path = "../../primitives/pov-estimate-rpc", default-features = false } [features] default = ["opal-runtime"] @@ -339,3 +341,10 @@ 'try-runtime-cli/try-runtime', ] sapphire-runtime = ['opal-runtime', 'opal-runtime/become-sapphire'] +pov-estimate = [ + 'unique-runtime?/pov-estimate', + 'quartz-runtime?/pov-estimate', + 'opal-runtime/pov-estimate', + 'uc-rpc/pov-estimate', + 'unique-rpc/pov-estimate', +] --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -54,17 +54,6 @@ #[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))] pub type DefaultChainSpec = OpalChainSpec; -pub enum RuntimeId { - #[cfg(feature = "unique-runtime")] - Unique, - - #[cfg(feature = "quartz-runtime")] - Quartz, - - Opal, - Unknown(String), -} - #[cfg(not(feature = "unique-runtime"))] /// PARA_ID for Opal/Sapphire/Quartz const PARA_ID: u32 = 2095; --- a/node/cli/src/command.rs +++ b/node/cli/src/command.rs @@ -33,7 +33,7 @@ // limitations under the License. use crate::{ - chain_spec::{self, RuntimeId, RuntimeIdentification, ServiceId, ServiceIdentification}, + chain_spec::{self, RuntimeIdentification, ServiceId, ServiceIdentification}, cli::{Cli, RelayChainCli, Subcommand}, service::{new_partial, start_node, start_dev_node}, }; @@ -66,13 +66,13 @@ use sp_runtime::traits::{AccountIdConversion, Block as BlockT}; use std::{net::SocketAddr, time::Duration}; -use up_common::types::opaque::Block; +use up_common::types::opaque::{Block, RuntimeId}; macro_rules! no_runtime_err { - ($chain_name:expr) => { + ($runtime_id:expr) => { format!( - "No runtime valid runtime was found for chain {}", - $chain_name + "No runtime valid runtime was found for chain {:#?}", + $runtime_id ) }; } @@ -94,7 +94,7 @@ RuntimeId::Quartz => Box::new(chain_spec::QuartzChainSpec::from_json_file(path)?), RuntimeId::Opal => chain_spec, - RuntimeId::Unknown(chain) => return Err(no_runtime_err!(chain)), + runtime_id => return Err(no_runtime_err!(runtime_id)), } } }) @@ -147,7 +147,7 @@ RuntimeId::Quartz => &quartz_runtime::VERSION, RuntimeId::Opal => &opal_runtime::VERSION, - RuntimeId::Unknown(chain) => panic!("{}", no_runtime_err!(chain)), + runtime_id => panic!("{}", no_runtime_err!(runtime_id)), } } } @@ -235,7 +235,7 @@ runner, $components, $cli, $cmd, $config, $( $code )* ), - RuntimeId::Unknown(chain) => Err(no_runtime_err!(chain).into()) + runtime_id => Err(no_runtime_err!(runtime_id).into()) } }} } @@ -274,7 +274,7 @@ runner, $components, $cli, $cmd, $config, $( $code )* ), - RuntimeId::Unknown(chain) => Err(no_runtime_err!(chain).into()) + runtime_id => Err(no_runtime_err!(runtime_id).into()) } }} } @@ -302,7 +302,7 @@ OpalRuntimeExecutor, >($config $(, $($args),+)?) $($code)*, - RuntimeId::Unknown(chain) => Err(no_runtime_err!(chain).into()), + runtime_id => Err(no_runtime_err!(runtime_id).into()), } }; } @@ -445,7 +445,7 @@ sp_io::SubstrateHostFunctions, ::ExtendHostFunctions, >>()), - RuntimeId::Unknown(chain) => return Err(no_runtime_err!(chain).into()), + runtime_id => return Err(no_runtime_err!(runtime_id).into()), }, task_manager, )) --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -66,9 +66,10 @@ use fc_rpc_core::types::FilterPool; use fc_mapping_sync::{MappingSyncWorker, SyncStrategy}; -use up_common::types::opaque::{ - AuraId, RuntimeInstance, AccountId, Balance, Index, Hash, Block, BlockNumber, -}; +use up_common::types::opaque::*; + +#[cfg(feature = "pov-estimate")] +use crate::chain_spec::RuntimeIdentification; // RMRK use up_data_structs::{ @@ -412,7 +413,8 @@ RmrkBaseInfo, RmrkPartType, RmrkTheme, - > + substrate_frame_rpc_system::AccountNonceApi + > + up_pov_estimate_rpc::PovEstimateApi + + substrate_frame_rpc_system::AccountNonceApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + cumulus_primitives_core::CollectCollationInfo, @@ -517,9 +519,29 @@ .for_each(|()| futures::future::ready(())), ); + #[cfg(feature = "pov-estimate")] + let rpc_backend = backend.clone(); + + #[cfg(feature = "pov-estimate")] + let runtime_id = parachain_config.chain_spec.runtime_id(); + let rpc_builder = Box::new(move |deny_unsafe, subscription_task_executor| { let full_deps = unique_rpc::FullDeps { - backend: rpc_frontier_backend.clone(), + #[cfg(feature = "pov-estimate")] + runtime_id: runtime_id.clone(), + + #[cfg(feature = "pov-estimate")] + exec_params: uc_rpc::pov_estimate::ExecutorParams { + wasm_method: parachain_config.wasm_method, + default_heap_pages: parachain_config.default_heap_pages, + max_runtime_instances: parachain_config.max_runtime_instances, + runtime_cache_size: parachain_config.runtime_cache_size, + }, + + #[cfg(feature = "pov-estimate")] + backend: rpc_backend.clone(), + + eth_backend: rpc_frontier_backend.clone(), deny_unsafe, client: rpc_client.clone(), pool: rpc_pool.clone(), @@ -720,7 +742,8 @@ RmrkBaseInfo, RmrkPartType, RmrkTheme, - > + substrate_frame_rpc_system::AccountNonceApi + > + up_pov_estimate_rpc::PovEstimateApi + + substrate_frame_rpc_system::AccountNonceApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + cumulus_primitives_core::CollectCollationInfo @@ -869,7 +892,8 @@ RmrkBaseInfo, RmrkPartType, RmrkTheme, - > + substrate_frame_rpc_system::AccountNonceApi + > + up_pov_estimate_rpc::PovEstimateApi + + substrate_frame_rpc_system::AccountNonceApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + cumulus_primitives_core::CollectCollationInfo @@ -1040,9 +1064,29 @@ let rpc_pool = transaction_pool.clone(); let rpc_network = network.clone(); let rpc_frontier_backend = frontier_backend.clone(); + + #[cfg(feature = "pov-estimate")] + let rpc_backend = backend.clone(); + + #[cfg(feature = "pov-estimate")] + let runtime_id = config.chain_spec.runtime_id(); + let rpc_builder = Box::new(move |deny_unsafe, subscription_executor| { let full_deps = unique_rpc::FullDeps { - backend: rpc_frontier_backend.clone(), + #[cfg(feature = "pov-estimate")] + runtime_id: runtime_id.clone(), + + #[cfg(feature = "pov-estimate")] + exec_params: uc_rpc::pov_estimate::ExecutorParams { + wasm_method: config.wasm_method, + default_heap_pages: config.default_heap_pages, + max_runtime_instances: config.max_runtime_instances, + runtime_cache_size: config.runtime_cache_size, + }, + + #[cfg(feature = "pov-estimate")] + backend: rpc_backend.clone(), + eth_backend: rpc_frontier_backend.clone(), deny_unsafe, client: rpc_client.clone(), pool: rpc_pool.clone(), --- a/node/rpc/Cargo.toml +++ b/node/rpc/Cargo.toml @@ -55,6 +55,7 @@ up-rpc = { path = "../../primitives/rpc" } app-promotion-rpc = { path = "../../primitives/app_promotion_rpc" } rmrk-rpc = { path = "../../primitives/rmrk-rpc" } +up-pov-estimate-rpc = { path = "../../primitives/pov-estimate-rpc" } up-data-structs = { default-features = false, path = "../../primitives/data-structs" } [dependencies.serde] @@ -65,3 +66,4 @@ default = [] std = [] unique-runtime = [] +pov-estimate = ['uc-rpc/pov-estimate'] --- a/node/rpc/src/lib.rs +++ b/node/rpc/src/lib.rs @@ -40,7 +40,7 @@ use sc_service::TransactionPool; use std::{collections::BTreeMap, sync::Arc}; -use up_common::types::opaque::{Hash, AccountId, RuntimeInstance, Index, Block, BlockNumber, Balance}; +use up_common::types::opaque::*; // RMRK use up_data_structs::{ @@ -48,6 +48,9 @@ RmrkPartType, RmrkTheme, }; +#[cfg(feature = "pov-estimate")] +type FullBackend = sc_service::TFullBackend; + /// Extra dependencies for GRANDPA pub struct GrandpaDeps { /// Voting round info. @@ -82,8 +85,18 @@ pub deny_unsafe: DenyUnsafe, /// EthFilterApi pool. pub filter_pool: Option, - /// Backend. - pub backend: Arc>, + + #[cfg(feature = "pov-estimate")] + pub runtime_id: RuntimeId, + /// Executor params for PoV estimating + #[cfg(feature = "pov-estimate")] + pub exec_params: uc_rpc::pov_estimate::ExecutorParams, + /// Substrate Backend. + #[cfg(feature = "pov-estimate")] + pub backend: Arc, + + /// Ethereum Backend. + pub eth_backend: Arc>, /// Maximum number of logs in a query. pub max_past_logs: u32, /// Maximum fee history cache size. @@ -162,6 +175,7 @@ RmrkPartType, RmrkTheme, >, + C::Api: up_pov_estimate_rpc::PovEstimateApi, B: sc_client_api::Backend + Send + Sync + 'static, B::State: sc_client_api::backend::StateBackend>, P: TransactionPool + 'static, @@ -182,6 +196,9 @@ #[cfg(not(feature = "unique-runtime"))] use uc_rpc::{RmrkApiServer, Rmrk}; + #[cfg(feature = "pov-estimate")] + use uc_rpc::pov_estimate::{PovEstimateApiServer, PovEstimate}; + // use pallet_contracts_rpc::{Contracts, ContractsApi}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use substrate_frame_rpc_system::{System, SystemApiServer}; @@ -200,7 +217,17 @@ network, deny_unsafe, filter_pool, + + #[cfg(feature = "pov-estimate")] + runtime_id, + + #[cfg(feature = "pov-estimate")] + exec_params, + + #[cfg(feature = "pov-estimate")] backend, + + eth_backend, max_past_logs, } = deps; @@ -226,7 +253,7 @@ network.clone(), signers, overrides.clone(), - backend.clone(), + eth_backend.clone(), is_authority, block_data_cache.clone(), fee_history_cache, @@ -244,11 +271,23 @@ #[cfg(not(feature = "unique-runtime"))] io.merge(Rmrk::new(client.clone()).into_rpc())?; + #[cfg(feature = "pov-estimate")] + io.merge( + PovEstimate::new( + client.clone(), + backend, + deny_unsafe, + exec_params, + runtime_id, + ) + .into_rpc(), + )?; + if let Some(filter_pool) = filter_pool { io.merge( EthFilter::new( client.clone(), - backend, + eth_backend, filter_pool, 500_usize, // max stored filters max_past_logs, --- a/pallets/common/Cargo.toml +++ b/pallets/common/Cargo.toml @@ -23,6 +23,7 @@ evm-coder = { default-features = false, path = '../../crates/evm-coder' } ethereum = { version = "0.14.0", default-features = false } pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } +up-pov-estimate-rpc = { default-features = false, path = "../../primitives/pov-estimate-rpc" } serde = { version = "1.0.130", default-features = false } scale-info = { version = "2.0.1", default-features = false, features = [ @@ -39,6 +40,7 @@ "fp-evm-mapping/std", "up-data-structs/std", "pallet-evm/std", + "up-pov-estimate-rpc/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -115,6 +115,7 @@ RmrkNftChild, CollectionPermissions, }; +use up_pov_estimate_rpc::PovInfo; pub use pallet::*; use sp_core::H160; @@ -881,6 +882,8 @@ RmrkPartType, RmrkBoundedTheme, RmrkNftChild, + // PoV Estimate Info + PovInfo, )>, ), QueryKind = OptionQuery, --- a/primitives/common/src/types.rs +++ b/primitives/common/src/types.rs @@ -29,6 +29,14 @@ pub use super::{BlockNumber, Signature, AccountId, Balance, Index, Hash, AuraId}; + #[derive(Debug, Clone)] + pub enum RuntimeId { + Unique, + Quartz, + Opal, + Unknown(sp_std::vec::Vec), + } + /// Opaque block header type. pub type Header = generic::Header; --- /dev/null +++ b/primitives/pov-estimate-rpc/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "up-pov-estimate-rpc" +version = "0.1.0" +license = "GPLv3" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.2", default-features = false, features = [ + "derive", +] } +serde = { version = "1.0.130", features = ["derive"], default-features = false, optional = true } +scale-info = { version = "2.0.1", default-features = false, features = ["derive"] } +sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } + +[features] +default = ["std"] +std = [ + "codec/std", + "serde/std", + "scale-info/std", + "sp-core/std", + "sp-std/std", + "sp-api/std", + "sp-runtime/std", +] --- /dev/null +++ b/primitives/pov-estimate-rpc/src/lib.rs @@ -0,0 +1,49 @@ +// Copyright 2019-2022 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 . + +#![cfg_attr(not(feature = "std"), no_std)] + +use scale_info::TypeInfo; +use sp_std::vec::Vec; + +#[cfg(feature = "std")] +use serde::Serialize; + +use sp_runtime::ApplyExtrinsicResult; +use sp_core::Bytes; + +#[cfg_attr(feature = "std", derive(Serialize))] +#[derive(Debug, TypeInfo)] +pub struct PovInfo { + pub proof_size: u64, + pub compact_proof_size: u64, + pub compressed_proof_size: u64, + pub results: Vec, + pub key_values: Vec, +} + +#[cfg_attr(feature = "std", derive(Serialize))] +#[derive(Debug, TypeInfo)] +pub struct TrieKeyValue { + pub key: Vec, + pub value: Vec, +} + +sp_api::decl_runtime_apis! { + pub trait PovEstimateApi { + fn pov_estimate(uxt: Bytes) -> ApplyExtrinsicResult; + } +} --- a/runtime/common/runtime_apis.rs +++ b/runtime/common/runtime_apis.rs @@ -35,7 +35,7 @@ ) => { use sp_std::prelude::*; use sp_api::impl_runtime_apis; - use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160}; + use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160, Bytes}; use sp_runtime::{ Permill, traits::Block as BlockT, @@ -778,6 +778,29 @@ } } + impl up_pov_estimate_rpc::PovEstimateApi for Runtime { + #[allow(unused_variables)] + fn pov_estimate(uxt: Bytes) -> ApplyExtrinsicResult { + #[cfg(feature = "pov-estimate")] + { + use codec::Decode; + + let uxt_decode = <::Extrinsic as Decode>::decode(&mut &*uxt) + .map_err(|_| DispatchError::Other("failed to decode the extrinsic")); + + let uxt = match uxt_decode { + Ok(uxt) => uxt, + Err(err) => return Ok(err.into()), + }; + + Executive::apply_extrinsic(uxt) + } + + #[cfg(not(feature = "pov-estimate"))] + return Ok(unsupported!()); + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: bool) -> (frame_support::pallet_prelude::Weight, frame_support::pallet_prelude::Weight) { --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -127,6 +127,7 @@ 'pallet-base-fee/std', 'fp-rpc/std', 'up-rpc/std', + 'up-pov-estimate-rpc/std', 'app-promotion-rpc/std', 'fp-evm-mapping/std', 'fp-self-contained/std', @@ -184,6 +185,7 @@ 'pallet-test-utils', ] become-sapphire = [] +pov-estimate = [] refungible = [] scheduler = [] @@ -468,6 +470,7 @@ derivative = "2.2.0" pallet-unique = { path = '../../pallets/unique', default-features = false } up-rpc = { path = "../../primitives/rpc", default-features = false } +up-pov-estimate-rpc = { path = "../../primitives/pov-estimate-rpc", default-features = false } app-promotion-rpc = { path = "../../primitives/app_promotion_rpc", default-features = false } rmrk-rpc = { path = "../../primitives/rmrk-rpc", default-features = false } fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -122,6 +122,7 @@ 'pallet-base-fee/std', 'fp-rpc/std', 'up-rpc/std', + 'up-pov-estimate-rpc/std', 'app-promotion-rpc/std', 'fp-evm-mapping/std', 'fp-self-contained/std', @@ -169,6 +170,7 @@ ] limit-testing = ['pallet-unique/limit-testing', 'up-data-structs/limit-testing'] quartz-runtime = ['refungible', 'app-promotion', 'foreign-assets'] +pov-estimate = [] refungible = [] scheduler = [] @@ -461,6 +463,7 @@ derivative = "2.2.0" pallet-unique = { path = '../../pallets/unique', default-features = false } up-rpc = { path = "../../primitives/rpc", default-features = false } +up-pov-estimate-rpc = { path = "../../primitives/pov-estimate-rpc", default-features = false } app-promotion-rpc = { path = "../../primitives/app_promotion_rpc", default-features = false } fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } fp-evm-mapping = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -123,6 +123,7 @@ 'pallet-base-fee/std', 'fp-rpc/std', 'up-rpc/std', + 'up-pov-estimate-rpc/std', 'app-promotion-rpc/std', 'fp-evm-mapping/std', 'fp-self-contained/std', @@ -170,6 +171,7 @@ ] limit-testing = ['pallet-unique/limit-testing', 'up-data-structs/limit-testing'] unique-runtime = ['foreign-assets'] +pov-estimate = [] stubgen = ["evm-coder/stubgen"] refungible = [] @@ -454,6 +456,7 @@ derivative = "2.2.0" pallet-unique = { path = '../../pallets/unique', default-features = false } up-rpc = { path = "../../primitives/rpc", default-features = false } +up-pov-estimate-rpc = { path = "../../primitives/pov-estimate-rpc", default-features = false } app-promotion-rpc = { path = "../../primitives/app_promotion_rpc", default-features = false } rmrk-rpc = { path = "../../primitives/rmrk-rpc", default-features = false } pallet-inflation = { path = '../../pallets/inflation', default-features = false } --- a/tests/src/interfaces/augment-api-rpc.ts +++ b/tests/src/interfaces/augment-api-rpc.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/rpc-core/types/jsonrpc'; -import type { PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsPartPartType, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenChild, UpDataStructsTokenData } from './default'; +import type { PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsPartPartType, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionStats, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsRpcCollection, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo } from './default'; import type { AugmentedRpc } from '@polkadot/rpc-core/types'; import type { Metadata, StorageKey } from '@polkadot/types'; import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, f64, u128, u32, u64 } from '@polkadot/types-codec'; @@ -436,6 +436,12 @@ **/ queryInfo: AugmentedRpc<(extrinsic: Bytes | string | Uint8Array, at?: BlockHash | string | Uint8Array) => Observable>; }; + povinfo: { + /** + * Estimate PoV size of encoded signed extrinsics + **/ + estimateExtrinsicPoV: AugmentedRpc<(encodedXt: Vec | (Bytes | string | Uint8Array)[], at?: Hash | string | Uint8Array) => Observable>; + }; rmrk: { /** * Get tokens owned by an account in a collection --- a/tests/src/interfaces/augment-types.ts +++ b/tests/src/interfaces/augment-types.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; -import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default'; +import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionValidityInvalidTransaction, SpRuntimeTransactionValidityTransactionValidityError, SpRuntimeTransactionValidityUnknownTransaction, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo, UpPovEstimateRpcTrieKeyValue, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default'; import type { Data, StorageKey } from '@polkadot/types'; import type { BitVec, Bool, Bytes, F32, F64, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, f32, f64, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec'; import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets'; @@ -1186,6 +1186,9 @@ SpRuntimeMultiSignature: SpRuntimeMultiSignature; SpRuntimeTokenError: SpRuntimeTokenError; SpRuntimeTransactionalError: SpRuntimeTransactionalError; + SpRuntimeTransactionValidityInvalidTransaction: SpRuntimeTransactionValidityInvalidTransaction; + SpRuntimeTransactionValidityTransactionValidityError: SpRuntimeTransactionValidityTransactionValidityError; + SpRuntimeTransactionValidityUnknownTransaction: SpRuntimeTransactionValidityUnknownTransaction; SpTrieStorageProof: SpTrieStorageProof; SpVersionRuntimeVersion: SpVersionRuntimeVersion; SpWeightsRuntimeDbWeight: SpWeightsRuntimeDbWeight; @@ -1325,6 +1328,8 @@ UpDataStructsTokenData: UpDataStructsTokenData; UpgradeGoAhead: UpgradeGoAhead; UpgradeRestriction: UpgradeRestriction; + UpPovEstimateRpcPovInfo: UpPovEstimateRpcPovInfo; + UpPovEstimateRpcTrieKeyValue: UpPovEstimateRpcTrieKeyValue; UpwardMessage: UpwardMessage; usize: usize; USize: USize; --- a/tests/src/interfaces/default/types.ts +++ b/tests/src/interfaces/default/types.ts @@ -2444,7 +2444,7 @@ } /** @name PhantomTypeUpDataStructs */ -export interface PhantomTypeUpDataStructs extends Vec> {} +export interface PhantomTypeUpDataStructs extends Vec> {} /** @name PolkadotCorePrimitivesInboundDownwardMessage */ export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct { @@ -2748,6 +2748,41 @@ readonly type: 'LimitReached' | 'NoLayer'; } +/** @name SpRuntimeTransactionValidityInvalidTransaction */ +export interface SpRuntimeTransactionValidityInvalidTransaction extends Enum { + readonly isCall: boolean; + readonly isPayment: boolean; + readonly isFuture: boolean; + readonly isStale: boolean; + readonly isBadProof: boolean; + readonly isAncientBirthBlock: boolean; + readonly isExhaustsResources: boolean; + readonly isCustom: boolean; + readonly asCustom: u8; + readonly isBadMandatory: boolean; + readonly isMandatoryValidation: boolean; + readonly isBadSigner: boolean; + readonly type: 'Call' | 'Payment' | 'Future' | 'Stale' | 'BadProof' | 'AncientBirthBlock' | 'ExhaustsResources' | 'Custom' | 'BadMandatory' | 'MandatoryValidation' | 'BadSigner'; +} + +/** @name SpRuntimeTransactionValidityTransactionValidityError */ +export interface SpRuntimeTransactionValidityTransactionValidityError extends Enum { + readonly isInvalid: boolean; + readonly asInvalid: SpRuntimeTransactionValidityInvalidTransaction; + readonly isUnknown: boolean; + readonly asUnknown: SpRuntimeTransactionValidityUnknownTransaction; + readonly type: 'Invalid' | 'Unknown'; +} + +/** @name SpRuntimeTransactionValidityUnknownTransaction */ +export interface SpRuntimeTransactionValidityUnknownTransaction extends Enum { + readonly isCannotLookup: boolean; + readonly isNoUnsignedValidator: boolean; + readonly isCustom: boolean; + readonly asCustom: u8; + readonly type: 'CannotLookup' | 'NoUnsignedValidator' | 'Custom'; +} + /** @name SpTrieStorageProof */ export interface SpTrieStorageProof extends Struct { readonly trieNodes: BTreeSet; @@ -3018,6 +3053,21 @@ readonly pieces: u128; } +/** @name UpPovEstimateRpcPovInfo */ +export interface UpPovEstimateRpcPovInfo extends Struct { + readonly proofSize: u64; + readonly compactProofSize: u64; + readonly compressedProofSize: u64; + readonly results: Vec, SpRuntimeTransactionValidityTransactionValidityError>>; + readonly keyValues: Vec; +} + +/** @name UpPovEstimateRpcTrieKeyValue */ +export interface UpPovEstimateRpcTrieKeyValue extends Struct { + readonly key: Bytes; + readonly value: Bytes; +} + /** @name XcmDoubleEncoded */ export interface XcmDoubleEncoded extends Struct { readonly encoded: Bytes; --- a/tests/src/interfaces/definitions.ts +++ b/tests/src/interfaces/definitions.ts @@ -17,4 +17,5 @@ export {default as unique} from './unique/definitions'; export {default as appPromotion} from './appPromotion/definitions'; export {default as rmrk} from './rmrk/definitions'; -export {default as default} from './default/definitions'; \ No newline at end of file +export {default as povinfo} from './povinfo/definitions'; +export {default as default} from './default/definitions'; --- a/tests/src/interfaces/lookup.ts +++ b/tests/src/interfaces/lookup.ts @@ -3106,7 +3106,7 @@ /** * Lookup399: PhantomType::up_data_structs **/ - PhantomTypeUpDataStructs: '[(UpDataStructsTokenData,UpDataStructsRpcCollection,RmrkTraitsCollectionCollectionInfo,RmrkTraitsNftNftInfo,RmrkTraitsResourceResourceInfo,RmrkTraitsPropertyPropertyInfo,RmrkTraitsBaseBaseInfo,RmrkTraitsPartPartType,RmrkTraitsTheme,RmrkTraitsNftNftChild);0]', + PhantomTypeUpDataStructs: '[(UpDataStructsTokenData,UpDataStructsRpcCollection,RmrkTraitsCollectionCollectionInfo,RmrkTraitsNftNftInfo,RmrkTraitsResourceResourceInfo,RmrkTraitsPropertyPropertyInfo,RmrkTraitsBaseBaseInfo,RmrkTraitsPartPartType,RmrkTraitsTheme,RmrkTraitsNftNftChild,UpPovEstimateRpcPovInfo);0]', /** * Lookup401: up_data_structs::TokenData> **/ @@ -3198,79 +3198,133 @@ nftId: 'u32' }, /** - * Lookup414: pallet_common::pallet::Error + * Lookup413: up_pov_estimate_rpc::PovInfo + **/ + UpPovEstimateRpcPovInfo: { + proofSize: 'u64', + compactProofSize: 'u64', + compressedProofSize: 'u64', + results: 'Vec, SpRuntimeTransactionValidityTransactionValidityError>>', + keyValues: 'Vec' + }, + /** + * Lookup416: sp_runtime::transaction_validity::TransactionValidityError + **/ + SpRuntimeTransactionValidityTransactionValidityError: { + _enum: { + Invalid: 'SpRuntimeTransactionValidityInvalidTransaction', + Unknown: 'SpRuntimeTransactionValidityUnknownTransaction' + } + }, + /** + * Lookup417: sp_runtime::transaction_validity::InvalidTransaction + **/ + SpRuntimeTransactionValidityInvalidTransaction: { + _enum: { + Call: 'Null', + Payment: 'Null', + Future: 'Null', + Stale: 'Null', + BadProof: 'Null', + AncientBirthBlock: 'Null', + ExhaustsResources: 'Null', + Custom: 'u8', + BadMandatory: 'Null', + MandatoryValidation: 'Null', + BadSigner: 'Null' + } + }, + /** + * Lookup418: sp_runtime::transaction_validity::UnknownTransaction + **/ + SpRuntimeTransactionValidityUnknownTransaction: { + _enum: { + CannotLookup: 'Null', + NoUnsignedValidator: 'Null', + Custom: 'u8' + } + }, + /** + * Lookup420: up_pov_estimate_rpc::TrieKeyValue + **/ + UpPovEstimateRpcTrieKeyValue: { + key: 'Bytes', + value: 'Bytes' + }, + /** + * Lookup422: pallet_common::pallet::Error **/ PalletCommonError: { _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'CantDestroyNotEmptyCollection', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'UserIsNotAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached', 'PropertyKeyIsTooLong', 'InvalidCharacterInPropertyKey', 'EmptyPropertyKey', 'CollectionIsExternal', 'CollectionIsInternal', 'ConfirmSponsorshipFail', 'UserIsNotCollectionAdmin'] }, /** - * Lookup416: pallet_fungible::pallet::Error + * Lookup424: pallet_fungible::pallet::Error **/ PalletFungibleError: { _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'SettingPropertiesNotAllowed', 'SettingAllowanceForAllNotAllowed', 'FungibleTokensAreAlwaysValid'] }, /** - * Lookup420: pallet_refungible::pallet::Error + * Lookup428: pallet_refungible::pallet::Error **/ PalletRefungibleError: { _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RepartitionWhileNotOwningAllPieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed'] }, /** - * Lookup421: pallet_nonfungible::ItemData> + * Lookup429: pallet_nonfungible::ItemData> **/ PalletNonfungibleItemData: { owner: 'PalletEvmAccountBasicCrossAccountIdRepr' }, /** - * Lookup423: up_data_structs::PropertyScope + * Lookup431: up_data_structs::PropertyScope **/ UpDataStructsPropertyScope: { _enum: ['None', 'Rmrk'] }, /** - * Lookup426: pallet_nonfungible::pallet::Error + * Lookup434: pallet_nonfungible::pallet::Error **/ PalletNonfungibleError: { _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount', 'CantBurnNftWithChildren'] }, /** - * Lookup427: pallet_structure::pallet::Error + * Lookup435: pallet_structure::pallet::Error **/ PalletStructureError: { _enum: ['OuroborosDetected', 'DepthLimit', 'BreadthLimit', 'TokenNotFound'] }, /** - * Lookup428: pallet_rmrk_core::pallet::Error + * Lookup436: pallet_rmrk_core::pallet::Error **/ PalletRmrkCoreError: { _enum: ['CorruptedCollectionType', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'RmrkPropertyIsNotFound', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'CannotRejectNonPendingNft', 'ResourceNotPending', 'NoAvailableResourceId'] }, /** - * Lookup430: pallet_rmrk_equip::pallet::Error + * Lookup438: pallet_rmrk_equip::pallet::Error **/ PalletRmrkEquipError: { _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst', 'PartDoesntExist', 'NoEquippableOnFixedPart'] }, /** - * Lookup436: pallet_app_promotion::pallet::Error + * Lookup444: pallet_app_promotion::pallet::Error **/ PalletAppPromotionError: { _enum: ['AdminNotSet', 'NoPermission', 'NotSufficientFunds', 'PendingForBlockOverflow', 'SponsorNotSet', 'IncorrectLockedBalanceOperation'] }, /** - * Lookup437: pallet_foreign_assets::module::Error + * Lookup445: pallet_foreign_assets::module::Error **/ PalletForeignAssetsModuleError: { _enum: ['BadLocation', 'MultiLocationExisted', 'AssetIdNotExists', 'AssetIdExisted'] }, /** - * Lookup439: pallet_evm::pallet::Error + * Lookup447: pallet_evm::pallet::Error **/ PalletEvmError: { _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce', 'GasLimitTooLow', 'GasLimitTooHigh', 'Undefined', 'Reentrancy', 'TransactionMustComeFromEOA'] }, /** - * Lookup442: fp_rpc::TransactionStatus + * Lookup450: fp_rpc::TransactionStatus **/ FpRpcTransactionStatus: { transactionHash: 'H256', @@ -3282,11 +3336,11 @@ logsBloom: 'EthbloomBloom' }, /** - * Lookup444: ethbloom::Bloom + * Lookup452: ethbloom::Bloom **/ EthbloomBloom: '[u8;256]', /** - * Lookup446: ethereum::receipt::ReceiptV3 + * Lookup454: ethereum::receipt::ReceiptV3 **/ EthereumReceiptReceiptV3: { _enum: { @@ -3296,7 +3350,7 @@ } }, /** - * Lookup447: ethereum::receipt::EIP658ReceiptData + * Lookup455: ethereum::receipt::EIP658ReceiptData **/ EthereumReceiptEip658ReceiptData: { statusCode: 'u8', @@ -3305,7 +3359,7 @@ logs: 'Vec' }, /** - * Lookup448: ethereum::block::Block + * Lookup456: ethereum::block::Block **/ EthereumBlock: { header: 'EthereumHeader', @@ -3313,7 +3367,7 @@ ommers: 'Vec' }, /** - * Lookup449: ethereum::header::Header + * Lookup457: ethereum::header::Header **/ EthereumHeader: { parentHash: 'H256', @@ -3333,23 +3387,23 @@ nonce: 'EthereumTypesHashH64' }, /** - * Lookup450: ethereum_types::hash::H64 + * Lookup458: ethereum_types::hash::H64 **/ EthereumTypesHashH64: '[u8;8]', /** - * Lookup455: pallet_ethereum::pallet::Error + * Lookup463: pallet_ethereum::pallet::Error **/ PalletEthereumError: { _enum: ['InvalidSignature', 'PreLogExists'] }, /** - * Lookup456: pallet_evm_coder_substrate::pallet::Error + * Lookup464: pallet_evm_coder_substrate::pallet::Error **/ PalletEvmCoderSubstrateError: { _enum: ['OutOfGas', 'OutOfFund'] }, /** - * Lookup457: up_data_structs::SponsorshipState> + * Lookup465: up_data_structs::SponsorshipState> **/ UpDataStructsSponsorshipStateBasicCrossAccountIdRepr: { _enum: { @@ -3359,35 +3413,35 @@ } }, /** - * Lookup458: pallet_evm_contract_helpers::SponsoringModeT + * Lookup466: pallet_evm_contract_helpers::SponsoringModeT **/ PalletEvmContractHelpersSponsoringModeT: { _enum: ['Disabled', 'Allowlisted', 'Generous'] }, /** - * Lookup464: pallet_evm_contract_helpers::pallet::Error + * Lookup472: pallet_evm_contract_helpers::pallet::Error **/ PalletEvmContractHelpersError: { _enum: ['NoPermission', 'NoPendingSponsor', 'TooManyMethodsHaveSponsoredLimit'] }, /** - * Lookup465: pallet_evm_migration::pallet::Error + * Lookup473: pallet_evm_migration::pallet::Error **/ PalletEvmMigrationError: { _enum: ['AccountNotEmpty', 'AccountIsNotMigrating', 'BadEvent'] }, /** - * Lookup466: pallet_maintenance::pallet::Error + * Lookup474: pallet_maintenance::pallet::Error **/ PalletMaintenanceError: 'Null', /** - * Lookup467: pallet_test_utils::pallet::Error + * Lookup475: pallet_test_utils::pallet::Error **/ PalletTestUtilsError: { _enum: ['TestPalletDisabled', 'TriggerRollback'] }, /** - * Lookup469: sp_runtime::MultiSignature + * Lookup477: sp_runtime::MultiSignature **/ SpRuntimeMultiSignature: { _enum: { @@ -3397,51 +3451,51 @@ } }, /** - * Lookup470: sp_core::ed25519::Signature + * Lookup478: sp_core::ed25519::Signature **/ SpCoreEd25519Signature: '[u8;64]', /** - * Lookup472: sp_core::sr25519::Signature + * Lookup480: sp_core::sr25519::Signature **/ SpCoreSr25519Signature: '[u8;64]', /** - * Lookup473: sp_core::ecdsa::Signature + * Lookup481: sp_core::ecdsa::Signature **/ SpCoreEcdsaSignature: '[u8;65]', /** - * Lookup476: frame_system::extensions::check_spec_version::CheckSpecVersion + * Lookup484: frame_system::extensions::check_spec_version::CheckSpecVersion **/ FrameSystemExtensionsCheckSpecVersion: 'Null', /** - * Lookup477: frame_system::extensions::check_tx_version::CheckTxVersion + * Lookup485: frame_system::extensions::check_tx_version::CheckTxVersion **/ FrameSystemExtensionsCheckTxVersion: 'Null', /** - * Lookup478: frame_system::extensions::check_genesis::CheckGenesis + * Lookup486: frame_system::extensions::check_genesis::CheckGenesis **/ FrameSystemExtensionsCheckGenesis: 'Null', /** - * Lookup481: frame_system::extensions::check_nonce::CheckNonce + * Lookup489: frame_system::extensions::check_nonce::CheckNonce **/ FrameSystemExtensionsCheckNonce: 'Compact', /** - * Lookup482: frame_system::extensions::check_weight::CheckWeight + * Lookup490: frame_system::extensions::check_weight::CheckWeight **/ FrameSystemExtensionsCheckWeight: 'Null', /** - * Lookup483: opal_runtime::runtime_common::maintenance::CheckMaintenance + * Lookup491: opal_runtime::runtime_common::maintenance::CheckMaintenance **/ OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance: 'Null', /** - * Lookup484: pallet_template_transaction_payment::ChargeTransactionPayment + * Lookup492: pallet_template_transaction_payment::ChargeTransactionPayment **/ PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact', /** - * Lookup485: opal_runtime::Runtime + * Lookup493: opal_runtime::Runtime **/ OpalRuntimeRuntime: 'Null', /** - * Lookup486: pallet_ethereum::FakeTransactionFinalizer + * Lookup494: pallet_ethereum::FakeTransactionFinalizer **/ PalletEthereumFakeTransactionFinalizer: 'Null' }; --- /dev/null +++ b/tests/src/interfaces/povinfo/definitions.ts @@ -0,0 +1,40 @@ +// Copyright 2019-2022 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 . + +type RpcParam = { + name: string; + type: string; + isOptional?: true; +}; + +const atParam = {name: 'at', type: 'Hash', isOptional: true}; + +const fun = (description: string, params: RpcParam[], type: string) => ({ + description, + params: [...params, atParam], + type, +}); + +export default { + types: {}, + rpc: { + estimateExtrinsicPoV: fun( + 'Estimate PoV size of encoded signed extrinsics', + [{name: 'encodedXt', type: 'Vec'}], + 'UpPovEstimateRpcPovInfo', + ), + }, +}; --- /dev/null +++ b/tests/src/interfaces/povinfo/index.ts @@ -0,0 +1,4 @@ +// Auto-generated via `yarn polkadot-types-from-defs`, do not edit +/* eslint-disable */ + +export * from './types'; --- /dev/null +++ b/tests/src/interfaces/povinfo/types.ts @@ -0,0 +1,4 @@ +// Auto-generated via `yarn polkadot-types-from-defs`, do not edit +/* eslint-disable */ + +export type PHANTOM_POVINFO = 'povinfo'; --- a/tests/src/interfaces/registry.ts +++ b/tests/src/interfaces/registry.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; -import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; +import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionValidityInvalidTransaction, SpRuntimeTransactionValidityTransactionValidityError, SpRuntimeTransactionValidityUnknownTransaction, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, UpPovEstimateRpcPovInfo, UpPovEstimateRpcTrieKeyValue, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; declare module '@polkadot/types/types/registry' { interface InterfaceTypes { @@ -198,6 +198,9 @@ SpRuntimeModuleError: SpRuntimeModuleError; SpRuntimeMultiSignature: SpRuntimeMultiSignature; SpRuntimeTokenError: SpRuntimeTokenError; + SpRuntimeTransactionValidityInvalidTransaction: SpRuntimeTransactionValidityInvalidTransaction; + SpRuntimeTransactionValidityTransactionValidityError: SpRuntimeTransactionValidityTransactionValidityError; + SpRuntimeTransactionValidityUnknownTransaction: SpRuntimeTransactionValidityUnknownTransaction; SpRuntimeTransactionalError: SpRuntimeTransactionalError; SpTrieStorageProof: SpTrieStorageProof; SpVersionRuntimeVersion: SpVersionRuntimeVersion; @@ -234,6 +237,8 @@ UpDataStructsSponsorshipStateBasicCrossAccountIdRepr: UpDataStructsSponsorshipStateBasicCrossAccountIdRepr; UpDataStructsTokenChild: UpDataStructsTokenChild; UpDataStructsTokenData: UpDataStructsTokenData; + UpPovEstimateRpcPovInfo: UpPovEstimateRpcPovInfo; + UpPovEstimateRpcTrieKeyValue: UpPovEstimateRpcTrieKeyValue; XcmDoubleEncoded: XcmDoubleEncoded; XcmV0Junction: XcmV0Junction; XcmV0JunctionBodyId: XcmV0JunctionBodyId; --- a/tests/src/interfaces/types-lookup.ts +++ b/tests/src/interfaces/types-lookup.ts @@ -3380,7 +3380,7 @@ } /** @name PhantomTypeUpDataStructs (399) */ - interface PhantomTypeUpDataStructs extends Vec> {} + interface PhantomTypeUpDataStructs extends Vec> {} /** @name UpDataStructsTokenData (401) */ interface UpDataStructsTokenData extends Struct { @@ -3462,7 +3462,57 @@ readonly nftId: u32; } - /** @name PalletCommonError (414) */ + /** @name UpPovEstimateRpcPovInfo (413) */ + interface UpPovEstimateRpcPovInfo extends Struct { + readonly proofSize: u64; + readonly compactProofSize: u64; + readonly compressedProofSize: u64; + readonly results: Vec, SpRuntimeTransactionValidityTransactionValidityError>>; + readonly keyValues: Vec; + } + + /** @name SpRuntimeTransactionValidityTransactionValidityError (416) */ + interface SpRuntimeTransactionValidityTransactionValidityError extends Enum { + readonly isInvalid: boolean; + readonly asInvalid: SpRuntimeTransactionValidityInvalidTransaction; + readonly isUnknown: boolean; + readonly asUnknown: SpRuntimeTransactionValidityUnknownTransaction; + readonly type: 'Invalid' | 'Unknown'; + } + + /** @name SpRuntimeTransactionValidityInvalidTransaction (417) */ + interface SpRuntimeTransactionValidityInvalidTransaction extends Enum { + readonly isCall: boolean; + readonly isPayment: boolean; + readonly isFuture: boolean; + readonly isStale: boolean; + readonly isBadProof: boolean; + readonly isAncientBirthBlock: boolean; + readonly isExhaustsResources: boolean; + readonly isCustom: boolean; + readonly asCustom: u8; + readonly isBadMandatory: boolean; + readonly isMandatoryValidation: boolean; + readonly isBadSigner: boolean; + readonly type: 'Call' | 'Payment' | 'Future' | 'Stale' | 'BadProof' | 'AncientBirthBlock' | 'ExhaustsResources' | 'Custom' | 'BadMandatory' | 'MandatoryValidation' | 'BadSigner'; + } + + /** @name SpRuntimeTransactionValidityUnknownTransaction (418) */ + interface SpRuntimeTransactionValidityUnknownTransaction extends Enum { + readonly isCannotLookup: boolean; + readonly isNoUnsignedValidator: boolean; + readonly isCustom: boolean; + readonly asCustom: u8; + readonly type: 'CannotLookup' | 'NoUnsignedValidator' | 'Custom'; + } + + /** @name UpPovEstimateRpcTrieKeyValue (420) */ + interface UpPovEstimateRpcTrieKeyValue extends Struct { + readonly key: Bytes; + readonly value: Bytes; + } + + /** @name PalletCommonError (422) */ interface PalletCommonError extends Enum { readonly isCollectionNotFound: boolean; readonly isMustBeTokenOwner: boolean; @@ -3503,7 +3553,7 @@ readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal' | 'ConfirmSponsorshipFail' | 'UserIsNotCollectionAdmin'; } - /** @name PalletFungibleError (416) */ + /** @name PalletFungibleError (424) */ interface PalletFungibleError extends Enum { readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isFungibleItemsHaveNoId: boolean; @@ -3515,7 +3565,7 @@ readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed' | 'SettingAllowanceForAllNotAllowed' | 'FungibleTokensAreAlwaysValid'; } - /** @name PalletRefungibleError (420) */ + /** @name PalletRefungibleError (428) */ interface PalletRefungibleError extends Enum { readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isWrongRefungiblePieces: boolean; @@ -3525,19 +3575,19 @@ readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed'; } - /** @name PalletNonfungibleItemData (421) */ + /** @name PalletNonfungibleItemData (429) */ interface PalletNonfungibleItemData extends Struct { readonly owner: PalletEvmAccountBasicCrossAccountIdRepr; } - /** @name UpDataStructsPropertyScope (423) */ + /** @name UpDataStructsPropertyScope (431) */ interface UpDataStructsPropertyScope extends Enum { readonly isNone: boolean; readonly isRmrk: boolean; readonly type: 'None' | 'Rmrk'; } - /** @name PalletNonfungibleError (426) */ + /** @name PalletNonfungibleError (434) */ interface PalletNonfungibleError extends Enum { readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isNonfungibleItemsHaveNoAmount: boolean; @@ -3545,7 +3595,7 @@ readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren'; } - /** @name PalletStructureError (427) */ + /** @name PalletStructureError (435) */ interface PalletStructureError extends Enum { readonly isOuroborosDetected: boolean; readonly isDepthLimit: boolean; @@ -3554,7 +3604,7 @@ readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound'; } - /** @name PalletRmrkCoreError (428) */ + /** @name PalletRmrkCoreError (436) */ interface PalletRmrkCoreError extends Enum { readonly isCorruptedCollectionType: boolean; readonly isRmrkPropertyKeyIsTooLong: boolean; @@ -3578,7 +3628,7 @@ readonly type: 'CorruptedCollectionType' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId'; } - /** @name PalletRmrkEquipError (430) */ + /** @name PalletRmrkEquipError (438) */ interface PalletRmrkEquipError extends Enum { readonly isPermissionError: boolean; readonly isNoAvailableBaseId: boolean; @@ -3590,7 +3640,7 @@ readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart'; } - /** @name PalletAppPromotionError (436) */ + /** @name PalletAppPromotionError (444) */ interface PalletAppPromotionError extends Enum { readonly isAdminNotSet: boolean; readonly isNoPermission: boolean; @@ -3601,7 +3651,7 @@ readonly type: 'AdminNotSet' | 'NoPermission' | 'NotSufficientFunds' | 'PendingForBlockOverflow' | 'SponsorNotSet' | 'IncorrectLockedBalanceOperation'; } - /** @name PalletForeignAssetsModuleError (437) */ + /** @name PalletForeignAssetsModuleError (445) */ interface PalletForeignAssetsModuleError extends Enum { readonly isBadLocation: boolean; readonly isMultiLocationExisted: boolean; @@ -3610,7 +3660,7 @@ readonly type: 'BadLocation' | 'MultiLocationExisted' | 'AssetIdNotExists' | 'AssetIdExisted'; } - /** @name PalletEvmError (439) */ + /** @name PalletEvmError (447) */ interface PalletEvmError extends Enum { readonly isBalanceLow: boolean; readonly isFeeOverflow: boolean; @@ -3626,7 +3676,7 @@ readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce' | 'GasLimitTooLow' | 'GasLimitTooHigh' | 'Undefined' | 'Reentrancy' | 'TransactionMustComeFromEOA'; } - /** @name FpRpcTransactionStatus (442) */ + /** @name FpRpcTransactionStatus (450) */ interface FpRpcTransactionStatus extends Struct { readonly transactionHash: H256; readonly transactionIndex: u32; @@ -3637,10 +3687,10 @@ readonly logsBloom: EthbloomBloom; } - /** @name EthbloomBloom (444) */ + /** @name EthbloomBloom (452) */ interface EthbloomBloom extends U8aFixed {} - /** @name EthereumReceiptReceiptV3 (446) */ + /** @name EthereumReceiptReceiptV3 (454) */ interface EthereumReceiptReceiptV3 extends Enum { readonly isLegacy: boolean; readonly asLegacy: EthereumReceiptEip658ReceiptData; @@ -3651,7 +3701,7 @@ readonly type: 'Legacy' | 'Eip2930' | 'Eip1559'; } - /** @name EthereumReceiptEip658ReceiptData (447) */ + /** @name EthereumReceiptEip658ReceiptData (455) */ interface EthereumReceiptEip658ReceiptData extends Struct { readonly statusCode: u8; readonly usedGas: U256; @@ -3659,14 +3709,14 @@ readonly logs: Vec; } - /** @name EthereumBlock (448) */ + /** @name EthereumBlock (456) */ interface EthereumBlock extends Struct { readonly header: EthereumHeader; readonly transactions: Vec; readonly ommers: Vec; } - /** @name EthereumHeader (449) */ + /** @name EthereumHeader (457) */ interface EthereumHeader extends Struct { readonly parentHash: H256; readonly ommersHash: H256; @@ -3685,24 +3735,24 @@ readonly nonce: EthereumTypesHashH64; } - /** @name EthereumTypesHashH64 (450) */ + /** @name EthereumTypesHashH64 (458) */ interface EthereumTypesHashH64 extends U8aFixed {} - /** @name PalletEthereumError (455) */ + /** @name PalletEthereumError (463) */ interface PalletEthereumError extends Enum { readonly isInvalidSignature: boolean; readonly isPreLogExists: boolean; readonly type: 'InvalidSignature' | 'PreLogExists'; } - /** @name PalletEvmCoderSubstrateError (456) */ + /** @name PalletEvmCoderSubstrateError (464) */ interface PalletEvmCoderSubstrateError extends Enum { readonly isOutOfGas: boolean; readonly isOutOfFund: boolean; readonly type: 'OutOfGas' | 'OutOfFund'; } - /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (457) */ + /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (465) */ interface UpDataStructsSponsorshipStateBasicCrossAccountIdRepr extends Enum { readonly isDisabled: boolean; readonly isUnconfirmed: boolean; @@ -3712,7 +3762,7 @@ readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed'; } - /** @name PalletEvmContractHelpersSponsoringModeT (458) */ + /** @name PalletEvmContractHelpersSponsoringModeT (466) */ interface PalletEvmContractHelpersSponsoringModeT extends Enum { readonly isDisabled: boolean; readonly isAllowlisted: boolean; @@ -3720,7 +3770,7 @@ readonly type: 'Disabled' | 'Allowlisted' | 'Generous'; } - /** @name PalletEvmContractHelpersError (464) */ + /** @name PalletEvmContractHelpersError (472) */ interface PalletEvmContractHelpersError extends Enum { readonly isNoPermission: boolean; readonly isNoPendingSponsor: boolean; @@ -3728,7 +3778,7 @@ readonly type: 'NoPermission' | 'NoPendingSponsor' | 'TooManyMethodsHaveSponsoredLimit'; } - /** @name PalletEvmMigrationError (465) */ + /** @name PalletEvmMigrationError (473) */ interface PalletEvmMigrationError extends Enum { readonly isAccountNotEmpty: boolean; readonly isAccountIsNotMigrating: boolean; @@ -3736,17 +3786,17 @@ readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating' | 'BadEvent'; } - /** @name PalletMaintenanceError (466) */ + /** @name PalletMaintenanceError (474) */ type PalletMaintenanceError = Null; - /** @name PalletTestUtilsError (467) */ + /** @name PalletTestUtilsError (475) */ interface PalletTestUtilsError extends Enum { readonly isTestPalletDisabled: boolean; readonly isTriggerRollback: boolean; readonly type: 'TestPalletDisabled' | 'TriggerRollback'; } - /** @name SpRuntimeMultiSignature (469) */ + /** @name SpRuntimeMultiSignature (477) */ interface SpRuntimeMultiSignature extends Enum { readonly isEd25519: boolean; readonly asEd25519: SpCoreEd25519Signature; @@ -3757,40 +3807,40 @@ readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name SpCoreEd25519Signature (470) */ + /** @name SpCoreEd25519Signature (478) */ interface SpCoreEd25519Signature extends U8aFixed {} - /** @name SpCoreSr25519Signature (472) */ + /** @name SpCoreSr25519Signature (480) */ interface SpCoreSr25519Signature extends U8aFixed {} - /** @name SpCoreEcdsaSignature (473) */ + /** @name SpCoreEcdsaSignature (481) */ interface SpCoreEcdsaSignature extends U8aFixed {} - /** @name FrameSystemExtensionsCheckSpecVersion (476) */ + /** @name FrameSystemExtensionsCheckSpecVersion (484) */ type FrameSystemExtensionsCheckSpecVersion = Null; - /** @name FrameSystemExtensionsCheckTxVersion (477) */ + /** @name FrameSystemExtensionsCheckTxVersion (485) */ type FrameSystemExtensionsCheckTxVersion = Null; - /** @name FrameSystemExtensionsCheckGenesis (478) */ + /** @name FrameSystemExtensionsCheckGenesis (486) */ type FrameSystemExtensionsCheckGenesis = Null; - /** @name FrameSystemExtensionsCheckNonce (481) */ + /** @name FrameSystemExtensionsCheckNonce (489) */ interface FrameSystemExtensionsCheckNonce extends Compact {} - /** @name FrameSystemExtensionsCheckWeight (482) */ + /** @name FrameSystemExtensionsCheckWeight (490) */ type FrameSystemExtensionsCheckWeight = Null; - /** @name OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance (483) */ + /** @name OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance (491) */ type OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance = Null; - /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (484) */ + /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (492) */ interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact {} - /** @name OpalRuntimeRuntime (485) */ + /** @name OpalRuntimeRuntime (493) */ type OpalRuntimeRuntime = Null; - /** @name PalletEthereumFakeTransactionFinalizer (486) */ + /** @name PalletEthereumFakeTransactionFinalizer (494) */ type PalletEthereumFakeTransactionFinalizer = Null; } // declare module --- a/tests/src/interfaces/types.ts +++ b/tests/src/interfaces/types.ts @@ -4,4 +4,5 @@ export * from './unique/types'; export * from './appPromotion/types'; export * from './rmrk/types'; +export * from './povinfo/types'; export * from './default/types'; --- a/tests/src/util/playgrounds/types.ts +++ b/tests/src/util/playgrounds/types.ts @@ -171,6 +171,14 @@ amount: bigint, } +export interface IPovInfo { + proofSize: number, + compactProofSize: number, + compressedProofSize: number, + results: any[], + kv: any, +} + export interface ISchedulerOptions { scheduledId?: string, priority?: number, --- a/tests/src/util/playgrounds/unique.dev.ts +++ b/tests/src/util/playgrounds/unique.dev.ts @@ -8,10 +8,11 @@ import * as defs from '../../interfaces/definitions'; import {IKeyringPair} from '@polkadot/types/types'; import {EventRecord} from '@polkadot/types/interfaces'; -import {ICrossAccountId, TSigner} from './types'; +import {ICrossAccountId, IPovInfo, TSigner} from './types'; import {FrameSystemEventRecord} from '@polkadot/types/lookup'; import {VoidFn} from '@polkadot/api/types'; import {Pallets} from '..'; +import {spawnSync} from 'child_process'; export class SilentLogger { log(_msg: any, _level: any): void { } @@ -98,6 +99,7 @@ rpc: { unique: defs.unique.rpc, appPromotion: defs.appPromotion.rpc, + povinfo: defs.povinfo.rpc, rmrk: defs.rmrk.rpc, eth: { feeHistory: { @@ -115,6 +117,7 @@ }); await this.api.isReadyOrError; this.network = await UniqueHelper.detectNetwork(this.api); + this.wsEndpoint = wsEndpoint; } } @@ -322,6 +325,38 @@ return balance; } + async calculatePoVInfo(txs: any[]): Promise { + const rawPovInfo = await this.helper.callRpc('api.rpc.povinfo.estimateExtrinsicPoV', [txs]); + + const kvJson: {[key: string]: string} = {}; + + for (const kv of rawPovInfo.keyValues) { + kvJson[kv.key.toHex()] = kv.value.toHex(); + } + + const kvStr = JSON.stringify(kvJson); + + const chainql = spawnSync( + 'chainql', + [ + `--tla-code=data=${kvStr}`, + '-e', `function(data) cql.dump(cql.chain("${this.helper.getEndpoint()}").latest._meta, data, {omit_empty:true})`, + ], + ); + + if (!chainql.stdout) { + throw Error('unable to get an output from the `chainql`'); + } + + return { + proofSize: rawPovInfo.proofSize.toNumber(), + compactProofSize: rawPovInfo.compactProofSize.toNumber(), + compressedProofSize: rawPovInfo.compressedProofSize.toNumber(), + results: rawPovInfo.results, + kv: JSON.parse(chainql.stdout.toString()), + }; + } + calculatePalletAddress(palletId: any) { const address = stringToU8a(('modl' + palletId).padEnd(32, '\0')); return encodeAddress(address, this.helper.chain.getChainProperties().ss58Format); --- a/tests/src/util/playgrounds/unique.ts +++ b/tests/src/util/playgrounds/unique.ts @@ -371,6 +371,7 @@ api: ApiPromise | null; forcedNetwork: TNetworks | null; network: TNetworks | null; + wsEndpoint: string | null; chainLog: IUniqueHelperLog[]; children: ChainHelperBase[]; address: AddressGroup; @@ -386,6 +387,7 @@ this.api = null; this.forcedNetwork = null; this.network = null; + this.wsEndpoint = null; this.chainLog = []; this.children = []; this.address = new AddressGroup(this); @@ -405,6 +407,11 @@ return newHelper; } + getEndpoint(): string { + if (this.wsEndpoint === null) throw Error('No connection was established'); + return this.wsEndpoint; + } + getApi(): ApiPromise { if(this.api === null) throw Error('API not initialized'); return this.api; @@ -436,6 +443,7 @@ async connect(wsEndpoint: string, listeners?: IApiListeners) { if (this.api !== null) throw Error('Already connected'); const {api, network} = await ChainHelperBase.createConnection(wsEndpoint, listeners, this.forcedNetwork); + this.wsEndpoint = wsEndpoint; this.api = api; this.network = network; } @@ -586,6 +594,20 @@ }); } + async signTransactionWithoutSending(signer: TSigner, tx: any) { + const api = this.getApi(); + const signingInfo = await api.derive.tx.signingInfo(signer.address); + + tx.sign(signer, { + blockHash: api.genesisHash, + genesisHash: api.genesisHash, + runtimeVersion: api.runtimeVersion, + nonce: signingInfo.nonce, + }); + + return tx.toHex(); + } + async getPaymentInfo(signer: TSigner, tx: any, len: number | null) { const api = this.getApi(); const signingInfo = await api.derive.tx.signingInfo(signer.address); -- gitstuff