diff --git a/CHANGELOG.md b/CHANGELOG.md index 463a59daf..36a1745a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - feat: Wildcard in Permissions [(#949)](https://github.com/andromedaprotocol/andromeda-core/pull/949) - feat: Additional Permission Queries [(#960)](https://github.com/andromedaprotocol/andromeda-core/pull/960) - feat: Standardized events in ADOS [(#970)](https://github.com/andromedaprotocol/andromeda-core/pull/970) +- feat: Kernel queries for all chains and all channels [(#978)](https://github.com/andromedaprotocol/andromeda-core/pull/978) ### Changed diff --git a/Cargo.lock b/Cargo.lock index 2c1dd3425..e85926ac7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -607,7 +607,7 @@ dependencies = [ [[package]] name = "andromeda-kernel" -version = "1.2.5-b.3" +version = "1.2.5-b.4" dependencies = [ "andromeda-std", "base64 0.22.1", diff --git a/contracts/os/andromeda-kernel/Cargo.toml b/contracts/os/andromeda-kernel/Cargo.toml index 60724a391..5ac6a8cb5 100644 --- a/contracts/os/andromeda-kernel/Cargo.toml +++ b/contracts/os/andromeda-kernel/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "andromeda-kernel" -version = "1.2.5-b.3" +version = "1.2.5-b.4" authors = ["Connor Barr "] edition = "2021" rust-version = "1.65.0" diff --git a/contracts/os/andromeda-kernel/src/contract.rs b/contracts/os/andromeda-kernel/src/contract.rs index 3f8ea322b..8adce4c50 100644 --- a/contracts/os/andromeda-kernel/src/contract.rs +++ b/contracts/os/andromeda-kernel/src/contract.rs @@ -166,16 +166,20 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result encode_binary(&query::channel_info(deps, chain)?), QueryMsg::Recoveries { addr } => encode_binary(&query::recoveries(deps, addr)?), QueryMsg::ChainName {} => encode_binary(&query::chain_name(deps)?), - // Base queries - QueryMsg::Version {} => encode_binary(&ADOContract::default().query_version(deps)?), - QueryMsg::AdoType {} => encode_binary(&ADOContract::default().query_type(deps)?), - QueryMsg::Owner {} => encode_binary(&ADOContract::default().query_contract_owner(deps)?), QueryMsg::ChainNameByChannel { channel } => { encode_binary(&query::chain_name_by_channel(deps, channel)?) } + QueryMsg::ListChainsWithChannels { start_after, limit } => encode_binary( + &query::list_chains_with_channels(deps, start_after.as_deref(), limit)?, + ), QueryMsg::PendingPackets { channel_id } => { encode_binary(&query::pending_packets(deps, channel_id)?) } QueryMsg::GetEnv { variable } => encode_binary(&query::get_env(deps, variable)?), + + // Base queries + QueryMsg::Version {} => encode_binary(&ADOContract::default().query_version(deps)?), + QueryMsg::AdoType {} => encode_binary(&ADOContract::default().query_type(deps)?), + QueryMsg::Owner {} => encode_binary(&ADOContract::default().query_contract_owner(deps)?), } } diff --git a/contracts/os/andromeda-kernel/src/query.rs b/contracts/os/andromeda-kernel/src/query.rs index 6158b6834..d7978267a 100644 --- a/contracts/os/andromeda-kernel/src/query.rs +++ b/contracts/os/andromeda-kernel/src/query.rs @@ -4,12 +4,14 @@ use andromeda_std::{ os::{ aos_querier::AOSQuerier, kernel::{ - ChainNameResponse, ChannelInfoResponse, EnvResponse, PacketInfoAndSequence, - PendingPacketResponse, RecoveriesResponse, VerifyAddressResponse, + ChainChannelInfo, ChainNameResponse, ChannelInfoResponse, EnvResponse, + ListChainsWithChannelsResponse, PacketInfoAndSequence, PendingPacketResponse, + RecoveriesResponse, VerifyAddressResponse, }, }, }; -use cosmwasm_std::{Addr, Deps, Order}; +use cosmwasm_std::{Addr, Deps, Order, StdError}; +use cw_storage_plus::Bound; use crate::state::{ CHAIN_TO_CHANNEL, CHANNEL_TO_CHAIN, CHANNEL_TO_EXECUTE_MSG, CURR_CHAIN, ENV_VARIABLES, @@ -38,22 +40,19 @@ pub fn verify_address(deps: Deps, address: String) -> Result Result, ContractError> { - let info = CHAIN_TO_CHANNEL.may_load(deps.storage, &chain)?; - let resp = if let Some(info) = info { - Some(ChannelInfoResponse { - ics20: info.ics20_channel_id, - direct: info.direct_channel_id, - kernel_address: info.kernel_address, - supported_modules: info.supported_modules, - }) - } else { - None - }; - Ok(resp) +pub fn channel_info(deps: Deps, chain: String) -> Result { + let info = CHAIN_TO_CHANNEL + .may_load(deps.storage, &chain)? + .ok_or(ContractError::Std(StdError::generic_err(format!( + "Chain {} not found", + chain + ))))?; + Ok(ChannelInfoResponse { + ics20: info.ics20_channel_id, + direct: info.direct_channel_id, + kernel_address: info.kernel_address, + supported_modules: info.supported_modules, + }) } pub fn chain_name_by_channel(deps: Deps, channel: String) -> Result, ContractError> { @@ -107,3 +106,27 @@ pub fn get_env(deps: Deps, variable: String) -> Result, + limit: Option, +) -> Result { + let limit = limit.unwrap_or(50).min(100) as usize; + let start = start_after.map(Bound::exclusive); + + let chain_channel_info: Vec = CHAIN_TO_CHANNEL + .range(deps.storage, start, None, Order::Ascending) + .take(limit) + .filter_map(|item| item.ok()) + .map(|(chain, channel_info)| ChainChannelInfo { + chain, + ics20_channel_id: channel_info.ics20_channel_id, + direct_channel_id: channel_info.direct_channel_id, + kernel_address: channel_info.kernel_address, + supported_modules: channel_info.supported_modules, + }) + .collect(); + + Ok(ListChainsWithChannelsResponse { chain_channel_info }) +} diff --git a/packages/std/src/os/kernel.rs b/packages/std/src/os/kernel.rs index 7844d6747..0a8f2a1fc 100644 --- a/packages/std/src/os/kernel.rs +++ b/packages/std/src/os/kernel.rs @@ -162,7 +162,7 @@ pub enum QueryMsg { KeyAddress { key: String }, #[returns(VerifyAddressResponse)] VerifyAddress { address: String }, - #[returns(Option)] + #[returns(ChannelInfoResponse)] ChannelInfo { chain: String }, #[returns(Option)] ChainNameByChannel { channel: String }, @@ -182,6 +182,25 @@ pub enum QueryMsg { PendingPackets { channel_id: Option }, #[returns(EnvResponse)] GetEnv { variable: String }, + #[returns(ListChainsWithChannelsResponse)] + ListChainsWithChannels { + start_after: Option, + limit: Option, + }, +} + +#[cw_serde] +pub struct ChainChannelInfo { + pub chain: String, + pub ics20_channel_id: Option, + pub direct_channel_id: Option, + pub kernel_address: String, + pub supported_modules: Vec, +} + +#[cw_serde] +pub struct ListChainsWithChannelsResponse { + pub chain_channel_info: Vec, } #[cw_serde]