diff --git a/artifacts/checksums.txt b/artifacts/checksums.txt index ca4f4ef..7ce9097 100644 --- a/artifacts/checksums.txt +++ b/artifacts/checksums.txt @@ -1,11 +1,22 @@ +a1ef441857823ba4f78dfb8546e2aa0d1eb89ae2ea7f5bf03e6b4749415aaabd client_updater-aarch64.wasm c0190cf28da64b4058da71a9083c187d45f84ee7b9db11a0830025ecb0a687dc client_updater.wasm +7b498111f63e75fd889cb6b5d050fc76b49949ac32448f6142b30490c872eed5 echo-aarch64.wasm 4ee0b1e8a1c39e7a440f236778e76935f29506f354b6a59712d267181da77678 echo.wasm +f9323687ea56c83a064e1d1c846d80681e0f683be8ac3da1b937e696f36e6d23 ibc_transfer-aarch64.wasm fec7d4b6280569bd4ca428d1f5b52702a3378533f50362e1c3f1c848c4e91303 ibc_transfer.wasm +01b8a5d340cd35fb29f5147419e08f8a3beadf6432a767acd309864743138f5b msg_receiver-aarch64.wasm af52c56fb25355afa04d86c7d9e867f9db9295a455fb8a89f9cfdbd6374dd1ff msg_receiver.wasm -05e49fb2d0295c9a9e27a0077da856126f8285c2e949cb1f927f08fa8a867c8e neutron_interchain_queries.wasm -19d3ea0f4f0a24d202edbd2a7989dcffa61ba3d6754ff382cbd89d4ecd034a67 neutron_interchain_txs.wasm +4de9175518fe8a977a3d737ab9d24506d8d1091fab21d67a618235ec8e80bf09 neutron_interchain_queries-aarch64.wasm +318e67b0b20dab60d699c7b9f317c75a7faed1f0639a2f8113d8211e5e67fd56 neutron_interchain_queries.wasm +6107ec2613d79567e9c667604edab64b80f092f070b6205e4e6ab663ff3bc6a7 neutron_interchain_txs-aarch64.wasm +a4a791f2586120d0fdb1074917738aea3f12c4fbec97daab0d6002c6f0174a20 neutron_interchain_txs.wasm +39fe35203897b1f596b5b58e49c57561fd755b9528bebe4282af09b5e7e43a48 neutron_price_feed_mock-aarch64.wasm 344ec19c522cc5e6135a77a181345f02a0f65ef19ad919d5236dc16f53d33e76 neutron_price_feed_mock.wasm +d7eb170010a96f240ddb20f0a24384356f13e952a2b31713e4196f0ecdfaf23d neutron_validators_test-aarch64.wasm 4678704ef3ffd9f1240b719991dc629623929fa75499fd6ed9f76eda4c8a556a neutron_validators_test.wasm +56105ea5c68b9831e23f37022d75dbbcfba2d3d562df12749eb842bc9404ea80 reflect-aarch64.wasm c24970beb5a08bfc73dc422e63207342343802a329f28d527b4accaaf66209f8 reflect.wasm +fb0ba66fd51ea2fce885e97229df1eedf180f483c199f8db06f4475e39d642a6 stargate_querier-aarch64.wasm e3ab89e1d88381142c6a970daafceda3cb3fde6f8222e450834045d1f7c9f971 stargate_querier.wasm +f55ca14dc212f7e7477966e85d427c1f9e94c9146738e60960ea98728dd4dd82 tokenfactory-aarch64.wasm a9ee139212dca756adbde1e86723154b1fd79dc96cbc7e4885a851d8c978e946 tokenfactory.wasm diff --git a/artifacts/checksums_intermediate.txt b/artifacts/checksums_intermediate.txt index c96c774..ab000b4 100644 --- a/artifacts/checksums_intermediate.txt +++ b/artifacts/checksums_intermediate.txt @@ -1,11 +1,11 @@ +d89ba235e130977d1f79ac4d7f9252f6f6bed3002dfc1d08227ba138acec70b1 target/wasm32-unknown-unknown/release/client_updater.wasm a67c60c5853497b890d67dd2bfed1caf0984a03af01ec67c877e63688970814e target/wasm32-unknown-unknown/release/echo.wasm bebad52462ca1ddc557ae7ea3fc09aab0a11dd86497027a473f885bbe0c91d6c target/wasm32-unknown-unknown/release/ibc_transfer.wasm -b09e4f513e19e78b5ea08e10d26dc4d61056a4c6f534e783039f32494c39021b target/wasm32-unknown-unknown/release/neutron_interchain_queries.wasm -43c926644f096ba26d356c34f0f409b94b793d8398b1845e5fe03ffee7400e0c target/wasm32-unknown-unknown/release/neutron_interchain_txs.wasm +f1ec0aa2f9c84a8b0d63d877fb6dcaf2d25c30023740f3ef53072496124c7dce target/wasm32-unknown-unknown/release/msg_receiver.wasm +08936d05b855d169095ba9a1a7aa250813060c279c67aa2521856b7d3f233d99 target/wasm32-unknown-unknown/release/neutron_interchain_queries.wasm +aec49a8db7a72a832743dbcfbd194fec823359a1e92237388455b3d3ebd44e7c target/wasm32-unknown-unknown/release/neutron_interchain_txs.wasm e947d71ddeb4f6e61d756b48981bedae6973e0b25a9d873c3bba5e9878079d8b target/wasm32-unknown-unknown/release/neutron_price_feed_mock.wasm 8893279611c69a5ca55628f0476e943ca60b8900cb0ae17fefc2f38c4e472215 target/wasm32-unknown-unknown/release/neutron_validators_test.wasm b260fdda36208b9017f0f142821fa3bb47f3d3dea86901d687cf3d3da00946e0 target/wasm32-unknown-unknown/release/reflect.wasm -fc80abbf059bafa21b25162af22ddb963a1ea1c6ab4dd671855adb3e1f8a8a84 target/wasm32-unknown-unknown/release/tokenfactory.wasm -d89ba235e130977d1f79ac4d7f9252f6f6bed3002dfc1d08227ba138acec70b1 target/wasm32-unknown-unknown/release/client_updater.wasm -f1ec0aa2f9c84a8b0d63d877fb6dcaf2d25c30023740f3ef53072496124c7dce target/wasm32-unknown-unknown/release/msg_receiver.wasm 0cd5cb6ac3532b558fffa62d501936ccbe748cddf465746ad639ac3a166066ce target/wasm32-unknown-unknown/release/stargate_querier.wasm +fc80abbf059bafa21b25162af22ddb963a1ea1c6ab4dd671855adb3e1f8a8a84 target/wasm32-unknown-unknown/release/tokenfactory.wasm diff --git a/artifacts/neutron_interchain_queries.wasm b/artifacts/neutron_interchain_queries.wasm new file mode 100644 index 0000000..31affc3 Binary files /dev/null and b/artifacts/neutron_interchain_queries.wasm differ diff --git a/artifacts/neutron_interchain_txs.wasm b/artifacts/neutron_interchain_txs.wasm index 41472e8..731c4f4 100644 Binary files a/artifacts/neutron_interchain_txs.wasm and b/artifacts/neutron_interchain_txs.wasm differ diff --git a/artifacts/neutron_validators_test.wasm b/artifacts/neutron_validators_test.wasm new file mode 100644 index 0000000..63bdeba Binary files /dev/null and b/artifacts/neutron_validators_test.wasm differ diff --git a/artifacts/reflect.wasm b/artifacts/reflect.wasm new file mode 100644 index 0000000..b05368d Binary files /dev/null and b/artifacts/reflect.wasm differ diff --git a/contracts/neutron_interchain_queries/src/contract.rs b/contracts/neutron_interchain_queries/src/contract.rs index ddb2340..0a74a60 100644 --- a/contracts/neutron_interchain_queries/src/contract.rs +++ b/contracts/neutron_interchain_queries/src/contract.rs @@ -12,25 +12,27 @@ // See the License for the specific language governing permissions and // limitations under the License. +use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; +use cosmwasm_std::{ + entry_point, to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdError, StdResult, + SubMsg, +}; +use cw2::set_contract_version; +use prost::Message as ProstMessage; + use crate::integration_tests_mock_handlers::{set_query_mock, unset_query_mock}; use crate::msg::{ ExecuteMsg, GetRecipientTxsResponse, GetTransfersAmountResponse, InstantiateMsg, KvCallbackStatsResponse, MigrateMsg, QueryMsg, }; use crate::state::{ - IntegrationTestsQueryMock, Transfer, INTEGRATION_TESTS_QUERY_MOCK, KV_CALLBACK_STATS, - RECIPIENT_TXS, TRANSFERS, + IntegrationTestsQueryMock, QueryKind, Transfer, INTEGRATION_TESTS_QUERY_MOCK, + KV_CALLBACK_STATS, KV_QUERY_ID_TO_CALLBACKS, RECIPIENT_TXS, TRANSFERS, }; -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, -}; -use cw2::set_contract_version; use neutron_sdk::bindings::msg::NeutronMsg; use neutron_sdk::bindings::query::{NeutronQuery, QueryRegisteredQueryResponse}; use neutron_sdk::bindings::types::{Height, KVKey}; -use neutron_sdk::interchain_queries::get_registered_query; use neutron_sdk::interchain_queries::types::{ QueryPayload, TransactionFilterItem, TransactionFilterOp, TransactionFilterValue, }; @@ -38,16 +40,18 @@ use neutron_sdk::interchain_queries::v045::queries::{ query_balance, query_bank_total, query_delegations, query_distribution_fee_pool, query_government_proposals, query_staking_validators, }; -use neutron_sdk::interchain_queries::v045::types::{COSMOS_SDK_TRANSFER_MSG_URL, RECIPIENT_FIELD}; +use neutron_sdk::interchain_queries::v045::types::{ + Balances, COSMOS_SDK_TRANSFER_MSG_URL, RECIPIENT_FIELD, +}; use neutron_sdk::interchain_queries::v045::{ new_register_balance_query_msg, new_register_bank_total_supply_query_msg, new_register_delegator_delegations_query_msg, new_register_distribution_fee_pool_query_msg, new_register_gov_proposal_query_msg, new_register_staking_validators_query_msg, new_register_transfers_query_msg, }; +use neutron_sdk::interchain_queries::{get_registered_query, query_kv_result}; use neutron_sdk::sudo::msg::SudoMsg; use neutron_sdk::{NeutronError, NeutronResult}; -use prost::Message as ProstMessage; use serde_json_wasm; /// defines the incoming transfers limit to make a case of failed callback possible. @@ -57,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, @@ -120,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::IntegrationTestsSetQueryMock {} => set_query_mock(deps), ExecuteMsg::IntegrationTestsUnsetQueryMock {} => unset_query_mock(deps), ExecuteMsg::IntegrationTestsRegisterQueryEmptyId { connection_id } => { @@ -142,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( @@ -270,8 +278,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)) } @@ -499,8 +511,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 7ee5e9f..5c27472 100644 --- a/contracts/neutron_interchain_queries/src/state.rs +++ b/contracts/neutron_interchain_queries/src/state.rs @@ -27,3 +27,13 @@ pub enum IntegrationTestsQueryMock { } 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 +}