diff --git a/Cargo.lock b/Cargo.lock index a53c25be..16e05230 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -698,8 +698,9 @@ dependencies = [ "borsh 0.10.3", "bytemuck", "derive_more", + "ibc-core-client-context", "ibc-core-commitment-types", - "ibc-proto 0.39.1", + "ibc-primitives", "insta", "lib", "prost", @@ -2056,7 +2057,7 @@ dependencies = [ "derive_more", "displaydoc", "ibc-core", - "ibc-proto 0.38.0", + "ibc-proto", "primitive-types", "serde", "uint", @@ -2102,7 +2103,7 @@ dependencies = [ "ibc-core-commitment-types", "ibc-core-host-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "tendermint", @@ -2166,7 +2167,7 @@ dependencies = [ "ibc-core-connection-types", "ibc-core-host-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "sha2 0.10.8", @@ -2220,7 +2221,7 @@ dependencies = [ "ibc-core-commitment-types", "ibc-core-host-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "subtle-encoding", @@ -2237,7 +2238,7 @@ dependencies = [ "derive_more", "displaydoc", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "ics23", "prost", "serde", @@ -2271,7 +2272,7 @@ dependencies = [ "ibc-core-commitment-types", "ibc-core-host-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "subtle-encoding", @@ -2310,7 +2311,7 @@ dependencies = [ "ibc-core-host-types", "ibc-core-router-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "subtle-encoding", @@ -2355,7 +2356,7 @@ dependencies = [ "ibc-core-handler-types", "ibc-core-host-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "sha2 0.10.8", @@ -2403,7 +2404,7 @@ dependencies = [ "displaydoc", "ibc-core-host-types", "ibc-primitives", - "ibc-proto 0.38.0", + "ibc-proto", "ics23", "prost", "serde", @@ -2432,7 +2433,7 @@ dependencies = [ "borsh 0.10.3", "derive_more", "displaydoc", - "ibc-proto 0.38.0", + "ibc-proto", "prost", "serde", "tendermint", @@ -2456,21 +2457,6 @@ dependencies = [ "tendermint-proto", ] -[[package]] -name = "ibc-proto" -version = "0.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8a8b1356652b9f160f5a010dd6b084675b8a28e163bf2b41ca5abecf27d9701" -dependencies = [ - "base64 0.21.5", - "bytes", - "flex-error", - "ics23", - "prost", - "subtle-encoding", - "tendermint-proto", -] - [[package]] name = "ibc-testkit" version = "0.48.2" @@ -2481,7 +2467,7 @@ dependencies = [ "derive_more", "displaydoc", "ibc", - "ibc-proto 0.38.0", + "ibc-proto", "parking_lot", "primitive-types", "prost", diff --git a/Cargo.toml b/Cargo.toml index 892f499e..b78aaeda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,11 +35,13 @@ derive_more = "0.99.17" hex-literal = "0.4.1" ibc = { version = "0.48.2", default-features = false, features = ["borsh", "serde"] } ibc-core-channel-types = { version = "0.48.2", default-features = false } +ibc-core-client-context = { version = "0.48.2", default-features = false } ibc-core-client-types = { version = "0.48.2", default-features = false } ibc-core-commitment-types = { version = "0.48.2", default-features = false } ibc-core-connection-types = { version = "0.48.2", default-features = false } ibc-core-host-types = { version = "0.48.2", default-features = false } -ibc-proto = { version = "0.39.1", default-features = false } +ibc-primitives = { version = "0.48.2", default-features = false } +ibc-proto = { version = "0.39.2", default-features = false } ibc-testkit = { version = "0.48.2", default-features = false } insta = { version = "1.34.0" } pretty_assertions = "1.4.0" diff --git a/common/blockchain/Cargo.toml b/common/blockchain/Cargo.toml index 9219178e..92af6120 100644 --- a/common/blockchain/Cargo.toml +++ b/common/blockchain/Cargo.toml @@ -8,8 +8,9 @@ edition = "2021" borsh.workspace = true bytemuck.workspace = true derive_more.workspace = true +ibc-core-client-context.workspace = true ibc-core-commitment-types.workspace = true -ibc-proto.workspace = true +ibc-primitives.workspace = true prost = { workspace = true, features = ["prost-derive"] } strum.workspace = true diff --git a/common/blockchain/src/ibc_state/consensus.rs b/common/blockchain/src/ibc_state/consensus.rs index 3965fdbd..61da751a 100644 --- a/common/blockchain/src/ibc_state/consensus.rs +++ b/common/blockchain/src/ibc_state/consensus.rs @@ -1,6 +1,6 @@ use core::num::NonZeroU64; -use ibc_proto::google::protobuf::Any; +use ibc_primitives::proto::Any; use lib::hash::CryptoHash; use prost::Message as _; @@ -17,9 +17,9 @@ pub struct ConsensusState { } impl ConsensusState { - /// Encodes the state into a vector as protocol buffer message. - pub fn encode_to_vec(&self) -> alloc::vec::Vec { - proto::ConsensusState::from(self).encode_to_vec() + pub fn new(block_hash: &CryptoHash, timestamp_ns: NonZeroU64) -> Self { + let block_hash = block_hash.as_array().to_vec().into(); + Self { block_hash, timestamp_ns } } /// Decodes the state from a protocol buffer message. @@ -28,13 +28,24 @@ impl ConsensusState { } } -impl ConsensusState { - pub fn new(block_hash: &CryptoHash, timestamp_ns: NonZeroU64) -> Self { - let block_hash = block_hash.as_array().to_vec().into(); - Self { block_hash, timestamp_ns } +impl ibc_core_client_context::consensus_state::ConsensusState + for ConsensusState +{ + fn root(&self) -> &ibc_core_commitment_types::commitment::CommitmentRoot { + &self.block_hash + } + + fn timestamp(&self) -> ibc_primitives::Timestamp { + ibc_primitives::Timestamp::from_nanoseconds(self.timestamp_ns.get()) + .unwrap() + } + + fn encode_vec(self) -> alloc::vec::Vec { + proto::ConsensusState::from(self).encode_to_vec() } } + impl From for proto::ConsensusState { fn from(state: ConsensusState) -> Self { Self { @@ -105,6 +116,11 @@ impl TryFrom<&Any> for ConsensusState { } } +impl ibc_primitives::proto::Protobuf + for ConsensusState +{ +} + #[test] fn test_consensus_state() { diff --git a/common/blockchain/src/proto.rs b/common/blockchain/src/proto.rs index 0f6638ae..7cd21534 100644 --- a/common/blockchain/src/proto.rs +++ b/common/blockchain/src/proto.rs @@ -1,4 +1,4 @@ -use ibc_proto::google::protobuf::Any; +use ibc_primitives::proto::Any; use prost::Message as _; mod pb { diff --git a/solana/solana-ibc/programs/solana-ibc/src/consensus_state.rs b/solana/solana-ibc/programs/solana-ibc/src/consensus_state.rs index 77c195a4..0a90d85e 100644 --- a/solana/solana-ibc/programs/solana-ibc/src/consensus_state.rs +++ b/solana/solana-ibc/programs/solana-ibc/src/consensus_state.rs @@ -1,15 +1,21 @@ use anchor_lang::prelude::borsh; use anchor_lang::prelude::borsh::maybestd::io; -use crate::ibc; -use crate::ibc::{ConsensusState, Protobuf}; - -#[derive(Clone, Debug, PartialEq, derive_more::From, derive_more::TryInto)] +use crate::ibc::Protobuf; + +#[derive( + Clone, + Debug, + PartialEq, + derive_more::From, + derive_more::TryInto, + crate::ibc::ConsensusState, +)] pub enum AnyConsensusState { - Tendermint(ibc::tm::ConsensusState), + Tendermint(crate::ibc::tm::ConsensusState), Guest(blockchain::ibc_state::ConsensusState), #[cfg(any(test, feature = "mocks"))] - Mock(ibc::mock::MockConsensusState), + Mock(crate::ibc::mock::MockConsensusState), } /// Discriminants used when borsh-encoding [`AnyConsensusState`]. @@ -39,13 +45,14 @@ impl AnyConsensusStateTag { impl AnyConsensusState { /// Protobuf type URL for Tendermint client state used in Any message. const TENDERMINT_TYPE: &'static str = - ibc::tm::TENDERMINT_CONSENSUS_STATE_TYPE_URL; + crate::ibc::tm::TENDERMINT_CONSENSUS_STATE_TYPE_URL; /// Protobuf type URL for Guest client state used in Any message. const GUEST_TYPE: &'static str = blockchain::proto::ConsensusState::TYPE_URL; #[cfg(any(test, feature = "mocks"))] /// Protobuf type URL for Mock client state used in Any message. - const MOCK_TYPE: &'static str = ibc::mock::MOCK_CONSENSUS_STATE_TYPE_URL; + const MOCK_TYPE: &'static str = + crate::ibc::mock::MOCK_CONSENSUS_STATE_TYPE_URL; /// Encodes the payload and returns discriminants that allow decoding the /// value later. @@ -64,18 +71,22 @@ impl AnyConsensusState { AnyConsensusState::Tendermint(state) => ( AnyConsensusStateTag::Tendermint, Self::TENDERMINT_TYPE, - Protobuf::::encode_vec(state), + Protobuf::::encode_vec(state), ), AnyConsensusState::Guest(state) => ( AnyConsensusStateTag::Guest, Self::GUEST_TYPE, - state.encode_to_vec(), + Protobuf::::encode_vec( + state, + ), ), #[cfg(any(test, feature = "mocks"))] AnyConsensusState::Mock(state) => ( AnyConsensusStateTag::Mock, Self::MOCK_TYPE, - Protobuf::::encode_vec(state), + Protobuf::::encode_vec( + state, + ), ), } } @@ -87,46 +98,46 @@ impl AnyConsensusState { ) -> Result { match tag { AnyConsensusStateTag::Tendermint => { - Protobuf::::decode_vec(&value) + Protobuf::::decode_vec(&value) .map_err(|err| err.to_string()) .map(Self::Tendermint) } - AnyConsensusStateTag::Guest => { - blockchain::ibc_state::ConsensusState::decode(&value) - .map_err(|err| err.to_string()) - .map(Self::Guest) - } + AnyConsensusStateTag::Guest => Protobuf::< + blockchain::proto::ConsensusState, + >::decode_vec(&value) + .map_err(|err| err.to_string()) + .map(Self::Guest), #[cfg(any(test, feature = "mocks"))] - AnyConsensusStateTag::Mock => { - Protobuf::::decode_vec(&value) - .map_err(|err| err.to_string()) - .map(Self::Mock) - } + AnyConsensusStateTag::Mock => Protobuf::< + crate::ibc::mock::ConsensusStatePB, + >::decode_vec(&value) + .map_err(|err| err.to_string()) + .map(Self::Mock), } } } -impl Protobuf for AnyConsensusState {} +impl Protobuf for AnyConsensusState {} -impl TryFrom for AnyConsensusState { - type Error = ibc::ClientError; +impl TryFrom for AnyConsensusState { + type Error = crate::ibc::ClientError; - fn try_from(value: ibc::Any) -> Result { + fn try_from(value: crate::ibc::Any) -> Result { let tag = AnyConsensusStateTag::from_type_url(value.type_url.as_str()) - .ok_or(ibc::ClientError::UnknownConsensusStateType { + .ok_or(crate::ibc::ClientError::UnknownConsensusStateType { consensus_state_type: value.type_url, })?; Self::from_tagged(tag, value.value).map_err(|description| { - ibc::ClientError::ClientSpecific { description } + crate::ibc::ClientError::ClientSpecific { description } }) } } -impl From for ibc::Any { +impl From for crate::ibc::Any { fn from(value: AnyConsensusState) -> Self { let (_, type_url, value) = value.into_any(); - ibc::Any { type_url: type_url.into(), value } + crate::ibc::Any { type_url: type_url.into(), value } } } @@ -152,37 +163,3 @@ impl borsh::BorshDeserialize for AnyConsensusState { .map_err(|msg| io::Error::new(io::ErrorKind::InvalidData, msg)) } } - -impl ConsensusState for AnyConsensusState { - fn root(&self) -> &ibc::CommitmentRoot { - match self { - AnyConsensusState::Tendermint(value) => value.root(), - AnyConsensusState::Guest(value) => &value.block_hash, - #[cfg(any(test, feature = "mocks"))] - AnyConsensusState::Mock(value) => value.root(), - } - } - - fn timestamp(&self) -> ibc::Timestamp { - match self { - AnyConsensusState::Tendermint(value) => value.timestamp().into(), - AnyConsensusState::Guest(value) => { - ibc::Timestamp::from_nanoseconds(value.timestamp_ns.get()) - .unwrap() - } - #[cfg(any(test, feature = "mocks"))] - AnyConsensusState::Mock(value) => value.timestamp(), - } - } - - fn encode_vec(self) -> Vec { - match self { - AnyConsensusState::Tendermint(value) => { - ConsensusState::encode_vec(value) - } - AnyConsensusState::Guest(value) => value.encode_to_vec(), - #[cfg(any(test, feature = "mocks"))] - AnyConsensusState::Mock(value) => ConsensusState::encode_vec(value), - } - } -}