diff --git a/core/src/ibc/client_02/manager.rs b/core/src/ibc/client_02/manager.rs index 9a84f1ca6b..9aa51ba79b 100644 --- a/core/src/ibc/client_02/manager.rs +++ b/core/src/ibc/client_02/manager.rs @@ -19,30 +19,28 @@ use super::types::{ConsensusState, State}; use crate::ibc; use ibc::client_02::get_state; -#[derive(Default)] -pub struct Manager {} +pub struct Manager<'a> { + ctx: &'a mut dyn ibc::Context, +} -impl Manager { - pub fn new() -> Self { - Manager {} +impl<'a> Manager<'a> { + pub fn new(ctx: &'a mut dyn ibc::Context) -> Self { + Manager { + ctx, + } } - pub fn create( - &self, - ctx: &mut dyn ibc::Context, - id: &str, - cs: &dyn ConsensusState, - ) -> Result, String> { - let state = new_state(id, ctx, cs.kind()); - if state.exists(ctx) { + pub fn create(&mut self, id: &str, cs: &dyn ConsensusState) -> Result, String> { + let state = new_state(id, self.ctx, cs.kind()); + if state.exists(self.ctx) { return Err("Create client on already existing id".to_owned()) } - state.set_root(ctx, cs.get_height(), cs.get_root()); - state.set_consensus_state(ctx, cs); + state.set_root(self.ctx, cs.get_height(), cs.get_root()); + state.set_consensus_state(self.ctx, cs); Ok(state) } - pub fn query(&self, ctx: &mut dyn ibc::Context, id: &str) -> Result, String> { - get_state(id, ctx) + pub fn query(&mut self, id: &str) -> Result, String> { + get_state(id, self.ctx) } } diff --git a/core/src/ibc/connection_03/manager.rs b/core/src/ibc/connection_03/manager.rs index cbc70b1a12..aba48beeec 100644 --- a/core/src/ibc/connection_03/manager.rs +++ b/core/src/ibc/connection_03/manager.rs @@ -21,29 +21,31 @@ use crate::ibc::connection_03::client_connections_path; use crate::ibc::connection_03::types::{ConnectionEnd, ConnectionIdentifiersInClient, ConnectionState}; use rlp::{Encodable, Rlp}; -#[derive(Default)] -pub struct Manager {} +pub struct Manager<'a> { + ctx: &'a mut dyn ibc::Context, +} // FIXME: this will be changed after implementing Vector commitment fn get_commiment_prefix() -> String { "".to_owned() } -impl Manager { - pub fn new() -> Self { - Manager {} +impl<'a> Manager<'a> { + pub fn new(ctx: &'a mut dyn ibc::Context) -> Self { + Manager { + ctx, + } } pub fn handle_open_init( - &self, - ctx: &mut dyn ibc::Context, + &mut self, identifier: Identifier, desired_counterparty_connection_identifier: Identifier, counterparty_prefix: CommitmentPrefix, client_identifier: Identifier, counterparty_client_identifier: Identifier, ) -> Result<(), String> { - let kv_store = ctx.get_kv_store(); + let kv_store = self.ctx.get_kv_store(); if kv_store.has(&connection_path(&identifier)) { return Err("Connection exist".to_owned()) } @@ -56,15 +58,14 @@ impl Manager { counterparty_client_identifier, }; kv_store.set(&connection_path(&identifier), &connection.rlp_bytes()); - self.add_connection_to_client(ctx, client_identifier, identifier)?; + self.add_connection_to_client(client_identifier, identifier)?; Ok(()) } // We all following ICS spec. #[allow(clippy::too_many_arguments)] pub fn handle_open_try( - &self, - ctx: &mut dyn ibc::Context, + &mut self, desired_identifier: Identifier, counterparty_connection_identifier: Identifier, counterparty_prefix: CommitmentPrefix, @@ -75,7 +76,7 @@ impl Manager { proof_height: u64, consensus_height: u64, ) -> Result<(), String> { - let current_height = ctx.get_current_height(); + let current_height = self.ctx.get_current_height(); if consensus_height > current_height { return Err(format!( "Consensus height {} is greater than current height {}", @@ -98,9 +99,9 @@ impl Manager { counterparty_client_identifier: counterparty_client_identifier.clone(), }; - self.verify_connection_state(ctx, &connection, proof_height, proof_init, desired_identifier.clone(), &expected); + self.verify_connection_state(&connection, proof_height, proof_init, desired_identifier.clone(), &expected); - if let Some(previous_connection_end) = self.query(ctx, &desired_identifier) { + if let Some(previous_connection_end) = self.query(&desired_identifier) { let expected_init = ConnectionEnd { state: ConnectionState::INIT, counterparty_connection_identifier, @@ -116,13 +117,13 @@ impl Manager { } } - let kv_store = ctx.get_kv_store(); + let kv_store = self.ctx.get_kv_store(); kv_store.set(&connection_path(&desired_identifier), &connection.rlp_bytes()); Ok(()) } - fn query(&self, ctx: &mut dyn ibc::Context, identifier: &str) -> Option { - let kv_store = ctx.get_kv_store(); + fn query(&mut self, identifier: &str) -> Option { + let kv_store = self.ctx.get_kv_store(); let path = connection_path(&identifier); if kv_store.has(&path) { @@ -135,8 +136,7 @@ impl Manager { } fn verify_connection_state( - &self, - ctx: &mut dyn ibc::Context, + &mut self, connection: &ConnectionEnd, proof_height: u64, proof: CommitmentProof, @@ -160,12 +160,11 @@ impl Manager { } fn add_connection_to_client( - &self, - ctx: &mut dyn ibc::Context, + &mut self, client_identifier: Identifier, connection_identifier: Identifier, ) -> Result<(), String> { - let kv_store = ctx.get_kv_store(); + let kv_store = self.ctx.get_kv_store(); if kv_store.has(&connection_path(&connection_identifier)) { return Err("Connection exist".to_owned()) } diff --git a/core/src/ibc/transaction_handler/mod.rs b/core/src/ibc/transaction_handler/mod.rs index 1e8128da3a..a48d2c0359 100644 --- a/core/src/ibc/transaction_handler/mod.rs +++ b/core/src/ibc/transaction_handler/mod.rs @@ -53,10 +53,9 @@ pub fn execute( client_identifier, counterparty_client_identifier, } => { - let connection_manager = ibc_connection::Manager::new(); + let mut connection_manager = ibc_connection::Manager::new(&mut context); connection_manager .handle_open_init( - &mut context, identifier, desired_counterparty_connection_identifier, counterparty_prefix, @@ -77,10 +76,9 @@ pub fn execute( consensus_height, } => { let mut context = ibc_context::TopLevelContext::new(state, current_block_number); - let connection_manager = ibc_connection::Manager::new(); + let mut connection_manager = ibc_connection::Manager::new(&mut context); connection_manager .handle_open_try( - &mut context, desired_identifier, counterparty_connection_identifier, counterparty_prefix, @@ -103,7 +101,7 @@ fn create_client( kind: ibc_client::Kind, consensus_state: &[u8], ) -> StateResult<()> { - let client_manager = ibc_client::Manager::new(); + let mut client_manager = ibc_client::Manager::new(ctx); if kind != ibc_client::KIND_FOUNDRY { return Err(RuntimeError::IBC(format!("CreateClient has invalid type {}", kind)).into()) } @@ -116,14 +114,14 @@ fn create_client( }; client_manager - .create(ctx, id, &foundry_consensus_state) + .create(id, &foundry_consensus_state) .map_err(|err| RuntimeError::IBC(format!("CreateClient: {:?}", err)))?; Ok(()) } fn update_client(ctx: &mut dyn ibc::Context, id: &str, header: &[u8]) -> StateResult<()> { - let client_manager = ibc_client::Manager::new(); - let client_state = client_manager.query(ctx, id).map_err(RuntimeError::IBC)?; + let mut client_manager = ibc_client::Manager::new(ctx); + let client_state = client_manager.query(id).map_err(RuntimeError::IBC)?; client_state.update(ctx, header).map_err(RuntimeError::IBC)?; diff --git a/rpc/src/v1/impls/ibc.rs b/rpc/src/v1/impls/ibc.rs index 03544834a4..bcd8159894 100644 --- a/rpc/src/v1/impls/ibc.rs +++ b/rpc/src/v1/impls/ibc.rs @@ -57,9 +57,8 @@ where }; let mut context = ibc::context::TopLevelContext::new(&mut state, block_number); - let client_manager = ibc::client::Manager::new(); - let client_state = - client_manager.query(&mut context, &client_id).map_err(|_| errors::ibc_client_not_exist())?; + let mut client_manager = ibc::client::Manager::new(&mut context); + let client_state = client_manager.query(&client_id).map_err(|_| errors::ibc_client_not_exist())?; let consensus_state = client_state.get_consensus_state(&mut context); @@ -97,9 +96,8 @@ where }; let mut context = ibc::context::TopLevelContext::new(&mut state, block_number); - let client_manager = ibc::client::Manager::new(); - let client_state = - client_manager.query(&mut context, &client_id).map_err(|_| errors::ibc_client_not_exist())?; + let mut client_manager = ibc::client::Manager::new(&mut context); + let client_state = client_manager.query(&client_id).map_err(|_| errors::ibc_client_not_exist())?; let root = client_state.get_root(&mut context, other_block_number).map_err(|_| errors::ibc_client_root_not_exist())?;