diff --git a/artifacts/checksums.txt b/artifacts/checksums.txt index e65ea49..e44b69c 100644 --- a/artifacts/checksums.txt +++ b/artifacts/checksums.txt @@ -1,5 +1,5 @@ 1c464063a6755ac10ee89452855bf4626f30a214feabae6ee527b4df6ce55170 ibc_transfer.wasm -b7ca3f944c6671f66ed05ca08a72f376471d0732747212cec0e9cceef87387a7 neutron_interchain_queries.wasm +cd6908306803b8014b806318021841bde16ecb4cb67815f581090d52bc788028 neutron_interchain_queries.wasm 0cbf5a6537c87379f79ce0c18b53ba9567ba8241fe45f875ff3485ca593467b5 neutron_interchain_txs.wasm 6ccbcad30bb8cef52ff5740d66882a7cb59c366dbd90b5c8f9c0bab0bdd9e0fe neutron_validators_test.wasm 070e30620d189da7a0fb21e4dc748c8d2d15f35ba0f6445a16eb9bc817c75d3a reflect.wasm diff --git a/artifacts/checksums_intermediate.txt b/artifacts/checksums_intermediate.txt index 4b3d562..ee6b37a 100644 --- a/artifacts/checksums_intermediate.txt +++ b/artifacts/checksums_intermediate.txt @@ -1,5 +1,5 @@ fb7325cf35d53aef1fd833cf5f43b4ef28bcc88b9c4e3de88e05e20b8625e846 target/wasm32-unknown-unknown/release/ibc_transfer.wasm -4a8d5ebde439bfecc3f24dac4b66eb5c6550285e15db83c505d14af696187bea target/wasm32-unknown-unknown/release/neutron_interchain_queries.wasm 6c57719e44d77487537d0b1f73dc54f1f7f8a2e8edaf28828ec66b7d5e8f7267 target/wasm32-unknown-unknown/release/neutron_interchain_txs.wasm 9e6864d11a044bb8a397b2d0183cd1d622ba0201573578f6841e64f722c9ba6e target/wasm32-unknown-unknown/release/neutron_validators_test.wasm 59ca165fcddee953b0479a484dfeb577fc2744305119b09e817cc33d06d7fb91 target/wasm32-unknown-unknown/release/reflect.wasm +102b78897339e6aeba2fd267dd5d50eeabd82a79bd22dbbdc70c47f8fcf6f1c6 target/wasm32-unknown-unknown/release/neutron_interchain_queries.wasm diff --git a/artifacts/neutron_interchain_queries.wasm b/artifacts/neutron_interchain_queries.wasm index 4c2e7c5..ef71aff 100644 Binary files a/artifacts/neutron_interchain_queries.wasm and b/artifacts/neutron_interchain_queries.wasm differ diff --git a/contracts/neutron_interchain_queries/src/contract.rs b/contracts/neutron_interchain_queries/src/contract.rs index 06063b4..55f272d 100644 --- a/contracts/neutron_interchain_queries/src/contract.rs +++ b/contracts/neutron_interchain_queries/src/contract.rs @@ -15,7 +15,8 @@ use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; use cosmos_sdk_proto::cosmos::tx::v1beta1::{TxBody, TxRaw}; use cosmwasm_std::{ - entry_point, to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdError, StdResult, + entry_point, to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdError, + StdResult, SubMsg, }; use cw2::set_contract_version; use neutron_sdk::interchain_queries::register_queries::new_register_interchain_query_msg; @@ -26,15 +27,16 @@ use crate::msg::{ KvCallbackStatsResponse, MigrateMsg, QueryMsg, }; use crate::state::{ - IntegrationTestsKvMock, Transfer, INTEGRATION_TESTS_KV_MOCK, KV_CALLBACK_STATS, RECIPIENT_TXS, - TRANSFERS, + IntegrationTestsKvMock, QueryKind, Transfer, INTEGRATION_TESTS_KV_MOCK, KV_CALLBACK_STATS, + KV_QUERY_ID_TO_CALLBACKS, RECIPIENT_TXS, TRANSFERS, }; -use neutron_sdk::bindings::msg::NeutronMsg; +use neutron_sdk::bindings::msg::{MsgRegisterInterchainQueryResponse, NeutronMsg}; use neutron_sdk::bindings::query::{InterchainQueries, QueryRegisteredQueryResponse}; use neutron_sdk::bindings::types::KVKey; use neutron_sdk::interchain_queries::queries::{ get_registered_query, query_balance, query_bank_total, query_delegations, - query_distribution_fee_pool, query_government_proposals, query_staking_validators, + query_distribution_fee_pool, query_government_proposals, query_kv_result, + query_staking_validators, }; use neutron_sdk::interchain_queries::{ new_register_balance_query_msg, new_register_bank_total_supply_query_msg, @@ -47,7 +49,7 @@ use neutron_sdk::{NeutronError, NeutronResult}; use crate::integration_tests_mock_handlers::{set_kv_query_mock, unset_kv_query_mock}; use neutron_sdk::interchain_queries::types::{ - QueryType, TransactionFilterItem, TransactionFilterOp, TransactionFilterValue, + Balances, QueryType, TransactionFilterItem, TransactionFilterOp, TransactionFilterValue, COSMOS_SDK_TRANSFER_MSG_URL, RECIPIENT_FIELD, }; use serde_json_wasm; @@ -59,6 +61,8 @@ const MAX_ALLOWED_MESSAGES: usize = 20; const CONTRACT_NAME: &str = concat!("crates.io:neutron-contracts__", env!("CARGO_PKG_NAME")); const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); +const BALANCES_REPLY_ID: u64 = 1; + #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( deps: DepsMut, @@ -122,7 +126,7 @@ pub fn execute( new_update_period, new_recipient, } => update_interchain_query(query_id, new_keys, new_update_period, new_recipient), - ExecuteMsg::RemoveInterchainQuery { query_id } => remove_interchain_query(query_id), + ExecuteMsg::RemoveInterchainQuery { query_id } => remove_interchain_query(deps, query_id), ExecuteMsg::IntegrationTestsSetKvQueryMock {} => set_kv_query_mock(deps), ExecuteMsg::IntegrationTestsUnsetKvQueryMock {} => unset_kv_query_mock(deps), ExecuteMsg::IntegrationTestsRegisterQueryEmptyId { connection_id } => { @@ -144,8 +148,10 @@ pub fn register_balance_query( update_period: u64, ) -> NeutronResult> { let msg = new_register_balance_query_msg(connection_id, addr, denom, update_period)?; + // wrap into submessage to save {query_id, query_type} on reply that'll later be used to handle sudo kv callback + let submsg = SubMsg::reply_on_success(msg, BALANCES_REPLY_ID); - Ok(Response::new().add_message(msg)) + Ok(Response::default().add_submessage(submsg)) } pub fn register_bank_total_supply_query( @@ -293,8 +299,12 @@ pub fn update_interchain_query( Ok(Response::new().add_message(update_msg)) } -pub fn remove_interchain_query(query_id: u64) -> NeutronResult> { +pub fn remove_interchain_query( + deps: DepsMut, + query_id: u64, +) -> NeutronResult> { let remove_msg = NeutronMsg::remove_interchain_query(query_id); + KV_QUERY_ID_TO_CALLBACKS.remove(deps.storage, query_id); Ok(Response::new().add_message(remove_msg)) } @@ -358,6 +368,37 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> StdResult StdResult { + deps.api + .debug(format!("WASMDEBUG: reply msg: {:?}", msg).as_str()); + match msg.id { + BALANCES_REPLY_ID => write_balance_query_id_to_reply_id(deps, msg), + _ => Err(StdError::generic_err(format!( + "unsupported reply message id {}", + msg.id + ))), + } +} + +fn write_balance_query_id_to_reply_id(deps: DepsMut, reply: Reply) -> StdResult { + let resp: MsgRegisterInterchainQueryResponse = serde_json_wasm::from_slice( + reply + .result + .into_result() + .map_err(StdError::generic_err)? + .data + .ok_or_else(|| StdError::generic_err("no result"))? + .as_slice(), + ) + .map_err(|e| StdError::generic_err(format!("failed to parse response: {:?}", e)))?; + + // then in success reply handler we do this + KV_QUERY_ID_TO_CALLBACKS.save(deps.storage, resp.id, &QueryKind::Balance)?; + + Ok(Response::default()) +} + #[entry_point] pub fn sudo(deps: DepsMut, env: Env, msg: SudoMsg) -> NeutronResult { match msg { @@ -517,8 +558,28 @@ pub fn sudo_kv_query_result( // store last KV callback update time KV_CALLBACK_STATS.save(deps.storage, query_id, &env.block.height)?; - // TODO: provide an actual example. Currently to many things are going to change - // after @pro0n00gler's PRs to implement this. - + let query_kind = KV_QUERY_ID_TO_CALLBACKS.may_load(deps.storage, query_id)?; + match query_kind { + Some(QueryKind::Balance) => { + let balances: Balances = query_kv_result(deps.as_ref(), query_id)?; + let balances_str = balances + .coins + .iter() + .map(|c| c.amount.to_string() + c.denom.as_str()) + .collect::>() + .join(", "); + deps.api + .debug(format!("WASMDEBUG: sudo callback; balances: {:?}", balances_str).as_str()); + } + None => { + deps.api.debug( + format!( + "WASMDEBUG: sudo callback without query kind assigned; query_id: {:?}", + query_id + ) + .as_str(), + ); + } + } Ok(Response::default()) } diff --git a/contracts/neutron_interchain_queries/src/state.rs b/contracts/neutron_interchain_queries/src/state.rs index 1fcd6b5..a25b7ec 100644 --- a/contracts/neutron_interchain_queries/src/state.rs +++ b/contracts/neutron_interchain_queries/src/state.rs @@ -27,3 +27,13 @@ pub enum IntegrationTestsKvMock { } pub const KV_CALLBACK_STATS: Map = Map::new("kv_callback_stats"); + +pub const KV_QUERY_ID_TO_CALLBACKS: Map = Map::new("kv_query_id_to_callbacks"); + +// contains query kinds that we expect to handle in `sudo_kv_query_result` +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub enum QueryKind { + // Balance query + Balance, + // You can add your handlers to understand what query to deserialize by query_id in sudo callback +} diff --git a/contracts/neutron_interchain_queries/src/testing/tests.rs b/contracts/neutron_interchain_queries/src/testing/tests.rs index 23c1e02..cc16e09 100644 --- a/contracts/neutron_interchain_queries/src/testing/tests.rs +++ b/contracts/neutron_interchain_queries/src/testing/tests.rs @@ -93,7 +93,7 @@ fn build_registered_query_response( } fn build_interchain_query_bank_total_denom_value(denom: String, amount: String) -> StorageValue { - let bank_total_key = create_total_denom_key(&denom).unwrap(); + let bank_total_key = create_total_denom_key(denom).unwrap(); let amount = amount.as_bytes().to_vec();