From f939cdec109411a2a253c3235cf62c90cbe1757f Mon Sep 17 00:00:00 2001 From: Michal Nazarewicz Date: Thu, 9 May 2024 20:01:41 +0200 Subject: [PATCH] Cleanup merge --- light-clients/cf-guest/src/client_def.rs | 2 +- light-clients/cf-guest/src/client_impls.rs | 363 ----------------- light-clients/ics07-guest-cw/Cargo.toml | 92 ----- light-clients/ics07-guest-cw/src/context.rs | 152 -------- light-clients/ics07-guest-cw/src/contract.rs | 287 -------------- light-clients/ics07-guest-cw/src/crypto.rs | 115 ------ light-clients/ics07-guest-cw/src/msg.rs | 375 ------------------ light-clients/icsxx-solana-cw/src/msg.rs | 387 ------------------- 8 files changed, 1 insertion(+), 1772 deletions(-) delete mode 100644 light-clients/cf-guest/src/client_impls.rs delete mode 100644 light-clients/ics07-guest-cw/Cargo.toml delete mode 100644 light-clients/ics07-guest-cw/src/context.rs delete mode 100644 light-clients/ics07-guest-cw/src/contract.rs delete mode 100644 light-clients/ics07-guest-cw/src/crypto.rs delete mode 100644 light-clients/ics07-guest-cw/src/msg.rs delete mode 100644 light-clients/icsxx-solana-cw/src/msg.rs diff --git a/light-clients/cf-guest/src/client_def.rs b/light-clients/cf-guest/src/client_def.rs index f2f001e8a..b4030bc2b 100644 --- a/light-clients/cf-guest/src/client_def.rs +++ b/light-clients/cf-guest/src/client_def.rs @@ -441,7 +441,7 @@ impl cf_guest_upstream::CommonContext ) -> NewResult { unimplemented!("delete_consensus_state_and_metadata") } - + fn earliest_consensus_state( &self, _client_id: &ibc_core_host_types::identifiers::ClientId, diff --git a/light-clients/cf-guest/src/client_impls.rs b/light-clients/cf-guest/src/client_impls.rs deleted file mode 100644 index a1fe79326..000000000 --- a/light-clients/cf-guest/src/client_impls.rs +++ /dev/null @@ -1,363 +0,0 @@ -use alloc::{string::ToString, vec::Vec}; - -use guestchain::PubKey; -use prost::DecodeError; - -use super::{proof, Any, ClientMessage, ClientState, ConsensusState, Header, Misbehaviour}; - -mod ibc { - // pub use ibc::core::ics02_client::client_state::{ - // ClientStateCommon, ClientStateExecution, ClientStateValidation, - // }; - pub use ibc::core::ics02_client::{ - client_state::Status, error::Error as ClientError, height::Height, - }; - // pub use ibc::core::ics02_client::context::{ - // ClientExecutionContext, ClientValidationContext, - // }; - pub use ibc::core::{ - ics23_commitment::{ - commitment::{CommitmentPrefix, CommitmentProofBytes, CommitmentRoot}, - error::Error as CommitmentError, - }, - ics24_host::{identifier::ClientId, path, Path::ClientType}, - }; - // pub use ibc::core::ics24_host::{ExecutionContext, ValidationContext}; - pub use ibc::timestamp::Timestamp; -} - -type Result = ::core::result::Result; - -pub trait CommonContext { - type ConversionError: ToString; - type AnyConsensusState: TryInto - + From; - - fn host_metadata(&self) -> Result<(ibc::Timestamp, ibc::Height)>; - - fn consensus_state( - &self, - client_id: &ibc::ClientId, - height: ibc::Height, - ) -> Result; - - fn store_consensus_state_and_metadata( - &mut self, - client_id: &ibc::ClientId, - height: ibc::Height, - consensus: Self::AnyConsensusState, - host_timestamp: ibc::Timestamp, - host_height: ibc::Height, - ) -> Result; - - fn delete_consensus_state_and_metadata( - &mut self, - client_id: &ibc::ClientId, - height: ibc::Height, - ) -> Result; - - fn sorted_consensus_state_heights(&self, client_id: &ibc::ClientId) - -> Result>; -} - -// impl ibc::ClientStateCommon for ClientState { -// fn verify_consensus_state(&self, consensus_state: Any) -> Result { -// ConsensusState::try_from(consensus_state)?; -// Ok(()) -// } - -// fn client_type(&self) -> ibc::ClientType { -// ibc::ClientType::new(super::CLIENT_TYPE).unwrap() -// } - -// fn latest_height(&self) -> ibc::Height { -// ibc::Height::new(0, self.latest_height.into()).unwrap() -// } - -// fn validate_proof_height(&self, proof_height: ibc::Height) -> Result { -// let latest_height = self.latest_height(); -// if proof_height <= latest_height { -// Ok(()) -// } else { -// Err(ibc::ClientError::InvalidProofHeight { -// latest_height, -// proof_height, -// }) -// } -// } - -// /// Panics since client upgrades aren’t supported. -// fn verify_upgrade_client( -// &self, -// _upgraded_client_state: Any, -// _upgraded_consensus_state: Any, -// _proof_upgrade_client: ibc::CommitmentProofBytes, -// _proof_upgrade_consensus_state: ibc::CommitmentProofBytes, -// _root: &ibc::CommitmentRoot, -// ) -> Result { unimplemented!("IBC cilent upgrades are currently not supported") -// } - -// /// Verifies membership proof. -// /// -// /// See [`proof::verify`] for documentation of the proof format. -// fn verify_membership( -// &self, -// prefix: &ibc::CommitmentPrefix, -// proof: &ibc::CommitmentProofBytes, -// root: &ibc::CommitmentRoot, -// path: ibc::path::Path, -// value: Vec, -// ) -> Result { let value = Some(value.as_slice()); proof::verify(prefix, proof, root, path, -// value).map_err(Into::into) -// } - -// /// Verifies membership proof. -// /// -// /// See [`proof::verify`] for documentation of the proof format. -// fn verify_non_membership( -// &self, -// prefix: &ibc::CommitmentPrefix, -// proof: &ibc::CommitmentProofBytes, -// root: &ibc::CommitmentRoot, -// path: ibc::path::Path, -// ) -> Result { proof::verify(prefix, proof, root, path, None).map_err(Into::into) -// } -// } - -impl From for ibc::ClientError { - fn from(err: proof::VerifyError) -> Self { - use ::ibc::core::ics23_commitment::error::Error; - use proof::VerifyError::*; - - Self::invalid_commitment_proof(match err { - ProofDecodingFailure(msg) => - Error::commitment_proof_decoding_failed(DecodeError::new(msg)), - WrongSequenceNumber(err) => Error::commitment_proof_decoding_failed(err), - _ => ibc::CommitmentError::invalid_merkle_proof(), - }) - } -} - -// impl ibc::ClientStateExecution for ClientState -// where -// E: ibc::ExecutionContext + ibc::ClientExecutionContext + CommonContext, -// ::AnyClientState: From>, -// ::AnyConsensusState: From, -// { -// fn initialise( -// &self, -// ctx: &mut E, -// client_id: &ibc::ClientId, -// consensus_state: Any, -// ) -> Result { parse_client_id(client_id)?; let consensus_state = -// super::ConsensusState::try_from(consensus_state)?; - -// ctx.store_client_state( -// ibc::path::ClientStatePath::new(client_id.clone()), -// self.clone().into(), -// )?; -// ctx.store_consensus_state( -// ibc::path::ClientConsensusStatePath::new( -// client_id.clone(), -// 0, -// u64::from(self.latest_height), -// ), -// consensus_state.into(), -// )?; - -// Ok(()) -// } - -// fn update_state( -// &self, -// ctx: &mut E, -// client_id: &ibc::ClientId, -// header: Any, -// ) -> Result> { let header = crate::proto::Header::try_from(header)?; let -// header = crate::Header::::try_from(header)?; let header_height = ibc::Height::new(0, -// header.block_header.block_height.into())?; - -// let (host_timestamp, host_height) = CommonContext::host_metadata(ctx)?; -// self.prune_oldest_consensus_state(ctx, client_id, host_timestamp)?; - -// let maybe_existing_consensus = -// CommonContext::consensus_state(ctx, client_id, header_height).ok(); -// if maybe_existing_consensus.is_none() { -// let new_consensus_state = ConsensusState::from(&header); -// let new_client_state = self.with_header(&header); - -// ctx.store_client_state( -// ibc::path::ClientStatePath::new(client_id.clone()), -// new_client_state.into(), -// )?; -// ctx.store_consensus_state_and_metadata( -// client_id, -// header_height, -// new_consensus_state.into(), -// host_timestamp, -// host_height, -// )?; -// } - -// Ok(alloc::vec![header_height]) -// } - -// fn update_state_on_misbehaviour( -// &self, -// ctx: &mut E, -// client_id: &ibc::ClientId, -// _client_message: Any, -// ) -> Result { ctx.store_client_state( ibc::path::ClientStatePath::new(client_id.clone()), -// self.frozen().into(), )?; Ok(()) -// } - -// fn update_state_on_upgrade( -// &self, -// _ctx: &mut E, -// _client_id: &ibc::ClientId, -// _upgraded_client_state: Any, -// _upgraded_consensus_state: Any, -// ) -> Result { Err(ibc::UpgradeClientError::Other { reason: "upgrade not -// supported".into(), } .into()) -// } -// } - -// impl ibc::ClientStateValidation for ClientState -// where -// V: ibc::ValidationContext -// + ibc::ClientValidationContext -// + CommonContext -// + guestchain::Verifier, -// { -// fn verify_client_message( -// &self, -// ctx: &V, -// client_id: &ibc::ClientId, -// client_message: Any, -// ) -> Result { self.verify_client_message(ctx, client_id, client_message) -// } - -// fn check_for_misbehaviour( -// &self, -// ctx: &V, -// client_id: &ibc::ClientId, -// client_message: Any, -// ) -> Result { self.check_for_misbehaviour(ctx, client_id, client_message) -// } - -// fn status( -// &self, -// ctx: &V, -// client_id: &ibc::ClientId, -// ) -> Result { if self.is_frozen { return Ok(ibc::Status::Frozen); } - -// let height = ibc::Height::new(0, self.latest_height.into())?; -// let consensus = CommonContext::consensus_state(ctx, client_id, height) -// .and_then(|state| state.try_into().map_err(error)); -// let consensus = match consensus { -// Ok(consensus) => consensus, -// Err(ibc::ClientError::ConsensusStateNotFound { .. }) => { -// return Ok(ibc::Status::Expired) -// } -// Err(err) => return Err(err), -// }; - -// let (host_timestamp, _height) = CommonContext::host_metadata(ctx)?; -// Ok(if self.consensus_has_expired(&consensus, host_timestamp) { -// ibc::Status::Expired -// } else { -// ibc::Status::Active -// }) -// } -// } - -impl ClientState { - pub fn verify_client_message( - &self, - ctx: &impl guestchain::Verifier, - _client_id: &ibc::ClientId, - client_message: ClientMessage, - ) -> Result<()> { - match client_message { - ClientMessage::Header(header) => self.verify_header(ctx, header), - ClientMessage::Misbehaviour(misbehaviour) => - self.verify_misbehaviour(ctx, misbehaviour), - } - } - - pub fn check_for_misbehaviour( - &self, - ctx: &impl guestchain::Verifier, - _client_id: &ibc::ClientId, - client_message: Any, - ) -> Result { - match ClientMessage::::try_from(client_message)? { - ClientMessage::Header(header) => self.check_for_misbehaviour_header(ctx, header), - ClientMessage::Misbehaviour(misbehaviour) => - self.check_for_misbehaviour_misbehavior(ctx, misbehaviour), - } - } - - fn verify_header(&self, ctx: &impl guestchain::Verifier, header: Header) -> Result<()> { - (|| { - // panic!("header epoch {:?} and client epoch {:?}", header.epoch_commitment, - // self.epoch_commitment); - if header.epoch_commitment != self.epoch_commitment { - return Err("Unexpected epoch") - } - let fp = guestchain::block::Fingerprint::from_hash( - &header.genesis_hash, - header.block_header.block_height, - &header.block_hash, - ); - let mut quorum_left = header.epoch.quorum_stake().get(); - let mut validators = - header.epoch.validators().iter().map(Some).collect::>>(); - for (idx, sig) in header.signatures { - let validator = validators - .get_mut(usize::from(idx)) - .ok_or("Validator index out of bounds")? - .take() - .ok_or("Duplicate signature")?; - if !ctx.verify(fp.as_slice(), &validator.pubkey, &sig) { - return Err("Bad signature") - } - quorum_left = quorum_left.saturating_sub(validator.stake.get()); - if quorum_left == 0 { - break - } - } - Ok(()) - // Err("Quorum not reached") - })() - .map_err(error) - } - - fn verify_misbehaviour( - &self, - _ctx: &impl guestchain::Verifier, - _misbehaviour: Misbehaviour, - ) -> Result<()> { - todo!() - } - - fn check_for_misbehaviour_header( - &self, - _ctx: &impl guestchain::Verifier, - _header: Header, - ) -> Result { - Ok(false) - } - - fn check_for_misbehaviour_misbehavior( - &self, - _ctx: &impl guestchain::Verifier, - _misbehaviour: Misbehaviour, - ) -> Result { - todo!() - } -} - -fn error(msg: impl ToString) -> ibc::ClientError { - ibc::ClientError::implementation_specific(msg.to_string()) -} diff --git a/light-clients/ics07-guest-cw/Cargo.toml b/light-clients/ics07-guest-cw/Cargo.toml deleted file mode 100644 index d11d2909c..000000000 --- a/light-clients/ics07-guest-cw/Cargo.toml +++ /dev/null @@ -1,92 +0,0 @@ -[package] -name = "ics07-guest-cw" -version = "0.1.0" -authors = ["Composable, Strangelove Developers"] -edition = "2021" - -exclude = [ - # Those files are rust-optimizer artifacts. You might want to commit them for convenience but they should not be part of the source code publication. - "contract.wasm", - "hash.txt", -] - -[lib] -crate-type = ["cdylib", "rlib"] - -[package.metadata.scripts] -optimize = """docker run --rm -v "$(pwd)":/code \ - --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ - --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.12.6 -""" - -[dependencies] -cosmwasm-schema = "1.1.3" -cosmwasm-std = "1.1.3" -schemars = "0.8.10" -serde = { version = "1.0.145", default-features = false, features = ["derive"] } -thiserror = { version = "1.0.31" } -sha2 = "0.10" -sha3 = "0.10" -derive_more = "0.99.17" - -# ed25519 = { version = "1.5", default-features = false } -# ed25519-consensus = { version = "2", optional = true, default-features = false } -ibc = { path = "../../ibc/modules", default-features = false } -ibc-derive = { path = "../../ibc/derive", default-features = false } -ibc-proto = { path = "../../ibc/proto", default-features = false, features = ["json-schema"] } -ics23 = { git = "https://github.com/cosmos/ics23", rev = "74ce807b7be39a7e0afb4e2efb8e28a57965f57b", default-features = false } -# ics07-tendermint = { path = "../ics07-tendermint", default-features = false } -cf-guest = { path = "../cf-guest", default-features = false } -ics08-wasm = { path = "../ics08-wasm", default-features = false, features = ["cosmwasm"] } -prost = { version = "0.11", default-features = false } -ed25519-dalek = { version = "2.1.1", default-features = false, features = ["pkcs8"] } -byteorder = { version = "1.3.2", default-features = false } -digest = { version = "0.10.3", default-features = false } -hex = "0.4.3" -guestchain = { git = "https://github.com/composableFi/emulated-light-client/" , default-features = false } -borsh = { version = "0.10.3", default-features = false } - - -#tendermint = { git = "https://github.com/informalsystems/tendermint-rs", rev = "e81f7bf23d63ffbcd242381d1ce5e35da3515ff1", default-features = false } # cannot be defined as optional in workspace -#tendermint-proto = { git = "https://github.com/informalsystems/tendermint-rs", rev = "e81f7bf23d63ffbcd242381d1ce5e35da3515ff1", default-features = false } -#tendermint-light-client-verifier = { git = "https://github.com/informalsystems/tendermint-rs", rev = "e81f7bf23d63ffbcd242381d1ce5e35da3515ff1", default-features = false } - -[dev-dependencies] -cw-multi-test = "0.15.1" -hex = "0.4.3" -hyperspace-primitives = { path = "../../hyperspace/primitives", features = ["testing"] } -pallet-ibc = { path = "../../contracts/pallet-ibc" } -serde-json-wasm = { version = "0.5.0", default-features = false } -serde_json = { version = "1.0.93", default-features = false } -# tendermint = { git = "https://github.com/informalsystems/tendermint-rs", rev = "e81f7bf23d63ffbcd242381d1ce5e35da3515ff1", default-features = false } - -[features] -# for more explicit tests, cargo test --features=backtraces -backtraces = ["cosmwasm-std/backtraces"] -# use library feature to disable all instantiate/execute/query exports -library = [] -default = [] -# default = ["rust-crypto"] -# rust-crypto = ["ed25519-consensus"] -std = [ - "byteorder/std", - "digest/std", - "ed25519-dalek/std", - "hex/std", - "ibc/std", - "ibc-proto/std", - # "ics07-tendermint/std", - "ics08-wasm/std", - "ics23/std", - "pallet-ibc/std", - "prost/std", - "serde/std", - "serde_json/std", - "sha2/std", - "sha3/std", - # "tendermint/std" -] -test = [ - "std" -] diff --git a/light-clients/ics07-guest-cw/src/context.rs b/light-clients/ics07-guest-cw/src/context.rs deleted file mode 100644 index b09159058..000000000 --- a/light-clients/ics07-guest-cw/src/context.rs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (C) 2022 ComposableFi. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - ics23::{ - ClientStates, ConsensusStates, ReadonlyClientStates, ReadonlyConsensusStates, - ReadonlyProcessedStates, - }, - ContractError, -}; -use cf_guest::{ClientState, ConsensusState}; -use cosmwasm_std::{DepsMut, Env, Storage}; -use ibc::{ - core::{ics02_client::error::Error, ics26_routing::context::ReaderContext}, - Height, -}; -use std::{fmt, fmt::Debug}; - -pub struct Context<'a> { - pub deps: DepsMut<'a>, - pub env: Env, -} - -impl<'a> PartialEq for Context<'a> { - fn eq(&self, _other: &Self) -> bool { - true - } -} - -impl<'a> Eq for Context<'a> {} - -impl<'a> Debug for Context<'a> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Context {{ deps: DepsMut }}") - } -} - -impl<'a> Clone for Context<'a> { - fn clone(&self) -> Self { - panic!("Context is not cloneable") - } -} - -impl<'a> Context<'a> { - pub fn new(deps: DepsMut<'a>, env: Env) -> Self { - Self { deps, env } - } - - pub fn log(&self, msg: &str) { - self.deps.api.debug(msg) - } - - pub fn storage(&self) -> &dyn Storage { - self.deps.storage - } - - pub fn storage_mut(&mut self) -> &mut dyn Storage { - self.deps.storage - } -} - -impl<'a> Context<'a> { - pub fn processed_timestamp(&self, height: Height) -> Result { - let processed_state = ReadonlyProcessedStates::new(self.storage()); - match processed_state.get_processed_time(height, &mut Vec::new()) { - Some(time) => Ok(time), - None => Err(Error::implementation_specific( - "problem getting processed timestamp".to_string(), - )), - } - } - - pub fn processed_height(&self, height: Height) -> Result { - let processed_state = ReadonlyProcessedStates::new(self.storage()); - match processed_state.get_processed_height(height, &mut Vec::new()) { - Some(p_height) => Ok(p_height), - None => - Err(Error::implementation_specific("problem getting processed height".to_string())), - } - } - - pub fn consensus_state_prefixed( - &self, - height: Height, - prefix: &[u8], - ) -> Result { - let bytes = ReadonlyConsensusStates::new(self.storage()) - .get_prefixed(height, prefix) - .ok_or_else(|| { - ContractError::Tendermint(format!( - "no consensus state found for height {height} and prefix {prefix:?}", - )) - })?; - Context::decode_consensus_state(&bytes).map_err(|e| { - ContractError::Tendermint(format!("error decoding consensus state: {e:?}")) - }) - } - - pub fn store_consensus_state_prefixed( - &mut self, - height: Height, - consensus_state: ConsensusState, - prefix: &[u8], - ) { - let encoded = Context::encode_consensus_state(consensus_state); - let mut consensus_states = ConsensusStates::new(self.storage_mut()); - consensus_states.insert_prefixed(height, encoded, prefix); - } - - pub fn client_state_prefixed( - &self, - prefix: &[u8], - ) -> Result, ContractError> { - let bytes = - ReadonlyClientStates::new(self.storage()).get_prefixed(prefix).ok_or_else(|| { - ContractError::Tendermint(format!("no client state found for prefix {prefix:?}",)) - })?; - Context::decode_client_state(&bytes) - .map_err(|e| ContractError::Tendermint(format!("error decoding client state: {e:?}"))) - } - - pub fn store_client_state_prefixed( - &mut self, - client_state: ClientState, - prefix: &[u8], - ) -> Result<(), ContractError> { - let client_states = ReadonlyClientStates::new(self.storage()); - let data = client_states.get_prefixed(prefix).ok_or_else(|| { - ContractError::Tendermint("no client state found for prefix".to_string()) - })?; - let encoded = Context::encode_client_state(client_state, data).map_err(|e| { - ContractError::Tendermint(format!("error encoding client state: {e:?}")) - })?; - let mut client_states = ClientStates::new(self.storage_mut()); - client_states.insert_prefixed(encoded, prefix); - Ok(()) - } -} - -impl<'a> ReaderContext for Context<'a> {} diff --git a/light-clients/ics07-guest-cw/src/contract.rs b/light-clients/ics07-guest-cw/src/contract.rs deleted file mode 100644 index f6c148964..000000000 --- a/light-clients/ics07-guest-cw/src/contract.rs +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright (C) 2022 ComposableFi. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - context::Context, - error::ContractError, - helpers::prune_oldest_consensus_state, - ics23::ReadonlyProcessedStates, - msg::{ - CheckForMisbehaviourMsg, ContractResult, ExecuteMsg, ExportMetadataMsg, InstantiateMsg, - QueryMsg, QueryResponse, StatusMsg, UpdateStateMsg, UpdateStateOnMisbehaviourMsg, - VerifyClientMessage, VerifyMembershipMsg, VerifyNonMembershipMsg, - VerifyUpgradeAndUpdateStateMsg, - }, - state::{get_client_state, get_consensus_state}, -}; -use cf_guest::{client_def::GuestClient, proof::verify}; -#[cfg(not(feature = "library"))] -use cosmwasm_std::entry_point; -use cosmwasm_std::{to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; -use ibc::core::{ - ics02_client::{ - client_consensus::ConsensusState as _, - client_def::{ClientDef, ConsensusUpdateResult}, - client_state::ClientState as _, - context::{ClientKeeper, ClientReader}, - }, - ics23_commitment::commitment::CommitmentPrefix, - ics24_host::identifier::ClientId, -}; -use ics08_wasm::SUBJECT_PREFIX; -use std::str::FromStr; - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn instantiate( - deps: DepsMut, - env: Env, - _info: MessageInfo, - _msg: InstantiateMsg, -) -> Result { - let _client = GuestClient::::default(); - let mut ctx = Context::new(deps, env); - let client_id = ClientId::from_str("08-wasm-0").expect("client id is valid"); - let client_state = ctx - .client_state(&client_id) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let latest_height = ibc::Height::new(1, client_state.latest_height.into()); - ctx.store_update_height(client_id.clone(), latest_height, ctx.host_height()) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - ctx.store_update_time(client_id, latest_height, ctx.host_timestamp()) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - - Ok(Response::default()) -} - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn execute( - deps: DepsMut, - env: Env, - _info: MessageInfo, - msg: ExecuteMsg, -) -> Result { - let client = GuestClient::::default(); - let mut ctx = Context::new(deps, env); - let client_id = ClientId::from_str("08-wasm-0").expect("client id is valid"); - let data = process_message(msg, client, &mut ctx, client_id)?; - let mut response = Response::default(); - response.data = Some(data); - Ok(response) -} - -fn process_message( - msg: ExecuteMsg, - client: GuestClient, - ctx: &mut Context, - client_id: ClientId, -) -> Result { - //log!(ctx, "process_message: {:?}", msg); - let result = match msg { - ExecuteMsg::VerifyMembership(msg) => { - let client_state = ctx - .client_state(&client_id) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let msg = VerifyMembershipMsg::try_from(msg)?; - // crate::helpers::verify_delay_passed( - // ctx, - // msg.height, - // msg.delay_time_period, - // msg.delay_block_period, - // ) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let consensus_state = ctx - .consensus_state(&client_id, msg.height) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // TODO(blas) - verify( - &CommitmentPrefix::default(), - &msg.proof, - &consensus_state.root(), - msg.path, - Some(msg.value.as_ref()), - ) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - Ok(()).map(|_| to_binary(&ContractResult::success())) - }, - ExecuteMsg::VerifyNonMembership(msg) => { - let client_state = ctx - .client_state(&client_id) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let msg = VerifyNonMembershipMsg::try_from(msg)?; - // crate::helpers::verify_delay_passed( - // ctx, - // msg.height, - // msg.delay_time_period, - // msg.delay_block_period, - // ) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let consensus_state = ctx - .consensus_state(&client_id, msg.height) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - - verify( - &CommitmentPrefix::default(), - &msg.proof, - &consensus_state.root(), - msg.path, - None, - ) - .map_err(|e| ContractError::Tendermint(e.to_string())) - .map(|_| to_binary(&ContractResult::success())) - }, - ExecuteMsg::VerifyClientMessage(msg) => { - let client_state = ctx - .client_state(&client_id) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let msg = VerifyClientMessage::try_from(msg)?; - client - .verify_client_message(ctx, client_id, client_state, msg.client_message) - .map_err(|e| ContractError::Tendermint(format!("{e:?}"))) - .map(|_| to_binary(&ContractResult::success())) - }, - ExecuteMsg::CheckForMisbehaviour(msg) => { - let client_state = ctx - .client_state(&client_id) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let msg = CheckForMisbehaviourMsg::try_from(msg)?; - client - .check_for_misbehaviour(ctx, client_id, client_state, msg.client_message) - .map_err(|e| ContractError::Tendermint(e.to_string())) - .map(|result| to_binary(&ContractResult::success().misbehaviour(result))) - }, - // ExecuteMsg::UpdateStateOnMisbehaviour(msg_raw) => { - // let client_state = ctx - // .client_state(&client_id) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // let msg = UpdateStateOnMisbehaviourMsg::try_from(msg_raw)?; - // client - // .update_state_on_misbehaviour(client_state, msg.client_message) - // .map_err(|e| ContractError::Tendermint(e.to_string())) - // .and_then(|cs| { - // ctx.store_client_state(client_id, cs) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // Ok(to_binary(&ContractResult::success())) - // }) - // }, - ExecuteMsg::UpdateState(msg_raw) => { - let client_state = ctx - .client_state(&client_id) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - let msg = UpdateStateMsg::try_from(msg_raw)?; - let latest_revision_height = client_state.latest_height().revision_height; - prune_oldest_consensus_state(ctx, &client_state, ctx.host_timestamp().nanoseconds()); - client - .update_state(ctx, client_id.clone(), client_state, msg.client_message) - .map_err(|e| ContractError::Tendermint(e.to_string())) - .and_then(|(cs, cu)| { - let height = cs.latest_height(); - match cu { - ConsensusUpdateResult::Single(cs) => { - ctx.store_consensus_state(client_id.clone(), height, cs) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - }, - ConsensusUpdateResult::Batch(css) => - for (height, cs) in css { - ctx.store_consensus_state(client_id.clone(), height, cs) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - }, - } - if u64::from(cs.latest_height) > latest_revision_height { - ctx.store_client_state(client_id, cs) - .map_err(|e| ContractError::Tendermint(e.to_string()))?; - } - Ok(to_binary(&ContractResult::success())) - }) - }, - // ExecuteMsg::CheckSubstituteAndUpdateState(_msg) => - // check_substitute_and_update_state::(ctx) - // .map_err(|e| ContractError::Tendermint(e.to_string())) - // .and_then(|(cs, cu)| { - // let height = cs.latest_height(); - // ctx.store_consensus_state_prefixed(height, cu, SUBJECT_PREFIX); - // ctx.store_client_state_prefixed(cs, SUBJECT_PREFIX) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // Ok(to_binary(&ContractResult::success())) - // }), - // ExecuteMsg::VerifyUpgradeAndUpdateState(msg) => { - // let old_client_state = ctx - // .client_state(&client_id) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // let msg: VerifyUpgradeAndUpdateStateMsg = - // VerifyUpgradeAndUpdateStateMsg::try_from(msg)?; - // verify_upgrade_and_update_state::( - // ctx, - // client_id.clone(), - // old_client_state, - // msg.upgrade_client_state, - // msg.upgrade_consensus_state, - // msg.proof_upgrade_client, - // msg.proof_upgrade_consensus_state, - // ) - // .map_err(|e| ContractError::Tendermint(e.to_string())) - // .and_then(|(cs, cu)| { - // let height = cs.latest_height(); - // ctx.store_consensus_state(client_id.clone(), height, cu) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // ctx.store_client_state(client_id, cs) - // .map_err(|e| ContractError::Tendermint(e.to_string()))?; - // Ok(to_binary(&ContractResult::success())) - // }) - // }, - _ => unimplemented!("none of the other messages are implemented at the moment"), - }; - Ok(result??) -} - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { - let client_id = ClientId::from_str("08-wasm-0").expect("client id is valid"); - //deps.api.debug("In query"); - match msg { - QueryMsg::ClientTypeMsg(_) => unimplemented!("ClientTypeMsg"), - QueryMsg::GetLatestHeightsMsg(_) => unimplemented!("GetLatestHeightsMsg"), - QueryMsg::ExportMetadata(ExportMetadataMsg {}) => { - let ro_proceeded_state = ReadonlyProcessedStates::new(deps.storage); - to_binary(&QueryResponse::genesis_metadata(ro_proceeded_state.get_metadata())) - }, - QueryMsg::Status(StatusMsg {}) => { - let client_state = match get_client_state::(deps) { - Ok(state) => state, - Err(_) => return to_binary(&QueryResponse::status("Unknown".to_string())), - }; - - if client_state.frozen_height().is_some() { - return to_binary(&QueryResponse::status("Frozen".to_string())); - } - - let height = client_state.latest_height; - let height = ibc::Height::new(1, height.into()); - let consensus_state = match get_consensus_state(deps, &client_id, height) { - Ok(state) => state, - Err(e) => panic!("This is error {:?}", e), /* return to_binary(& - * QueryResponse::status("Expired". - * to_string())), */ - }; - - let last_update = consensus_state.timestamp_ns.get(); - let trusting_period = client_state.trusting_period_ns; - let now = env.block.time.nanos(); - if last_update + trusting_period < now { - return to_binary(&QueryResponse::status("Expired".to_string())) - } - to_binary(&QueryResponse::status("Active".to_string())) - }, - } -} diff --git a/light-clients/ics07-guest-cw/src/crypto.rs b/light-clients/ics07-guest-cw/src/crypto.rs deleted file mode 100644 index 99e3098f0..000000000 --- a/light-clients/ics07-guest-cw/src/crypto.rs +++ /dev/null @@ -1,115 +0,0 @@ -use borsh::maybestd::io; - -/// Ed25519 public key (a.k.a. verifying key). -#[derive(Clone, Debug, Eq, Hash, PartialEq)] -#[repr(transparent)] -pub struct PubKey(ed25519_dalek::VerifyingKey); - -impl guestchain::PubKey for PubKey { - type Signature = Signature; - - fn to_vec(&self) -> Vec { - self.0.as_bytes().to_vec() - } - fn from_bytes(bytes: &[u8]) -> Result { - bytes.try_into().map(Self).map_err(|_| guestchain::BadFormat) - } - - fn as_bytes(&self) -> alloc::borrow::Cow<'_, [u8]> { - todo!() - } -} - -impl borsh::BorshSerialize for PubKey { - fn serialize(&self, wr: &mut W) -> io::Result<()> { - wr.write_all(self.0.as_bytes()) - } -} - -impl borsh::BorshDeserialize for PubKey { - fn deserialize_reader(rd: &mut R) -> io::Result { - let mut bytes = ed25519_dalek::pkcs8::PublicKeyBytes([0; 32]); - rd.read_exact(&mut bytes.0[..])?; - ed25519_dalek::VerifyingKey::try_from(bytes) - .map(Self) - .map_err(|_| io::Error::new(io::ErrorKind::Other, "malformed Ed25519 public key")) - } -} - -impl PartialOrd for PubKey { - fn partial_cmp(&self, rhs: &Self) -> Option { - Some(self.cmp(rhs)) - } -} - -impl Ord for PubKey { - fn cmp(&self, rhs: &Self) -> core::cmp::Ordering { - self.0.as_bytes().cmp(rhs.0.as_bytes()) - } -} - -/// Ed25519 signature. -#[derive(Clone, PartialEq, Eq, Debug)] -#[repr(transparent)] -pub struct Signature(ed25519_dalek::Signature); - -impl guestchain::Signature for Signature { - fn to_vec(&self) -> Vec { - self.0.to_vec() - } - fn from_bytes(bytes: &[u8]) -> Result { - ed25519_dalek::Signature::from_slice(bytes) - .map(Self) - .map_err(|_| guestchain::BadFormat) - } - - fn as_bytes(&self) -> alloc::borrow::Cow<'_, [u8]> { - todo!() - } -} - -impl borsh::BorshSerialize for Signature { - fn serialize(&self, wr: &mut W) -> io::Result<()> { - wr.write_all(self.0.r_bytes())?; - wr.write_all(self.0.s_bytes())?; - Ok(()) - } -} - -impl borsh::BorshDeserialize for Signature { - fn deserialize_reader(rd: &mut R) -> io::Result { - let mut buf = [0; 64]; - rd.read_exact(&mut buf[..])?; - Ok(Self(ed25519_dalek::Signature::from_bytes(&buf))) - } -} - -impl core::hash::Hash for Signature { - fn hash(&self, hasher: &mut H) { - hasher.write(self.0.r_bytes()); - hasher.write(self.0.s_bytes()); - } -} - -impl PartialOrd for Signature { - fn partial_cmp(&self, rhs: &Self) -> Option { - Some(self.cmp(rhs)) - } -} - -impl Ord for Signature { - fn cmp(&self, rhs: &Self) -> core::cmp::Ordering { - let lhs = (self.0.r_bytes(), self.0.s_bytes()); - let rhs = (rhs.0.r_bytes(), rhs.0.s_bytes()); - lhs.cmp(&rhs) - } -} - -/// Verifier for Ed25519 signatures using ed25519-dalek implementation. -pub(crate) struct Verifier; - -impl guestchain::Verifier for Verifier { - fn verify(&self, message: &[u8], pubkey: &PubKey, signature: &Signature) -> bool { - pubkey.0.verify_strict(message, &signature.0).is_ok() - } -} diff --git a/light-clients/ics07-guest-cw/src/msg.rs b/light-clients/ics07-guest-cw/src/msg.rs deleted file mode 100644 index 3421d426e..000000000 --- a/light-clients/ics07-guest-cw/src/msg.rs +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright (C) 2022 ComposableFi. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ics23::FakeInner, Bytes, ContractError}; -use core::{str::FromStr, time::Duration}; -use cosmwasm_schema::cw_serde; -use ibc::{ - core::{ - ics02_client::trust_threshold::TrustThreshold, - ics23_commitment::commitment::{CommitmentPrefix, CommitmentProofBytes}, - ics24_host::Path, - }, - protobuf::Protobuf, - Height, -}; -use ibc_proto::{google::protobuf::Any, ibc::core::client::v1::Height as HeightRaw}; - -use cf_guest::{ClientMessage, ClientState, Header, Misbehaviour}; - -use ics08_wasm::{ - client_message::Header as WasmHeader, client_state::ClientState as WasmClientState, - consensus_state::ConsensusState as WasmConsensusState, -}; -use prost::Message; -use serde::{Deserializer, Serializer}; - -struct Base64; - -impl Base64 { - pub fn serialize(v: &[u8], serializer: S) -> Result { - ibc_proto::base64::serialize(v, serializer) - } - - pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { - ibc_proto::base64::deserialize(deserializer) - } -} - -#[cw_serde] -pub struct GenesisMetadata { - pub key: Vec, - pub value: Vec, -} - -#[cw_serde] -pub struct QueryResponse { - pub status: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub genesis_metadata: Option>, -} - -impl QueryResponse { - pub fn status(status: String) -> Self { - Self { status, genesis_metadata: None } - } - - pub fn genesis_metadata(genesis_metadata: Option>) -> Self { - Self { status: "".to_string(), genesis_metadata } - } -} - -#[cw_serde] -pub struct ContractResult { - pub is_valid: bool, - pub error_msg: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub data: Option>, - pub found_misbehaviour: bool, -} - -impl ContractResult { - pub fn success() -> Self { - Self { is_valid: true, error_msg: "".to_string(), data: None, found_misbehaviour: false } - } - - pub fn error(msg: String) -> Self { - Self { is_valid: false, error_msg: msg, data: None, found_misbehaviour: false } - } - - pub fn misbehaviour(mut self, found: bool) -> Self { - self.found_misbehaviour = found; - self - } - - pub fn data(mut self, data: Vec) -> Self { - self.data = Some(data); - self - } -} - -#[cw_serde] -pub struct InstantiateMsg {} - -#[cw_serde] -pub enum ExecuteMsg { - VerifyMembership(VerifyMembershipMsgRaw), - VerifyNonMembership(VerifyNonMembershipMsgRaw), - VerifyClientMessage(VerifyClientMessageRaw), - CheckForMisbehaviour(CheckForMisbehaviourMsgRaw), - UpdateStateOnMisbehaviour(UpdateStateOnMisbehaviourMsgRaw), - UpdateState(UpdateStateMsgRaw), - CheckSubstituteAndUpdateState(CheckSubstituteAndUpdateStateMsg), - VerifyUpgradeAndUpdateState(VerifyUpgradeAndUpdateStateMsgRaw), -} - -#[cw_serde] -pub enum QueryMsg { - ClientTypeMsg(ClientTypeMsg), - GetLatestHeightsMsg(GetLatestHeightsMsg), - ExportMetadata(ExportMetadataMsg), - Status(StatusMsg), -} - -#[cw_serde] -pub struct ClientTypeMsg {} - -#[cw_serde] -pub struct GetLatestHeightsMsg {} - -#[cw_serde] -pub struct StatusMsg {} - -#[cw_serde] -pub struct ExportMetadataMsg {} - -#[cw_serde] -pub struct MerklePath { - pub key_path: Vec, -} - -#[cw_serde] -pub struct VerifyMembershipMsgRaw { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof: Bytes, - pub path: MerklePath, - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub value: Bytes, - pub height: HeightRaw, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -pub struct VerifyMembershipMsg { - pub prefix: CommitmentPrefix, - pub proof: CommitmentProofBytes, - pub path: Path, - pub value: Vec, - pub height: Height, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -impl TryFrom for VerifyMembershipMsg { - type Error = ContractError; - - fn try_from(mut raw: VerifyMembershipMsgRaw) -> Result { - let proof = CommitmentProofBytes::try_from(raw.proof)?; - let prefix = raw.path.key_path.remove(0).into_bytes(); - let path_str = raw.path.key_path.join(""); - let path = Path::from_str(&path_str)?; - let height = Height::from(raw.height); - Ok(Self { - proof, - path, - value: raw.value, - height, - prefix: CommitmentPrefix::try_from(prefix)?, - delay_block_period: raw.delay_block_period, - delay_time_period: raw.delay_time_period, - }) - } -} - -#[cw_serde] -pub struct VerifyNonMembershipMsgRaw { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof: Bytes, - pub path: MerklePath, - pub height: HeightRaw, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -pub struct VerifyNonMembershipMsg { - pub prefix: CommitmentPrefix, - pub proof: CommitmentProofBytes, - pub path: Path, - pub height: Height, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -impl TryFrom for VerifyNonMembershipMsg { - type Error = ContractError; - - fn try_from(mut raw: VerifyNonMembershipMsgRaw) -> Result { - let proof = CommitmentProofBytes::try_from(raw.proof)?; - let prefix = raw.path.key_path.remove(0).into_bytes(); - let path_str = raw.path.key_path.join(""); - let path = Path::from_str(&path_str)?; - let height = Height::from(raw.height); - Ok(Self { - proof, - path, - height, - prefix: CommitmentPrefix::try_from(prefix)?, - delay_block_period: raw.delay_block_period, - delay_time_period: raw.delay_time_period, - }) - } -} - -#[cw_serde] -pub struct WasmMisbehaviour { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub data: Bytes, -} - -#[cw_serde] -pub enum ClientMessageRaw { - Header(WasmHeader), - Misbehaviour(WasmMisbehaviour), -} - -#[cw_serde] -pub struct VerifyClientMessageRaw { - pub client_message: ClientMessageRaw, -} - -pub struct VerifyClientMessage { - pub client_message: ClientMessage, -} - -impl TryFrom for VerifyClientMessage { - type Error = ContractError; - - fn try_from(raw: VerifyClientMessageRaw) -> Result { - let client_message = Self::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -impl VerifyClientMessage { - fn decode_client_message( - raw: ClientMessageRaw, - ) -> Result, ContractError> { - let client_message = match raw { - ClientMessageRaw::Header(header) => { - let any = Any::decode(&mut header.data.as_slice())?; - ClientMessage::decode_vec(&any.value)? - }, - ClientMessageRaw::Misbehaviour(misbehaviour) => { - let any = Any::decode(&mut misbehaviour.data.as_slice())?; - ClientMessage::decode_vec(&any.value)? - }, - }; - Ok(client_message) - } -} - -#[cw_serde] -pub struct CheckForMisbehaviourMsgRaw { - pub client_message: ClientMessageRaw, -} - -pub struct CheckForMisbehaviourMsg { - pub client_message: ClientMessage, -} - -impl TryFrom for CheckForMisbehaviourMsg { - type Error = ContractError; - - fn try_from(raw: CheckForMisbehaviourMsgRaw) -> Result { - let client_message = VerifyClientMessage::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -#[cw_serde] -pub struct UpdateStateOnMisbehaviourMsgRaw { - pub client_message: ClientMessageRaw, -} - -pub struct UpdateStateOnMisbehaviourMsg { - pub client_message: ClientMessage, -} - -impl TryFrom for UpdateStateOnMisbehaviourMsg { - type Error = ContractError; - - fn try_from(raw: UpdateStateOnMisbehaviourMsgRaw) -> Result { - let client_message = VerifyClientMessage::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -#[cw_serde] -pub struct UpdateStateMsgRaw { - pub client_message: ClientMessageRaw, -} - -pub struct UpdateStateMsg { - pub client_message: ClientMessage, -} - -impl TryFrom for UpdateStateMsg { - type Error = ContractError; - - fn try_from(raw: UpdateStateMsgRaw) -> Result { - let client_message = VerifyClientMessage::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -#[cw_serde] -pub struct CheckSubstituteAndUpdateStateMsg {} - -#[cw_serde] -pub struct VerifyUpgradeAndUpdateStateMsgRaw { - pub upgrade_client_state: WasmClientState, - pub upgrade_consensus_state: WasmConsensusState, - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof_upgrade_client: Bytes, - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof_upgrade_consensus_state: Bytes, -} - -pub struct VerifyUpgradeAndUpdateStateMsg { - pub upgrade_client_state: WasmClientState, - pub upgrade_consensus_state: WasmConsensusState, - pub proof_upgrade_client: CommitmentProofBytes, - pub proof_upgrade_consensus_state: CommitmentProofBytes, -} - -impl TryFrom for VerifyUpgradeAndUpdateStateMsg { - type Error = ContractError; - - fn try_from(raw: VerifyUpgradeAndUpdateStateMsgRaw) -> Result { - let any = Any::decode(&mut raw.upgrade_client_state.data.as_slice())?; - let upgrade_client_state: ClientState = - ClientState::decode_vec(&any.value)?; - if upgrade_client_state.is_frozen { - return ibc::prelude::Err(ContractError::Tendermint( - "Upgrade client state not zeroed".to_string(), - )) - } - - Ok(VerifyUpgradeAndUpdateStateMsg { - upgrade_client_state: raw.upgrade_client_state, - upgrade_consensus_state: raw.upgrade_consensus_state, - proof_upgrade_client: CommitmentProofBytes::try_from(raw.proof_upgrade_client)?, - proof_upgrade_consensus_state: CommitmentProofBytes::try_from( - raw.proof_upgrade_consensus_state, - )?, - }) - } -} diff --git a/light-clients/icsxx-solana-cw/src/msg.rs b/light-clients/icsxx-solana-cw/src/msg.rs deleted file mode 100644 index fe5dcc814..000000000 --- a/light-clients/icsxx-solana-cw/src/msg.rs +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright (C) 2022 ComposableFi. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{contract::HostFunctions, ics23::FakeInner, Bytes, ContractError}; -use core::{str::FromStr, time::Duration}; -use cosmwasm_schema::cw_serde; -use ibc::{ - core::{ - ics02_client::trust_threshold::TrustThreshold, - ics23_commitment::commitment::{CommitmentPrefix, CommitmentProofBytes}, - ics24_host::Path, - }, - protobuf::Protobuf, - Height, -}; -use ibc_proto::{google::protobuf::Any, ibc::core::client::v1::Height as HeightRaw}; -use ics07_tendermint::{ - client_message::{ClientMessage, Header, Misbehaviour}, - client_state::ClientState, -}; -use ics08_wasm::{ - client_state::ClientState as WasmClientState, - consensus_state::ConsensusState as WasmConsensusState, -}; -use prost::Message; -use serde::{Deserializer, Serializer}; - -struct Base64; - -impl Base64 { - pub fn serialize(v: &[u8], serializer: S) -> Result { - ibc_proto::base64::serialize(v, serializer) - } - - pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { - ibc_proto::base64::deserialize(deserializer) - } -} - -#[cw_serde] -pub struct GenesisMetadata { - pub key: Vec, - pub value: Vec, -} - -#[cw_serde] -pub struct QueryResponse { - pub status: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub genesis_metadata: Option>, -} - -impl QueryResponse { - pub fn status(status: String) -> Self { - Self { status, genesis_metadata: None } - } - - pub fn genesis_metadata(genesis_metadata: Option>) -> Self { - Self { status: "".to_string(), genesis_metadata } - } -} - -#[cw_serde] -pub struct ContractResult { - pub is_valid: bool, - pub error_msg: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub data: Option>, - pub found_misbehaviour: bool, -} - -impl ContractResult { - pub fn success() -> Self { - Self { is_valid: true, error_msg: "".to_string(), data: None, found_misbehaviour: false } - } - - pub fn error(msg: String) -> Self { - Self { is_valid: false, error_msg: msg, data: None, found_misbehaviour: false } - } - - pub fn misbehaviour(mut self, found: bool) -> Self { - self.found_misbehaviour = found; - self - } - - pub fn data(mut self, data: Vec) -> Self { - self.data = Some(data); - self - } -} - -#[cw_serde] -pub struct InstantiateMsg {} - -#[cw_serde] -pub enum ExecuteMsg { - VerifyMembership(VerifyMembershipMsgRaw), - VerifyNonMembership(VerifyNonMembershipMsgRaw), - VerifyClientMessage(VerifyClientMessageRaw), - CheckForMisbehaviour(CheckForMisbehaviourMsgRaw), - UpdateStateOnMisbehaviour(UpdateStateOnMisbehaviourMsgRaw), - UpdateState(UpdateStateMsgRaw), - CheckSubstituteAndUpdateState(CheckSubstituteAndUpdateStateMsg), - VerifyUpgradeAndUpdateState(VerifyUpgradeAndUpdateStateMsgRaw), -} - -#[cw_serde] -pub enum QueryMsg { - ClientTypeMsg(ClientTypeMsg), - GetLatestHeightsMsg(GetLatestHeightsMsg), - ExportMetadata(ExportMetadataMsg), - Status(StatusMsg), -} - -#[cw_serde] -pub struct ClientTypeMsg {} - -#[cw_serde] -pub struct GetLatestHeightsMsg {} - -#[cw_serde] -pub struct StatusMsg {} - -#[cw_serde] -pub struct ExportMetadataMsg {} - -#[cw_serde] -pub struct MerklePath { - pub key_path: Vec, -} - -#[cw_serde] -pub struct VerifyMembershipMsgRaw { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof: Bytes, - pub path: MerklePath, - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub value: Bytes, - pub height: HeightRaw, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -pub struct VerifyMembershipMsg { - pub prefix: CommitmentPrefix, - pub proof: CommitmentProofBytes, - pub path: Path, - pub value: Vec, - pub height: Height, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -impl TryFrom for VerifyMembershipMsg { - type Error = ContractError; - - fn try_from(mut raw: VerifyMembershipMsgRaw) -> Result { - let proof = CommitmentProofBytes::try_from(raw.proof)?; - let prefix = raw.path.key_path.remove(0).into_bytes(); - let path_str = raw.path.key_path.join(""); - let path = Path::from_str(&path_str)?; - let height = Height::from(raw.height); - Ok(Self { - proof, - path, - value: raw.value, - height, - prefix: CommitmentPrefix::try_from(prefix)?, - delay_block_period: raw.delay_block_period, - delay_time_period: raw.delay_time_period, - }) - } -} - -#[cw_serde] -pub struct VerifyNonMembershipMsgRaw { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof: Bytes, - pub path: MerklePath, - pub height: HeightRaw, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -pub struct VerifyNonMembershipMsg { - pub prefix: CommitmentPrefix, - pub proof: CommitmentProofBytes, - pub path: Path, - pub height: Height, - pub delay_block_period: u64, - pub delay_time_period: u64, -} - -impl TryFrom for VerifyNonMembershipMsg { - type Error = ContractError; - - fn try_from(mut raw: VerifyNonMembershipMsgRaw) -> Result { - let proof = CommitmentProofBytes::try_from(raw.proof)?; - let prefix = raw.path.key_path.remove(0).into_bytes(); - let path_str = raw.path.key_path.join(""); - let path = Path::from_str(&path_str)?; - let height = Height::from(raw.height); - Ok(Self { - proof, - path, - height, - prefix: CommitmentPrefix::try_from(prefix)?, - delay_block_period: raw.delay_block_period, - delay_time_period: raw.delay_time_period, - }) - } -} - -#[cw_serde] -pub struct WasmMisbehaviour { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub data: Bytes, -} - -#[cw_serde] -pub struct WasmHeader { - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub data: Bytes, -} - -#[cw_serde] -pub enum ClientMessageRaw { - Header(WasmHeader), - Misbehaviour(WasmMisbehaviour), -} - -#[cw_serde] -pub struct VerifyClientMessageRaw { - pub client_message: ClientMessageRaw, -} - -pub struct VerifyClientMessage { - pub client_message: ClientMessage, -} - -impl TryFrom for VerifyClientMessage { - type Error = ContractError; - - fn try_from(raw: VerifyClientMessageRaw) -> Result { - let client_message = Self::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -impl VerifyClientMessage { - fn decode_client_message(raw: ClientMessageRaw) -> Result { - let client_message = match raw { - ClientMessageRaw::Header(header) => { - let any = Any::decode(&mut header.data.as_slice())?; - // panic!("This is any {:?}\n {:?}", any.type_url, any.value); - // ClientMessage::Header(Header::decode_vec(&any.value)?) - ClientMessage::decode_vec(&any.value)? - }, - ClientMessageRaw::Misbehaviour(misbehaviour) => { - let any = Any::decode(&mut misbehaviour.data.as_slice())?; - ClientMessage::Misbehaviour(Misbehaviour::decode_vec(&any.value)?) - }, - }; - Ok(client_message) - } -} - -#[cw_serde] -pub struct CheckForMisbehaviourMsgRaw { - pub client_message: ClientMessageRaw, -} - -pub struct CheckForMisbehaviourMsg { - pub client_message: ClientMessage, -} - -impl TryFrom for CheckForMisbehaviourMsg { - type Error = ContractError; - - fn try_from(raw: CheckForMisbehaviourMsgRaw) -> Result { - let client_message = VerifyClientMessage::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -#[cw_serde] -pub struct UpdateStateOnMisbehaviourMsgRaw { - pub client_message: ClientMessageRaw, -} - -pub struct UpdateStateOnMisbehaviourMsg { - pub client_message: ClientMessage, -} - -impl TryFrom for UpdateStateOnMisbehaviourMsg { - type Error = ContractError; - - fn try_from(raw: UpdateStateOnMisbehaviourMsgRaw) -> Result { - let client_message = VerifyClientMessage::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -#[cw_serde] -pub struct UpdateStateMsgRaw { - pub client_message: ClientMessageRaw, -} - -pub struct UpdateStateMsg { - pub client_message: ClientMessage, -} - -impl TryFrom for UpdateStateMsg { - type Error = ContractError; - - fn try_from(raw: UpdateStateMsgRaw) -> Result { - let client_message = VerifyClientMessage::decode_client_message(raw.client_message)?; - Ok(Self { client_message }) - } -} - -#[cw_serde] -pub struct CheckSubstituteAndUpdateStateMsg {} - -#[cw_serde] -pub struct VerifyUpgradeAndUpdateStateMsgRaw { - pub upgrade_client_state: WasmClientState, - pub upgrade_consensus_state: WasmConsensusState, - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof_upgrade_client: Bytes, - #[schemars(with = "String")] - #[serde(with = "Base64", default)] - pub proof_upgrade_consensus_state: Bytes, -} - -pub struct VerifyUpgradeAndUpdateStateMsg { - pub upgrade_client_state: WasmClientState, - pub upgrade_consensus_state: WasmConsensusState, - pub proof_upgrade_client: CommitmentProofBytes, - pub proof_upgrade_consensus_state: CommitmentProofBytes, -} - -impl TryFrom for VerifyUpgradeAndUpdateStateMsg { - type Error = ContractError; - - fn try_from(raw: VerifyUpgradeAndUpdateStateMsgRaw) -> Result { - let any = Any::decode(&mut raw.upgrade_client_state.data.as_slice())?; - let upgrade_client_state: ics07_tendermint::client_state::ClientState = - ClientState::decode_vec(&any.value)?; - if upgrade_client_state.trust_level != TrustThreshold::ZERO || - upgrade_client_state.trusting_period != Duration::ZERO || - upgrade_client_state.max_clock_drift != Duration::ZERO || - upgrade_client_state.frozen_height.is_some() - { - return ibc::prelude::Err(ContractError::Tendermint( - "Upgrade client state not zeroed".to_string(), - )) - } - - Ok(VerifyUpgradeAndUpdateStateMsg { - upgrade_client_state: raw.upgrade_client_state, - upgrade_consensus_state: raw.upgrade_consensus_state, - proof_upgrade_client: CommitmentProofBytes::try_from(raw.proof_upgrade_client)?, - proof_upgrade_consensus_state: CommitmentProofBytes::try_from( - raw.proof_upgrade_consensus_state, - )?, - }) - } -}