diff --git a/contracts/neutron_interchain_queries/schema/execute_msg.json b/contracts/neutron_interchain_queries/schema/execute_msg.json index 0e0d3302..4c8f57db 100644 --- a/contracts/neutron_interchain_queries/schema/execute_msg.json +++ b/contracts/neutron_interchain_queries/schema/execute_msg.json @@ -238,6 +238,40 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "register_wasm_contract_state_query" + ], + "properties": { + "register_wasm_contract_state_query": { + "type": "object", + "required": [ + "connection_id", + "contract_address", + "storage_key", + "update_period" + ], + "properties": { + "connection_id": { + "type": "string" + }, + "contract_address": { + "type": "string" + }, + "storage_key": { + "type": "string" + }, + "update_period": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ diff --git a/contracts/neutron_interchain_queries/schema/query_msg.json b/contracts/neutron_interchain_queries/schema/query_msg.json index 4b7f372c..6085028d 100644 --- a/contracts/neutron_interchain_queries/schema/query_msg.json +++ b/contracts/neutron_interchain_queries/schema/query_msg.json @@ -134,6 +134,28 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "get_wasm_contract_state" + ], + "properties": { + "get_wasm_contract_state": { + "type": "object", + "required": [ + "query_id" + ], + "properties": { + "query_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ diff --git a/contracts/neutron_interchain_queries/src/contract.rs b/contracts/neutron_interchain_queries/src/contract.rs index 6316d3cf..9f5b57e8 100644 --- a/contracts/neutron_interchain_queries/src/contract.rs +++ b/contracts/neutron_interchain_queries/src/contract.rs @@ -14,13 +14,15 @@ use neutron_sdk::bindings::types::{Height, KVKey}; use neutron_sdk::interchain_queries::get_registered_query; use neutron_sdk::interchain_queries::v045::queries::{ query_balance, query_bank_total, query_delegations, query_distribution_fee_pool, - query_government_proposals, query_staking_validators, + query_government_proposals, query_staking_validators, query_wasm_contract_state, }; 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, + register_queries::new_register_wasm_contract_store_query_msg, + types::{COSMOS_SDK_TRANSFER_MSG_URL, RECIPIENT_FIELD}, }; use neutron_sdk::sudo::msg::SudoMsg; use neutron_sdk::{NeutronError, NeutronResult}; @@ -28,7 +30,6 @@ use neutron_sdk::{NeutronError, NeutronResult}; use neutron_sdk::interchain_queries::types::{ TransactionFilterItem, TransactionFilterOp, TransactionFilterValue, }; -use neutron_sdk::interchain_queries::v045::types::{COSMOS_SDK_TRANSFER_MSG_URL, RECIPIENT_FIELD}; use serde_json_wasm; /// defines the incoming transfers limit to make a case of failed callback possible. @@ -95,6 +96,17 @@ pub fn execute( update_period, min_height, } => register_transfers_query(connection_id, recipient, update_period, min_height), + ExecuteMsg::RegisterWasmContractStateQuery { + connection_id, + update_period, + contract_address, + storage_key, + } => register_wasm_contract_state_query( + connection_id, + update_period, + contract_address, + storage_key, + ), ExecuteMsg::UpdateInterchainQuery { query_id, new_keys, @@ -183,6 +195,22 @@ pub fn register_transfers_query( Ok(Response::new().add_message(msg)) } +pub fn register_wasm_contract_state_query( + connection_id: String, + update_period: u64, + contract_address: String, + storage_key: String, +) -> NeutronResult> { + let msg = new_register_wasm_contract_store_query_msg( + connection_id, + contract_address, + storage_key, + update_period, + )?; + + Ok(Response::new().add_message(msg)) +} + pub fn update_interchain_query( query_id: u64, new_keys: Option>, @@ -227,6 +255,9 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> NeutronResult QueryMsg::GetDelegations { query_id } => { Ok(to_binary(&query_delegations(deps, env, query_id)?)?) } + QueryMsg::GetWasmContractState { query_id } => { + query_wasm_contract_state(deps, env, query_id) + } QueryMsg::GetRegisteredQuery { query_id } => { Ok(to_binary(&get_registered_query(deps, query_id)?)?) } diff --git a/contracts/neutron_interchain_queries/src/msg.rs b/contracts/neutron_interchain_queries/src/msg.rs index c33e6934..c8ebf5d6 100644 --- a/contracts/neutron_interchain_queries/src/msg.rs +++ b/contracts/neutron_interchain_queries/src/msg.rs @@ -46,6 +46,12 @@ pub enum ExecuteMsg { connection_id: String, update_period: u64, }, + RegisterWasmContractStateQuery { + connection_id: String, + update_period: u64, + contract_address: String, + storage_key: String, + }, UpdateInterchainQuery { query_id: u64, new_keys: Option>, @@ -66,6 +72,7 @@ pub enum QueryMsg { StakingValidators { query_id: u64 }, GovernmentProposals { query_id: u64 }, GetDelegations { query_id: u64 }, + GetWasmContractState { query_id: u64 }, GetRegisteredQuery { query_id: u64 }, GetRecipientTxs { recipient: String }, } diff --git a/packages/neutron-sdk/src/interchain_queries/queries.rs b/packages/neutron-sdk/src/interchain_queries/queries.rs index 902b4c37..c3bb9cdf 100644 --- a/packages/neutron-sdk/src/interchain_queries/queries.rs +++ b/packages/neutron-sdk/src/interchain_queries/queries.rs @@ -40,7 +40,7 @@ pub fn query_kv_result( } /// Queries interchain query result (raw KV storage values or transactions) from Interchain Queries Module -fn get_interchain_query_result( +pub fn get_interchain_query_result( deps: Deps, interchain_query_id: u64, ) -> NeutronResult { diff --git a/packages/neutron-sdk/src/interchain_queries/v045/helpers.rs b/packages/neutron-sdk/src/interchain_queries/v045/helpers.rs index 11a78328..0be273c1 100644 --- a/packages/neutron-sdk/src/interchain_queries/v045/helpers.rs +++ b/packages/neutron-sdk/src/interchain_queries/v045/helpers.rs @@ -2,7 +2,7 @@ use crate::errors::error::NeutronResult; use crate::interchain_queries::helpers::length_prefix; use crate::interchain_queries::v045::types::{ BALANCES_PREFIX, DELEGATION_KEY, FEE_POOL_KEY, PARAMS_STORE_DELIMITER, PROPOSALS_KEY_PREFIX, - SUPPLY_PREFIX, VALIDATORS_KEY, + SUPPLY_PREFIX, VALIDATORS_KEY, WASM_CONTRACT_STORE_PREFIX, }; use cosmos_sdk_proto::cosmos::staking::v1beta1::Commission as ValidatorCommission; use cosmwasm_std::{Binary, Decimal, Uint128}; @@ -93,6 +93,19 @@ pub fn create_validator_key>( Ok(key) } +/// Creates Cosmos-SDK distribution key for fee pool +/// +pub fn create_wasm_contract_store_key, Key: AsRef<[u8]>>( + contract_address: AddrBytes, + key: Key, +) -> NeutronResult> { + let mut prefix: Vec = vec![WASM_CONTRACT_STORE_PREFIX]; + prefix.extend_from_slice(contract_address.as_ref()); + prefix.extend_from_slice(key.as_ref()); + + Ok(prefix) +} + /// Creates Cosmos-SDK distribution key for fee pool /// pub fn create_fee_pool_key() -> NeutronResult> { diff --git a/packages/neutron-sdk/src/interchain_queries/v045/queries.rs b/packages/neutron-sdk/src/interchain_queries/v045/queries.rs index 40e2ec45..0af27ef3 100644 --- a/packages/neutron-sdk/src/interchain_queries/v045/queries.rs +++ b/packages/neutron-sdk/src/interchain_queries/v045/queries.rs @@ -1,11 +1,13 @@ use crate::bindings::query::NeutronQuery; -use crate::interchain_queries::queries::{check_query_type, get_registered_query, query_kv_result}; +use crate::interchain_queries::queries::{ + check_query_type, get_interchain_query_result, get_registered_query, query_kv_result, +}; use crate::interchain_queries::types::QueryType; use crate::interchain_queries::v045::types::{ Balances, Delegations, FeePool, GovernmentProposal, StakingValidator, TotalSupply, }; use crate::NeutronResult; -use cosmwasm_std::{Deps, Env}; +use cosmwasm_std::{Binary, Deps, Env, StdError}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -176,3 +178,24 @@ pub fn query_delegations( .last_submitted_result_local_height, }) } + +pub fn query_wasm_contract_state( + deps: Deps, + _env: Env, + registered_query_id: u64, +) -> NeutronResult { + let registered_query = get_registered_query(deps, registered_query_id)?; + + check_query_type(registered_query.registered_query.query_type, QueryType::KV)?; + + let mut response = get_interchain_query_result(deps, registered_query_id)?; + + // we expect exactly one storage value + let result = response + .result + .kv_results + .pop() + .ok_or_else(|| StdError::generic_err("empty query result"))?; + + Ok(result.value) +} diff --git a/packages/neutron-sdk/src/interchain_queries/v045/register_queries.rs b/packages/neutron-sdk/src/interchain_queries/v045/register_queries.rs index 7224e94c..8e68cf5b 100644 --- a/packages/neutron-sdk/src/interchain_queries/v045/register_queries.rs +++ b/packages/neutron-sdk/src/interchain_queries/v045/register_queries.rs @@ -3,7 +3,7 @@ use crate::interchain_queries::types::{ }; use crate::interchain_queries::v045::types::{ BANK_STORE_KEY, DISTRIBUTION_STORE_KEY, GOV_STORE_KEY, HEIGHT_FIELD, KEY_BOND_DENOM, - PARAMS_STORE_KEY, RECIPIENT_FIELD, STAKING_STORE_KEY, + PARAMS_STORE_KEY, RECIPIENT_FIELD, STAKING_STORE_KEY, WASM_STORE_KEY, }; use crate::{ bindings::{msg::NeutronMsg, types::KVKey}, @@ -12,7 +12,7 @@ use crate::{ interchain_queries::v045::helpers::{ create_account_denom_balance_key, create_delegation_key, create_fee_pool_key, create_gov_proposal_key, create_params_store_key, create_total_denom_key, - create_validator_key, + create_validator_key, create_wasm_contract_store_key, }, }; use cosmwasm_std::Binary; @@ -185,6 +185,33 @@ pub fn new_register_delegator_delegations_query_msg( NeutronMsg::register_interchain_query(QueryPayload::KV(keys), connection_id, update_period) } +/// Creates a message to register an Interchain Query to get wasm contract store on remote chain +/// from **wasm** module +/// +/// * **connection_id** is an IBC connection identifier between Neutron and remote chain; +/// * **key** is a wasm contract store key +/// * **update_period** is used to say how often the query must be updated. +pub fn new_register_wasm_contract_store_query_msg( + connection_id: String, + contract_address: String, + key: String, + update_period: u64, +) -> NeutronResult { + let converted_addr_bytes = decode_and_convert(contract_address.as_str())?; + let wasm_key = create_wasm_contract_store_key(converted_addr_bytes, key.as_bytes())?; + + let kv_key = KVKey { + path: WASM_STORE_KEY.to_string(), + key: Binary(wasm_key), + }; + + NeutronMsg::register_interchain_query( + QueryPayload::KV(vec![kv_key]), + connection_id, + update_period, + ) +} + /// Creates a message to register an Interchain Query to get transfer events to a recipient on a remote chain. /// /// * **connection_id** is an IBC connection identifier between Neutron and remote chain; diff --git a/packages/neutron-sdk/src/interchain_queries/v045/types.rs b/packages/neutron-sdk/src/interchain_queries/v045/types.rs index 569800e7..068fc919 100644 --- a/packages/neutron-sdk/src/interchain_queries/v045/types.rs +++ b/packages/neutron-sdk/src/interchain_queries/v045/types.rs @@ -50,6 +50,10 @@ pub const FEE_POOL_KEY: u8 = 0x00; /// pub const PROPOSALS_KEY_PREFIX: u8 = 0x00; +/// Key for Wasm Contract Store in the **wasm** module's storage +/// +pub const WASM_CONTRACT_STORE_PREFIX: u8 = 0x03; + /// Name of the standard **bank** Cosmos-SDK module pub const BANK_STORE_KEY: &str = "bank"; @@ -72,6 +76,9 @@ pub const PARAMS_STORE_KEY: &str = "params"; /// Default delimiter of **params** Cosmos-SDK module pub const PARAMS_STORE_DELIMITER: &str = "/"; +/// Name of the **wasm** Cosmos module +pub const WASM_STORE_KEY: &str = "wasm"; + pub const RECIPIENT_FIELD: &str = "transfer.recipient"; pub const HEIGHT_FIELD: &str = "tx.height"; diff --git a/scripts/test_icq_wasm_juno_testnet/.gitignore b/scripts/test_icq_wasm_juno_testnet/.gitignore new file mode 100644 index 00000000..34ff768e --- /dev/null +++ b/scripts/test_icq_wasm_juno_testnet/.gitignore @@ -0,0 +1 @@ +storage/ diff --git a/scripts/test_icq_wasm_juno_testnet/README.md b/scripts/test_icq_wasm_juno_testnet/README.md new file mode 100644 index 00000000..11868ead --- /dev/null +++ b/scripts/test_icq_wasm_juno_testnet/README.md @@ -0,0 +1,55 @@ +# Test ICQ wasm contract state using Juno testnet + +## 1. Install dependencies + +Read [instructions](https://docs.neutron.org/neutron/build-and-run/localnet) +and install: +- neutron +- hermes +- neutron query relayer + +## 2. Launch neutron + +Go to `neutron/` directory and run `make start`. +This will deploy Neutron localnet. +Please wait 20 to 30 seconds for chain to initialize before +proceeding to step 3. + +## 3. Connect to Juno testnet + +Open `create_juno_connection.sh` in your text editor of choice. +Navigate to `JUNO_MNEMONIC=""` and insert there your own testnet mnemonic. +Please make sure to have at least 0.01 JUNOX on uni-6 testnet, these funds +are needed to create a connection. + +Run `./create_juno_connection.sh`. After it finishes, `connection-0` should +appear on Neutron localnet. You can use this snippet to query a list of +connections on Neutron's localnet: + +```bash +neutrond query ibc connection connections --node tcp://0.0.0.0:26657 --output json | jq '.connections[] | {id, client_id, state, counterparty}' +``` + +If this is the first time you are running this script, you should only +see `connection-0`. Don't worry if you see `connection-1`, `connection-2` +and so on, simply use the last one you have created. + +## 4. Deploy ICQ relayer + +Open `icq.env` in your text editor of choice. +Navigate to `RELAYER_NEUTRON_CHAIN_CONNECTION_ID=` and insert there +connection ID you have just created. + +```bash +rm -rf storage/; export $(xargs < icq.env) && neutron_query_relayer start +``` + +## 5. Prepare to run test + +Open `test_wasm_query.sh` in your text editor of choice. +Navigate to `CONNECTION_ID=""` and insert there +connection ID you have just created. + +## 6. Run test + +Execute `./test_wasm_query.sh`. diff --git a/scripts/test_icq_wasm_juno_testnet/config.toml b/scripts/test_icq_wasm_juno_testnet/config.toml new file mode 100644 index 00000000..1c2d114b --- /dev/null +++ b/scripts/test_icq_wasm_juno_testnet/config.toml @@ -0,0 +1,74 @@ +[global] +log_level = 'trace' +[mode] + +[mode.clients] +enabled = true +refresh = true +misbehaviour = true + +[mode.connections] +enabled = true + +[mode.channels] +enabled = true + +[mode.packets] +enabled = true +clear_interval = 100 +clear_on_start = true +tx_confirmation = true + +[rest] +enabled = true +host = '127.0.0.1' +port = 3000 + +[telemetry] +enabled = false +host = '127.0.0.1' +port = 3001 + +[[chains]] +id = 'test-1' +rpc_addr = 'http://127.0.0.1:26657' +grpc_addr = 'http://127.0.0.1:8090' +websocket_addr = 'ws://127.0.0.1:26657/websocket' +rpc_timeout = '10s' +account_prefix = 'neutron' +key_name = 'testkey_1' +store_prefix = 'ibc' +default_gas = 100000 +max_gas = 3000000 +gas_price = { price = 0.0025, denom = 'untrn' } +gas_multiplier = 1.1 +max_msg_num = 30 +max_tx_size = 2097152 +clock_drift = '5s' +max_block_time = '10s' +trusting_period = '14days' +trust_threshold = { numerator = '1', denominator = '3' } +ccv_consumer_chain = true +address_type = { derivation = 'cosmos' } + +[[chains]] +id = 'uni-6' +rpc_addr = 'https://juno-testnet-rpc.polkachu.com' +grpc_addr = 'http://juno-testnet-grpc.polkachu.com:12690' +websocket_addr = 'wss://juno-testnet-rpc.polkachu.com/websocket' +rpc_timeout = '10s' +account_prefix = 'juno' +key_name = 'testkey_2' +store_prefix = 'ibc' +default_gas = 100000 +max_gas = 3000000 +gas_price = { price = 0.0025, denom = 'ujunox' } +gas_multiplier = 1.1 +max_msg_num = 30 +max_tx_size = 2097152 +clock_drift = '5s' +max_block_time = '10s' +trusting_period = '14days' +trust_threshold = { numerator = '1', denominator = '3' } +address_type = { derivation = 'cosmos' } + diff --git a/scripts/test_icq_wasm_juno_testnet/create_juno_connection.sh b/scripts/test_icq_wasm_juno_testnet/create_juno_connection.sh new file mode 100755 index 00000000..b11c76a8 --- /dev/null +++ b/scripts/test_icq_wasm_juno_testnet/create_juno_connection.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +# http://redsymbol.net/articles/unofficial-bash-strict-mode/ +set -euo pipefail +IFS=$'\n\t' + +HERMES_CONFIG="./config.toml" +NEUTRON_CHAIN_ID="test-1" +JUNO_CHAIN_ID="uni-6" + +NEUTRON_MNEMONIC="alley afraid soup fall idea toss can goose become valve initial strong forward bright dish figure check leopard decide warfare hub unusual join cart" +JUNO_MNEMONIC="ahead horn apart broom chapter pause culture defy original install critic common build act reunion frame shadow trick erode just average keen miss soda" + +for chain in "$NEUTRON_CHAIN_ID" "$JUNO_CHAIN_ID"; do + hermes --config "$HERMES_CONFIG" keys delete --chain "$chain" --all +done + +hermes --config "$HERMES_CONFIG" keys add \ + --key-name testkey_1 \ + --chain "$NEUTRON_CHAIN_ID" \ + --mnemonic-file <(echo "$NEUTRON_MNEMONIC") + +hermes --config "$HERMES_CONFIG" keys add \ + --key-name testkey_2 \ + --chain "$JUNO_CHAIN_ID" \ + --mnemonic-file <(echo "$JUNO_MNEMONIC") + +hermes --config "$HERMES_CONFIG" create connection \ + --a-chain "$NEUTRON_CHAIN_ID" \ + --b-chain "$JUNO_CHAIN_ID" diff --git a/scripts/test_icq_wasm_juno_testnet/icq.env b/scripts/test_icq_wasm_juno_testnet/icq.env new file mode 100644 index 00000000..5b76c160 --- /dev/null +++ b/scripts/test_icq_wasm_juno_testnet/icq.env @@ -0,0 +1,25 @@ +RELAYER_NEUTRON_CHAIN_RPC_ADDR=tcp://127.0.0.1:26657 +RELAYER_NEUTRON_CHAIN_REST_ADDR=http://127.0.0.1:1317 +RELAYER_NEUTRON_CHAIN_HOME_DIR=../../../neutron/data/test-1 +RELAYER_NEUTRON_CHAIN_SIGN_KEY_NAME=demowallet3 +RELAYER_NEUTRON_CHAIN_TIMEOUT=1000s +RELAYER_NEUTRON_CHAIN_GAS_PRICES=0.5untrn +RELAYER_NEUTRON_CHAIN_GAS_ADJUSTMENT=2.0 +RELAYER_NEUTRON_CHAIN_CONNECTION_ID=connection-0 +RELAYER_NEUTRON_CHAIN_DEBUG=true +RELAYER_NEUTRON_CHAIN_KEYRING_BACKEND=test +RELAYER_NEUTRON_CHAIN_OUTPUT_FORMAT=json +RELAYER_NEUTRON_CHAIN_SIGN_MODE_STR=direct +RELAYER_TARGET_CHAIN_RPC_ADDR=https://rpc.uni.junonetwork.io:443 +RELAYER_TARGET_CHAIN_ACCOUNT_PREFIX=neutron +RELAYER_TARGET_CHAIN_VALIDATOR_ACCOUNT_PREFIX=neutronvaloper +RELAYER_TARGET_CHAIN_TIMEOUT=1000s +RELAYER_TARGET_CHAIN_DEBUG=true +RELAYER_TARGET_CHAIN_OUTPUT_FORMAT=json +RELAYER_REGISTRY_ADDRESSES= +RELAYER_ALLOW_TX_QUERIES=true +RELAYER_ALLOW_KV_CALLBACKS=true +RELAYER_MIN_KV_UPDATE_PERIOD=1 +RELAYER_STORAGE_PATH=storage/leveldb +RELAYER_CHECK_SUBMITTED_TX_STATUS_DELAY=10s +RELAYER_QUERIES_TASK_QUEUE_CAPACITY=10000 diff --git a/scripts/test_icq_wasm_juno_testnet/test_wasm_query.sh b/scripts/test_icq_wasm_juno_testnet/test_wasm_query.sh new file mode 100755 index 00000000..6b45890f --- /dev/null +++ b/scripts/test_icq_wasm_juno_testnet/test_wasm_query.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +# http://redsymbol.net/articles/unofficial-bash-strict-mode/ +set -euo pipefail +IFS=$'\n\t' + +BIN="neutrond" +CONTRACT_PATH="../../artifacts/neutron_interchain_queries.wasm" +CHAIN_ID_1="test-1" +NEUTRON_DIR="${NEUTRON_DIR:-../../../neutron}" +HOME_1="${NEUTRON_DIR}/data/test-1/" +ADDRESS_1="neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2" +ADMIN="neutron1m9l358xunhhwds0568za49mzhvuxx9ux8xafx2" +NODE="tcp://127.0.0.1:26657" +CONNECTION_ID="connection-0" + +code_id="$("$BIN" tx wasm store "$CONTRACT_PATH" \ + --from "$ADDRESS_1" --gas 50000000 --chain-id "$CHAIN_ID_1" \ + --broadcast-mode=block --gas-prices 0.0025untrn -y \ + --output json --keyring-backend=test --home "$HOME_1" \ + --node "$NODE" \ + | jq -r '.logs[0].events[] | select(.type == "store_code").attributes[] | select(.key == "code_id").value')" +echo "Code ID: $code_id" + +contract_address="$("$BIN" tx wasm instantiate "$code_id" '{}' \ + --from "$ADDRESS_1" --admin "$ADMIN" -y --chain-id "$CHAIN_ID_1" \ + --output json --broadcast-mode=block --label "init" --node "$NODE" \ + --keyring-backend=test --gas-prices 0.0025untrn --home "$HOME_1" \ + | jq -r '.logs[0].events[] | select(.type == "instantiate").attributes[] | select(.key == "_contract_address").value')" +echo "Contract address: $contract_address" + +tx_result="$("$BIN" tx bank send "$ADDRESS_1" "$contract_address" 10000000untrn \ + -y --chain-id "$CHAIN_ID_1" --output json --broadcast-mode=block \ + --gas-prices 0.0025untrn --gas 300000 --keyring-backend=test \ + --home "$HOME_1" --node "$NODE")" +code="$(echo "$tx_result" | jq '.code')" +if [[ "$code" -ne 0 ]]; then + echo "Failed to send money to contract: $(echo "$tx_result" | jq '.raw_log')" && exit 1 +fi +echo "Sent money to contract to pay for deposit" + +msg="$(printf '{"register_wasm_contract_state_query":{ + "connection_id": "%s", + "update_period": 5, + "contract_address": "juno14q3tvtsvg2rg49ej4xpjma6mz8qkrzfhvf0fz87q2f8gcyexk6eskfgjll", + "storage_key": "contract_info" +}}' "$CONNECTION_ID")" +tx_result="$("$BIN" tx wasm execute "$contract_address" "$msg" \ + --from "$ADDRESS_1" -y --chain-id "$CHAIN_ID_1" --output json \ + --broadcast-mode=block --gas-prices 0.0025untrn --gas 1000000 \ + --keyring-backend=test --home "$HOME_1" --node "$NODE")" +code="$(echo "$tx_result" | jq '.code')" +if [[ "$code" -ne 0 ]]; then + echo "Failed to register ICQ: $(echo "$tx_result" | jq '.raw_log')" && exit 1 +fi +query_id="$(echo "$tx_result" | jq -r '.logs[0].events[] | select(.type == "neutron").attributes[] | select(.key == "query_id").value')" +echo "Registered wasm contract state ICQ with query ID: $query_id" + +echo "Waiting 10 seconds for ICQ result to arriveā€¦" +# shellcheck disable=SC2034 +for i in $(seq 10); do + sleep 1 + echo -n . +done +echo " done" + +echo +echo "KV query wasm contract state response:" +query="$(printf '{"get_wasm_contract_state": {"query_id": %s}}' "$query_id")" +"$BIN" query wasm contract-state smart "$contract_address" "$query" --node "$NODE" --output json | jq '.data'