diff --git a/Cargo.lock b/Cargo.lock index 619ad55b00e..3b48a73aa1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5201,7 +5201,10 @@ version = "0.39.0" dependencies = [ "namada_core", "namada_macros", + "namada_state", "namada_storage", + "namada_tx", + "namada_vp", "thiserror", ] diff --git a/crates/parameters/Cargo.toml b/crates/parameters/Cargo.toml index 131f49118cf..07c41413e32 100644 --- a/crates/parameters/Cargo.toml +++ b/crates/parameters/Cargo.toml @@ -22,6 +22,9 @@ testing = [ [dependencies] namada_core = { path = "../core" } namada_macros = { path = "../macros" } +namada_state = { path = "../state" } namada_storage = { path = "../storage" } +namada_tx = { path = "../tx" } +namada_vp = { path = "../vp" } thiserror.workspace = true diff --git a/crates/parameters/src/lib.rs b/crates/parameters/src/lib.rs index 47d3c560fc4..28227ce43ad 100644 --- a/crates/parameters/src/lib.rs +++ b/crates/parameters/src/lib.rs @@ -18,6 +18,7 @@ )] pub mod storage; +pub mod vp; mod wasm_allowlist; use std::collections::BTreeMap; use std::marker::PhantomData; diff --git a/crates/parameters/src/vp.rs b/crates/parameters/src/vp.rs index 1529e7ca3fc..4b7c76af7d2 100644 --- a/crates/parameters/src/vp.rs +++ b/crates/parameters/src/vp.rs @@ -1,16 +1,20 @@ //! Native VP for protocol parameters use std::collections::BTreeSet; +use std::marker::PhantomData; use namada_core::address::Address; use namada_core::booleans::BoolResultUnitExt; +use namada_core::governance; use namada_core::storage::Key; -use namada_state::StateRead; +use namada_state::{StateRead, StorageError}; use namada_tx::BatchedTxRef; +use namada_vp::native_vp::{ + self, Ctx, CtxPreStorageRead, NativeVp, VpEvaluator, +}; use thiserror::Error; -use crate::ledger::native_vp::{self, Ctx, NativeVp}; -use crate::vm::WasmCacheAccess; +use crate::storage; #[allow(missing_docs)] #[derive(Error, Debug)] @@ -23,24 +27,31 @@ pub enum Error { pub type Result = std::result::Result; /// Parameters VP -pub struct ParametersVp<'a, S, CA> +pub struct ParametersVp<'a, S, CA, EVAL, Gov> where - S: StateRead, - CA: WasmCacheAccess, + S: 'static + StateRead, + EVAL: VpEvaluator<'a, S, CA, EVAL>, { /// Context to interact with the host structures. - pub ctx: Ctx<'a, S, CA>, + pub ctx: Ctx<'a, S, CA, EVAL>, + /// Governance type + pub gov: PhantomData, } -impl<'a, S, CA> NativeVp for ParametersVp<'a, S, CA> +impl<'a, S, CA, EVAL, Gov> NativeVp<'a> for ParametersVp<'a, S, CA, EVAL, Gov> where - S: StateRead, - CA: 'static + WasmCacheAccess, + S: 'static + StateRead, + CA: 'static + Clone, + EVAL: 'static + VpEvaluator<'a, S, CA, EVAL>, + Gov: governance::Read< + CtxPreStorageRead<'a, 'a, S, CA, EVAL>, + Err = StorageError, + >, { type Error = Error; fn validate_tx( - &self, + &'a self, batched_tx: &BatchedTxRef<'_>, keys_changed: &BTreeSet, _verifiers: &BTreeSet
, @@ -57,19 +68,17 @@ where }; match key_type { KeyType::PARAMETER | KeyType::UNKNOWN_PARAMETER => { - namada_governance::storage::is_proposal_accepted( - &self.ctx.pre(), - &data, - ) - .map_err(Error::NativeVpError)? - .ok_or_else(|| { - native_vp::Error::new_alloc(format!( - "Attempted to change a protocol parameter from \ - outside of a governance proposal, or from a \ - non-accepted governance proposal: {key}", - )) - .into() - }) + Gov::is_proposal_accepted(&self.ctx.pre(), &data) + .map_err(Error::NativeVpError)? + .ok_or_else(|| { + native_vp::Error::new_alloc(format!( + "Attempted to change a protocol parameter \ + from outside of a governance proposal, or \ + from a non-accepted governance proposal: \ + {key}", + )) + .into() + }) } KeyType::UNKNOWN => Ok(()), } @@ -90,9 +99,9 @@ enum KeyType { impl From<&Key> for KeyType { fn from(value: &Key) -> Self { - if namada_parameters::storage::is_protocol_parameter_key(value) { + if storage::is_protocol_parameter_key(value) { KeyType::PARAMETER - } else if namada_parameters::storage::is_parameter_key(value) { + } else if storage::is_parameter_key(value) { KeyType::UNKNOWN_PARAMETER } else { KeyType::UNKNOWN