Skip to content

Commit 502f07b

Browse files
committed
feat: add genesis export
1 parent 8252d66 commit 502f07b

File tree

3 files changed

+65
-11
lines changed

3 files changed

+65
-11
lines changed

contracts/cosmwasm-vm/cw-icon-light-client/src/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ impl<'a> IContext for CwContext<'a> {
153153
QueryHandler::get_processed_blocknumber_at_height(self.storage, client_id, height)
154154
}
155155

156-
fn ensure_ibc_host(&self, caller: cosmwasm_std::Addr) -> Result<(), ContractError> {
156+
fn ensure_ibc_host(&self, caller: &cosmwasm_std::Addr) -> Result<(), ContractError> {
157157
let config = self.get_config()?;
158158
if caller != config.ibc_host {
159159
return Err(ContractError::Unauthorized {});

contracts/cosmwasm-vm/cw-wasm-light-client/src/contract.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use cw_light_client_common::traits::IQueryHandler;
88
use crate::mock_client::MockClient;
99
use crate::query_handler::QueryHandler;
1010

11-
use common::icon::icon::types::v1::{MerkleNode, MerkleProofs, SignedHeader};
11+
use common::icon::icon::types::v1::{MerkleProofs, SignedHeader};
1212

1313
#[cfg(not(feature = "library"))]
1414
use cosmwasm_std::entry_point;
@@ -19,7 +19,7 @@ use cw_common::raw_types::Any;
1919

2020
use crate::context::CwContext;
2121
use crate::light_client::IconClient;
22-
use crate::msg::{ContractResult, ExecuteMsg, InstantiateMsg, QueryMsg};
22+
use crate::msg::{ContractResult, ExecuteMsg, InstantiateMsg, QueryMsg, QueryResponse};
2323
use crate::traits::{IContext, ILightClient};
2424
use crate::ContractError;
2525
use prost::Message;
@@ -71,9 +71,9 @@ fn process_message(
7171
let client_id = "08-wasm-0";
7272
let proofs_decoded =
7373
MerkleProofs::decode(msg.proof.as_slice()).map_err(ContractError::DecodeError)?;
74-
let path = hex::decode(&msg.path.key_path.join("")).unwrap();
74+
let path = hex::decode(msg.path.key_path.join("")).unwrap();
7575

76-
let ok = QueryHandler::verify_membership(
76+
let _ok = QueryHandler::verify_membership(
7777
deps_mut.as_ref(),
7878
client_id,
7979
height,
@@ -92,7 +92,7 @@ fn process_message(
9292
let client_id = "08-wasm-0";
9393
let proofs_decoded =
9494
MerkleProofs::decode(msg.proof.as_slice()).map_err(ContractError::DecodeError)?;
95-
let path = hex::decode(&msg.path.key_path.join("")).unwrap();
95+
let path = hex::decode(msg.path.key_path.join("")).unwrap();
9696

9797
let _ok = QueryHandler::verify_non_membership(
9898
deps_mut.as_ref(),
@@ -166,11 +166,15 @@ pub fn any_from_byte(bytes: &[u8]) -> Result<Any, ContractError> {
166166
}
167167

168168
#[cfg_attr(not(feature = "library"), entry_point)]
169-
pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<Binary> {
169+
pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<Binary> {
170+
let client_id = "08-wasm-0";
170171
match msg {
171172
QueryMsg::ClientTypeMsg(_) => todo!(),
172173
QueryMsg::GetLatestHeightsMsg(_) => todo!(),
173-
QueryMsg::ExportMetadata(_) => todo!(),
174+
QueryMsg::ExportMetadata(_) => {
175+
let res = QueryHandler::get_genesis_metadata(deps.storage, client_id);
176+
to_binary(&QueryResponse::genesis_metadata(Some(res)))
177+
}
174178
QueryMsg::Status(_) => todo!(),
175179
}
176180
}

contracts/cosmwasm-vm/cw-wasm-light-client/src/query_handler.rs

+53-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,61 @@
11
use common::ibc::Height;
2-
use cw_light_client_common::{traits::IQueryHandler, ContractError};
2+
use cosmwasm_std::{Order, StdResult};
3+
use cw_light_client_common::{constants::PROCESSED_HEIGHTS, traits::IQueryHandler, ContractError};
4+
use cw_storage_plus::Endian;
35

4-
use crate::utils::{
5-
decode_client_state, decode_consensus_state, get_client_state_key, get_consensus_state_key,
6+
use crate::{
7+
msg::GenesisMetadata,
8+
utils::{
9+
decode_client_state, decode_consensus_state, get_client_state_key, get_consensus_state_key,
10+
},
611
};
712

813
pub struct QueryHandler;
14+
15+
impl QueryHandler {
16+
pub fn processed_time_key(height: &Height, prefix: &mut Vec<u8>) -> Vec<u8> {
17+
prefix.append(&mut "consensusStates/".to_string().into_bytes());
18+
prefix.append(&mut format!("{height}").into_bytes());
19+
prefix.append(&mut "/processedTime".to_string().into_bytes());
20+
prefix.clone()
21+
}
22+
23+
pub fn processed_height_key(height: &Height, prefix: &mut Vec<u8>) -> Vec<u8> {
24+
prefix.append(&mut "consensusStates/".to_string().into_bytes());
25+
prefix.append(&mut format!("{height}").into_bytes());
26+
prefix.append(&mut "/processedHeight".to_string().into_bytes());
27+
prefix.clone()
28+
}
29+
pub fn get_genesis_metadata(
30+
storage: &dyn cosmwasm_std::Storage,
31+
client_id: &str,
32+
) -> Vec<GenesisMetadata> {
33+
let heights = PROCESSED_HEIGHTS
34+
.prefix(client_id.to_string())
35+
.keys(storage, None, None, Order::Ascending)
36+
.collect::<StdResult<Vec<u64>>>()
37+
.unwrap();
38+
let mut gm: Vec<GenesisMetadata> = Vec::<GenesisMetadata>::new();
39+
for h in heights {
40+
let processed_height =
41+
Self::get_processed_blocknumber_at_height(storage, client_id, h).unwrap();
42+
let processed_time = Self::get_processed_time_at_height(storage, client_id, h).unwrap();
43+
let ibc_height = Height::new(0, h).unwrap();
44+
let processed_height_key = Self::processed_height_key(&ibc_height, &mut Vec::new());
45+
let processed_time_key = Self::processed_time_key(&ibc_height, &mut Vec::new());
46+
gm.push(GenesisMetadata {
47+
key: processed_height_key.clone(),
48+
value: processed_height.to_be_bytes().to_vec(),
49+
});
50+
51+
gm.push(GenesisMetadata {
52+
key: processed_time_key.clone(),
53+
value: processed_time.to_be_bytes().to_vec(),
54+
});
55+
}
56+
gm
57+
}
58+
}
959
impl IQueryHandler for QueryHandler {
1060
fn get_client_state(
1161
storage: &dyn cosmwasm_std::Storage,

0 commit comments

Comments
 (0)