From d5a346969a6583786d6321d2313cec86642c3fa6 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Wed, 13 Mar 2024 22:24:07 +0100 Subject: [PATCH 01/16] add injective deployment scripts --- package.json | 5 +- tasks/build_warp.ts | 6 +++ tasks/injective/deploy.sh | 26 +++++++++ tasks/injective/deploy_warp.sh | 99 ++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 tasks/build_warp.ts create mode 100755 tasks/injective/deploy.sh create mode 100755 tasks/injective/deploy_warp.sh diff --git a/package.json b/package.json index de5d3c8b..d46954e6 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,10 @@ "scripts": { "deploy:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/deploy_warp.ts --network testnet --signer pisco", "migrate:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/migrate_warp.ts --network testnet --signer pisco", - "postinstall": "husky install" + "build:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/build_warp.ts --network testnet --signer pisco", + "postinstall": "husky install", + "deploy:injective": "yarn build:warp && yarn deploy:inj", + "deploy:inj": "./tasks/injective/deploy.sh testnet" }, "dependencies": { "@terra-money/terrariums": "^1.1.9", diff --git a/tasks/build_warp.ts b/tasks/build_warp.ts new file mode 100644 index 00000000..364ea7bf --- /dev/null +++ b/tasks/build_warp.ts @@ -0,0 +1,6 @@ +import task from "@terra-money/terrariums"; + +task(async ({ deployer }) => { + deployer.buildContract("warp-controller"); + deployer.optimizeContract("warp-controller"); +}); diff --git a/tasks/injective/deploy.sh b/tasks/injective/deploy.sh new file mode 100755 index 00000000..16705ba5 --- /dev/null +++ b/tasks/injective/deploy.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +signer_key_acc_address="" +contracts_dir="$(pwd)/artifacts" +wallet_password="" + +# Define parameters for mainnet or testnet +if [ "$1" == "mainnet" ]; then + chain_id="injective-1" + node="https://sentry.tm.injective.network" + gas_price="1500000000inj" +elif [ "$1" == "testnet" ]; then + chain_id="injective-888" + node="https://testnet.sentry.tm.injective.network:443" + gas_price="1500000000inj" +else + echo "Invalid network specified" + exit 1 +fi + +# Instantiate message templates with the signer key address dynamically replaced +instantiate_templates_msg=$(echo '{"owner":"SIGNER_KEY_ACC_ADDRESS","fee_collector":"SIGNER_KEY_ACC_ADDRESS","templates":[],"fee_denom":"uluna"}' | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") +instantiate_controller_msg=$(echo '{"fee_denom":"uluna","fee_collector":"SIGNER_KEY_ACC_ADDRESS","warp_account_code_id":"ACCOUNT_CONTRACT_ID","account_tracker_code_id":"ACCOUNT_TRACKER_ID","minimum_reward":"100000","cancellation_fee_rate":"5","resolver_address":"RESOLVER_ADDRESS","creation_fee_min":"500000","creation_fee_max":"100000000","burn_fee_min":"250000","maintenance_fee_min":"250000","maintenance_fee_max":"10000000","duration_days_min":"7","duration_days_max":"90","duration_days_limit":"180","queue_size_left":"5000","queue_size_right":"50000","burn_fee_rate":"25"}' | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") + +# Call the deployment script with parameters +bash ./tasks/injective/deploy_warp.sh "$chain_id" "$node" "$gas_price" "$signer_key_acc_address" "$instantiate_templates_msg" "$instantiate_controller_msg" "$contracts_dir" "$wallet_password" diff --git a/tasks/injective/deploy_warp.sh b/tasks/injective/deploy_warp.sh new file mode 100755 index 00000000..ff784838 --- /dev/null +++ b/tasks/injective/deploy_warp.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +# Parameters +chain_id="$1" +node="$2" +gas_price="$3" +signer_key_acc_address="$4" +instantiate_templates_msg_template="$5" +instantiate_controller_msg_template="$6" +contracts_dir="$7" # Path to the contracts directory +wallet_password="$8" + +# Function to store contract code and get the code ID +store_contract() { + local contract_name=$1 + local contract_file="${contracts_dir}/${contract_name}-aarch64.wasm" + echo >&2 "Storing $contract_name..." + STORE_OUTPUT=$(yes $wallet_password | injectived tx wasm store "$contract_file" \ + --from="$signer_key_acc_address" \ + --chain-id="$chain_id" \ + --gas-prices="$gas_price" --gas=10000000 \ + --node="$node" \ + --output json --yes) + + # echo >&2 "STORE_OUTPUT = $STORE_OUTPUT" + + # Extract txhash from STORE_OUTPUT + TXHASH=$(echo "$STORE_OUTPUT" | jq -r '.txhash') + echo >&2 "Transaction Hash: $TXHASH" + + sleep 10 + + # Query transaction by txhash to get detailed info, including possibly the code ID + QUERY_OUTPUT=$(injectived query tx --type=hash "$TXHASH" --node="$node" --chain-id="$chain_id" --output json) + # echo >&2 "QUERY_OUTPUT = $QUERY_OUTPUT" + + # Attempt to extract code ID from QUERY_OUTPUT + CODE_ID=$(echo "$QUERY_OUTPUT" | jq -r '.logs[0].events[] | select(.type == "cosmwasm.wasm.v1.EventCodeStored").attributes[] | select(.key == "code_id").value | gsub("\"";"")') + + echo >&2 "CODE_ID = $CODE_ID" + + echo >&2 "Stored $contract_name with code ID: $CODE_ID" + echo $CODE_ID +} + +# Function to instantiate a contract +instantiate_contract() { + local contract_name=$1 + local code_id=$2 + local instantiate_msg=$3 + echo >&2 "Instantiating $contract_name with code ID: $code_id..." + INSTANTIATE_OUTPUT=$(yes "$wallet_password" | injectived tx wasm instantiate $code_id "$instantiate_msg" \ + --admin="$signer_key_acc_address" \ + --from="$signer_key_acc_address" \ + --label="$contract_name" \ + --chain-id="$chain_id" \ + --node="$node" \ + --gas-prices="$gas_price" --gas=10000000 \ + --output json --yes) + + # echo >&2 "INSTANTIATE_OUTPUT = $INSTANTIATE_OUTPUT" + + # Extract txhash from INSTANTIATE_OUTPUT + TXHASH=$(echo "$INSTANTIATE_OUTPUT" | jq -r '.txhash') + echo >&2 "Instantiate Transaction Hash: $TXHASH" + + sleep 10 # Wait for the transaction to be processed + + # Query transaction by txhash to get detailed info, including the contract address + QUERY_OUTPUT=$(injectived query tx --type=hash "$TXHASH" --node="$node" --chain-id="$chain_id" --output json) + # echo >&2 "QUERY_OUTPUT = $QUERY_OUTPUT" + + # Extract contract address from QUERY_OUTPUT + CONTRACT_ADDRESS=$(echo "$QUERY_OUTPUT" | jq -r '.logs[0].events[] | select(.type == "instantiate").attributes[] | select(.key == "_contract_address").value') + + echo >&2 "Contract Address = $CONTRACT_ADDRESS" + + echo >&2 "Instantiated $contract_name with contract address: $CONTRACT_ADDRESS" + echo "$CONTRACT_ADDRESS" # Return the contract address for use in calling script +} + +# Prepare instantiation messages +instantiate_templates_msg=$(echo "$instantiate_templates_msg_template" | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") +instantiate_controller_msg=$(echo "$instantiate_controller_msg_template" | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") + +# Store contract codes +account_contract_id=$(store_contract "warp_account") +resolver_code_id=$(store_contract "warp_resolver") +templates_code_id=$(store_contract "warp_templates") +controller_code_id=$(store_contract "warp_controller") +account_tracker_id=$(store_contract "warp_account_tracker") + +# Instantiate contracts with parameters +instantiate_contract "warp_templates" "7859" "$instantiate_templates_msg" +resolver_address=$(instantiate_contract "warp_resolver" $resolver_code_id '{}') + +# Update controller message with dynamic data +updated_instantiate_controller_msg=$(echo $instantiate_controller_msg | sed "s/RESOLVER_ADDRESS/$resolver_address/g" | sed "s/ACCOUNT_CONTRACT_ID/$account_contract_id/g" | sed "s/ACCOUNT_TRACKER_ID/$account_tracker_id/g") +instantiate_contract "warp_controller" $controller_code_id "$updated_instantiate_controller_msg" From bbbad09ac73db25a1dad8cacded4186c962c697b Mon Sep 17 00:00:00 2001 From: simke9445 Date: Wed, 13 Mar 2024 22:30:50 +0100 Subject: [PATCH 02/16] update deployment script --- tasks/injective/deploy_warp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/injective/deploy_warp.sh b/tasks/injective/deploy_warp.sh index ff784838..6f9ad62a 100755 --- a/tasks/injective/deploy_warp.sh +++ b/tasks/injective/deploy_warp.sh @@ -91,7 +91,7 @@ controller_code_id=$(store_contract "warp_controller") account_tracker_id=$(store_contract "warp_account_tracker") # Instantiate contracts with parameters -instantiate_contract "warp_templates" "7859" "$instantiate_templates_msg" +instantiate_contract "warp_templates" "$templates_code_id" "$instantiate_templates_msg" resolver_address=$(instantiate_contract "warp_resolver" $resolver_code_id '{}') # Update controller message with dynamic data From 5f04f633b0fe2791115f495f54edf8460bbdacc0 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Wed, 13 Mar 2024 23:09:39 +0100 Subject: [PATCH 03/16] make deployment scripts work --- package.json | 2 +- tasks/injective/deploy.sh | 21 +++++---------------- tasks/injective/deploy_warp.sh | 25 ++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index d46954e6..e9d7eec5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "build:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/build_warp.ts --network testnet --signer pisco", "postinstall": "husky install", "deploy:injective": "yarn build:warp && yarn deploy:inj", - "deploy:inj": "./tasks/injective/deploy.sh testnet" + "deploy:inj": "./tasks/injective/deploy.sh" }, "dependencies": { "@terra-money/terrariums": "^1.1.9", diff --git a/tasks/injective/deploy.sh b/tasks/injective/deploy.sh index 16705ba5..6cac730c 100755 --- a/tasks/injective/deploy.sh +++ b/tasks/injective/deploy.sh @@ -3,24 +3,13 @@ signer_key_acc_address="" contracts_dir="$(pwd)/artifacts" wallet_password="" - -# Define parameters for mainnet or testnet -if [ "$1" == "mainnet" ]; then - chain_id="injective-1" - node="https://sentry.tm.injective.network" - gas_price="1500000000inj" -elif [ "$1" == "testnet" ]; then - chain_id="injective-888" - node="https://testnet.sentry.tm.injective.network:443" - gas_price="1500000000inj" -else - echo "Invalid network specified" - exit 1 -fi +chain_id="injective-888" +node="https://testnet.sentry.tm.injective.network:443" +gas_price="1500000000inj" # Instantiate message templates with the signer key address dynamically replaced -instantiate_templates_msg=$(echo '{"owner":"SIGNER_KEY_ACC_ADDRESS","fee_collector":"SIGNER_KEY_ACC_ADDRESS","templates":[],"fee_denom":"uluna"}' | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") -instantiate_controller_msg=$(echo '{"fee_denom":"uluna","fee_collector":"SIGNER_KEY_ACC_ADDRESS","warp_account_code_id":"ACCOUNT_CONTRACT_ID","account_tracker_code_id":"ACCOUNT_TRACKER_ID","minimum_reward":"100000","cancellation_fee_rate":"5","resolver_address":"RESOLVER_ADDRESS","creation_fee_min":"500000","creation_fee_max":"100000000","burn_fee_min":"250000","maintenance_fee_min":"250000","maintenance_fee_max":"10000000","duration_days_min":"7","duration_days_max":"90","duration_days_limit":"180","queue_size_left":"5000","queue_size_right":"50000","burn_fee_rate":"25"}' | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") +instantiate_templates_msg=$(echo '{"owner":"SIGNER_KEY_ACC_ADDRESS","fee_collector":"SIGNER_KEY_ACC_ADDRESS","templates":[],"fee_denom":"inj"}' | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") +instantiate_controller_msg=$(echo '{"fee_denom":"inj","fee_collector":"SIGNER_KEY_ACC_ADDRESS","warp_account_code_id":"ACCOUNT_CONTRACT_ID","account_tracker_code_id":"ACCOUNT_TRACKER_ID","minimum_reward":"100000","cancellation_fee_rate":"5","resolver_address":"RESOLVER_ADDRESS","creation_fee_min":"500000","creation_fee_max":"100000000","burn_fee_min":"250000","maintenance_fee_min":"250000","maintenance_fee_max":"10000000","duration_days_min":"7","duration_days_max":"90","duration_days_limit":"180","queue_size_left":"5000","queue_size_right":"50000","burn_fee_rate":"25"}' | sed "s/SIGNER_KEY_ACC_ADDRESS/$signer_key_acc_address/g") # Call the deployment script with parameters bash ./tasks/injective/deploy_warp.sh "$chain_id" "$node" "$gas_price" "$signer_key_acc_address" "$instantiate_templates_msg" "$instantiate_controller_msg" "$contracts_dir" "$wallet_password" diff --git a/tasks/injective/deploy_warp.sh b/tasks/injective/deploy_warp.sh index 6f9ad62a..7bb842e2 100755 --- a/tasks/injective/deploy_warp.sh +++ b/tasks/injective/deploy_warp.sh @@ -76,7 +76,18 @@ instantiate_contract() { echo >&2 "Contract Address = $CONTRACT_ADDRESS" echo >&2 "Instantiated $contract_name with contract address: $CONTRACT_ADDRESS" - echo "$CONTRACT_ADDRESS" # Return the contract address for use in calling script + + echo "$CONTRACT_ADDRESS" +} + +fetch_account_tracker_address() { + local controller_contract=$1 + QUERY_OUTPUT=$(injectived query wasm contract-state smart $controller_contract '{"query_config":{}}' --node="$node" --chain-id="$chain_id" --output json) + ACCOUNT_TRACKER_ADDRESS=$(echo "$QUERY_OUTPUT" | jq -r '.data.config.account_tracker_address') + + echo >&2 "Account Tracker Address: $ACCOUNT_TRACKER_ADDRESS" + + echo "$ACCOUNT_TRACKER_ADDRESS" } # Prepare instantiation messages @@ -91,9 +102,17 @@ controller_code_id=$(store_contract "warp_controller") account_tracker_id=$(store_contract "warp_account_tracker") # Instantiate contracts with parameters -instantiate_contract "warp_templates" "$templates_code_id" "$instantiate_templates_msg" +templates_address=$(instantiate_contract "warp_templates" "$templates_code_id" "$instantiate_templates_msg") resolver_address=$(instantiate_contract "warp_resolver" $resolver_code_id '{}') # Update controller message with dynamic data updated_instantiate_controller_msg=$(echo $instantiate_controller_msg | sed "s/RESOLVER_ADDRESS/$resolver_address/g" | sed "s/ACCOUNT_CONTRACT_ID/$account_contract_id/g" | sed "s/ACCOUNT_TRACKER_ID/$account_tracker_id/g") -instantiate_contract "warp_controller" $controller_code_id "$updated_instantiate_controller_msg" +controller_address=$(instantiate_contract "warp_controller" $controller_code_id "$updated_instantiate_controller_msg") + +account_tracker_address=$(fetch_account_tracker_address $controller_address) + +echo "warp-account:$account_contract_id" +echo "warp-account-tracker:$account_tracker_address:$account_tracker_id" +echo "warp-templates:$templates_address:$templates_code_id" +echo "warp-resolver:$resolver_address:$resolver_code_id" +echo "warp-controller:$controller_address:$controller_code_id" From b222cc336474961ac6e968dfa63d88e89c8153d0 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Wed, 13 Mar 2024 23:09:50 +0100 Subject: [PATCH 04/16] try with query request empty --- contracts/warp-resolver/examples/warp-resolver-schema.rs | 4 ++-- packages/resolver/src/lib.rs | 6 +++--- packages/resolver/src/variable.rs | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/warp-resolver/examples/warp-resolver-schema.rs b/contracts/warp-resolver/examples/warp-resolver-schema.rs index 3abd5e69..299bd10e 100644 --- a/contracts/warp-resolver/examples/warp-resolver-schema.rs +++ b/contracts/warp-resolver/examples/warp-resolver-schema.rs @@ -3,7 +3,7 @@ use std::fs::create_dir_all; use controller::account::WarpMsg; use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; -use cosmwasm_std::{CosmosMsg, QueryRequest}; +use cosmwasm_std::{CosmosMsg, Empty, QueryRequest}; use resolver::{ condition::Condition, variable::Variable, ExecuteMsg, InstantiateMsg, QueryMsg, SimulateResponse, @@ -22,6 +22,6 @@ fn main() { export_schema(&schema_for!(Condition), &out_dir); export_schema(&schema_for!(SimulateResponse), &out_dir); export_schema(&schema_for!(CosmosMsg), &out_dir); - export_schema(&schema_for!(QueryRequest), &out_dir); + export_schema(&schema_for!(QueryRequest), &out_dir); export_schema(&schema_for!(WarpMsg), &out_dir); } diff --git a/packages/resolver/src/lib.rs b/packages/resolver/src/lib.rs index 34f76f74..888ea155 100644 --- a/packages/resolver/src/lib.rs +++ b/packages/resolver/src/lib.rs @@ -6,7 +6,7 @@ use controller::{ job::{Execution, ExternalInput, JobStatus}, }; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{Addr, QueryRequest}; +use cosmwasm_std::{Addr, Empty, QueryRequest}; #[cw_serde] pub struct InstantiateMsg {} @@ -49,7 +49,7 @@ pub struct WarpMsgsToCosmosMsgsMsg { #[cw_serde] pub struct ExecuteSimulateQueryMsg { - pub query: QueryRequest, + pub query: QueryRequest, } #[cw_serde] @@ -122,7 +122,7 @@ pub struct QueryApplyVarFnMsg { #[cw_serde] pub struct SimulateQueryMsg { - pub query: QueryRequest, + pub query: QueryRequest, } #[cw_serde] diff --git a/packages/resolver/src/variable.rs b/packages/resolver/src/variable.rs index b8cf1228..eb45e1ff 100644 --- a/packages/resolver/src/variable.rs +++ b/packages/resolver/src/variable.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Decimal256, QueryRequest, Uint256}; +use cosmwasm_std::{Decimal256, Empty, QueryRequest, Uint256}; use crate::condition::StringValue; @@ -48,7 +48,7 @@ pub enum Method { #[cw_serde] pub struct QueryExpr { pub selector: String, - pub query: QueryRequest, + pub query: QueryRequest, } #[cw_serde] From 7db0be94bd78421c838ea85398e7d1be4f0a4b1f Mon Sep 17 00:00:00 2001 From: simke9445 Date: Thu, 14 Mar 2024 16:27:45 +0100 Subject: [PATCH 05/16] fix idempotency bug in execute_job --- contracts/warp-controller/src/execute/job.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contracts/warp-controller/src/execute/job.rs b/contracts/warp-controller/src/execute/job.rs index 36963c83..5fc6287f 100644 --- a/contracts/warp-controller/src/execute/job.rs +++ b/contracts/warp-controller/src/execute/job.rs @@ -478,6 +478,8 @@ pub fn execute_job( let mut msgs = vec![]; let mut submsgs = vec![]; + let mut execution_matched = false; + for Execution { condition, msgs } in job.executions { let resolution: StdResult = deps.querier.query_wasm_smart( config.resolver_address.clone(), @@ -509,6 +511,9 @@ pub fn execute_job( gas_limit: None, reply_on: ReplyOn::Always, }); + + execution_matched = true; + break; } Ok(false) => { @@ -524,6 +529,15 @@ pub fn execute_job( } } + if !execution_matched { + return Ok(Response::new() + .add_attribute("action", "execute_job") + .add_attribute("executor", info.sender) + .add_attribute("job_id", job.id) + .add_attribute("job_condition", "inactive") + .add_attributes(attrs)); + } + // Controller sends reward to executor msgs.push(build_transfer_native_funds_msg( info.sender.to_string(), From 79602198019db586a09a139708c1f53b4b3a6dfd Mon Sep 17 00:00:00 2001 From: simke9445 Date: Thu, 14 Mar 2024 16:30:18 +0100 Subject: [PATCH 06/16] add execution matched true for malformed job executions --- contracts/warp-controller/src/execute/job.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/warp-controller/src/execute/job.rs b/contracts/warp-controller/src/execute/job.rs index 5fc6287f..f1ae0ca1 100644 --- a/contracts/warp-controller/src/execute/job.rs +++ b/contracts/warp-controller/src/execute/job.rs @@ -524,6 +524,9 @@ pub fn execute_job( attrs.push(Attribute::new("job_condition_status", "invalid")); attrs.push(Attribute::new("error", e.to_string())); JobQueue::finalize(deps.storage, env, job.id.into(), JobStatus::Failed)?; + + execution_matched = true; + break; } } From cf88ca7fabf27af894c09a8563eb6700bad4dcfa Mon Sep 17 00:00:00 2001 From: simke9445 Date: Sun, 17 Mar 2024 22:53:54 +0100 Subject: [PATCH 07/16] make free job|funding account idempotent --- .../src/execute/account.rs | 16 ++++++++----- .../src/integration_tests.rs | 23 ++++++++----------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/contracts/warp-account-tracker/src/execute/account.rs b/contracts/warp-account-tracker/src/execute/account.rs index 75f951a6..88929e17 100644 --- a/contracts/warp-account-tracker/src/execute/account.rs +++ b/contracts/warp-account-tracker/src/execute/account.rs @@ -76,9 +76,11 @@ pub fn free_job_account(deps: DepsMut, data: FreeJobAccountMsg) -> Result Ok(data.last_job_id), - Some(_) => Err(ContractError::AccountAlreadyFreeError {}), + |s| -> Result { + match s { + None => Ok(data.last_job_id), + Some(last_job_id) => Ok(last_job_id), // idempotent use case, if already freed, do nothing + } }, )?; @@ -180,9 +182,11 @@ pub fn free_funding_account( FREE_FUNDING_ACCOUNTS.update( deps.storage, (account_owner_addr_ref, account_addr_ref), - |s| match s { - None => Ok(vec![data.job_id]), - Some(_) => Err(ContractError::AccountAlreadyFreeError {}), + |s| -> Result, ContractError> { + match s { + None => Ok(vec![data.job_id]), + Some(job_ids) => Ok(job_ids), // idempotent use case, if already freed, do nothing + } }, )?; } else { diff --git a/contracts/warp-account-tracker/src/integration_tests.rs b/contracts/warp-account-tracker/src/integration_tests.rs index 90faf8a3..c42cb4c9 100644 --- a/contracts/warp-account-tracker/src/integration_tests.rs +++ b/contracts/warp-account-tracker/src/integration_tests.rs @@ -144,19 +144,16 @@ mod tests { &[], ); - // Cannot free account twice - assert_err( - app.execute_contract( - Addr::unchecked(USER_1), - warp_account_tracker_contract_addr.clone(), - &ExecuteMsg::FreeJobAccount(FreeJobAccountMsg { - account_owner_addr: USER_1.to_string(), - account_addr: DUMMY_WARP_ACCOUNT_1_ADDR.to_string(), - last_job_id: DUMMY_JOB_1_ID, - }), - &[], - ), - ContractError::AccountAlreadyFreeError {}, + // free account idempotent + let _ = app.execute_contract( + Addr::unchecked(USER_1), + warp_account_tracker_contract_addr.clone(), + &ExecuteMsg::FreeJobAccount(FreeJobAccountMsg { + account_owner_addr: USER_1.to_string(), + account_addr: DUMMY_WARP_ACCOUNT_1_ADDR.to_string(), + last_job_id: DUMMY_JOB_1_ID, + }), + &[], ); // Mark second account as free From 49f1b69e2eb01116f1716df9743bd3b045712efc Mon Sep 17 00:00:00 2001 From: simke9445 Date: Mon, 18 Mar 2024 00:12:34 +0100 Subject: [PATCH 08/16] update refs.jsonj --- refs.json | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/refs.json b/refs.json index f662f32d..3599f2f7 100644 --- a/refs.json +++ b/refs.json @@ -1,12 +1,4 @@ { - "localterra": { - "warp-account": { - "codeId": "12" - }, - "warp-controller": { - "codeId": "13" - } - }, "testnet": { "warp-account": { "codeId": "12858" @@ -29,20 +21,21 @@ } }, "mainnet": { - "warp-account": { - "codeId": "1695" - }, "warp-controller": { - "codeId": "1708", - "address": "terra1f04qvhl09pznjycwmaefne7432rst94fpe4atmf96kp6mxlgac9sry6734" + "codeId": "2624", + "address": "terra1w6j6w9kx29h6kssqstupppm8vytvh2phpul72wsz8ylluqdd44us5u95ny" }, "warp-resolver": { - "codeId": "1707", - "address": "terra1ul7sq0ckelkn8u8sg04ufvp9pc3r230pngs48e3mj2rjh94nytrsmh0lmd" + "codeId": "2625", + "address": "terra1t7zxwt5a2aheyh5ykg9j6ax20kz2q6v9q5ty7t0vdshsadnjegjqu6yjd6" }, "warp-templates": { - "codeId": "1697", - "address": "terra1qu9rkvecsjxmr537mh4pwz55zjwlg89hgte8mpldd9nmu273qmzqp3r4et" + "codeId": "2626", + "address": "terra1s94r56gkyyavx5xxea9kgzemh9yeh6q9h065sf3ngc2pfd7ua67srrq5gh" + }, + "warp-account-tracker": { + "codeId": "2716", + "address": "terra1mwrmemx45mmqylz3j2wsq0cscnajeynlxval8rqq6vxh30fqyassajfvdq" } } } \ No newline at end of file From 9860304033eaf31f05c3e38b37e0647ac6fe7e9a Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 00:21:02 +0100 Subject: [PATCH 09/16] add migrate script --- tasks/injective/migrate.sh | 14 +++++++ tasks/injective/migrate_warp.sh | 71 +++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100755 tasks/injective/migrate.sh create mode 100755 tasks/injective/migrate_warp.sh diff --git a/tasks/injective/migrate.sh b/tasks/injective/migrate.sh new file mode 100755 index 00000000..1870d8ee --- /dev/null +++ b/tasks/injective/migrate.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +signer_key_acc_address="" +contracts_dir="$(pwd)/artifacts" +wallet_password="" +chain_id="injective-888" +node="https://testnet.sentry.tm.injective.network:443" +gas_price="1500000000inj" +contract_name="warp_resolver" +resolver_contract_address="inj1pku5zgartl3xdlr509u3wjfs48k2lqylpscydf" +migrate_msg='{}' + +# Call the migration script with parameters +bash ./tasks/injective/migrate_warp.sh "$chain_id" "$node" "$gas_price" "$signer_key_acc_address" "$migrate_msg" "$resolver_contract_address" "$contract_name" "$contracts_dir" "$wallet_password" diff --git a/tasks/injective/migrate_warp.sh b/tasks/injective/migrate_warp.sh new file mode 100755 index 00000000..d4067842 --- /dev/null +++ b/tasks/injective/migrate_warp.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# Parameters +chain_id="$1" +node="$2" +gas_price="$3" +signer_key_acc_address="$4" +migrate_msg="$5" +resolver_contract_address="$6" +contract_name="$7" +contracts_dir="$8" +wallet_password="$9" + +# Function to store contract code and get the code ID +store_contract() { + local contract_name=$1 + local contract_file="${contracts_dir}/${contract_name}-aarch64.wasm" + echo >&2 "Storing $contract_name..." + STORE_OUTPUT=$(yes $wallet_password | injectived tx wasm store "$contract_file" \ + --from="$signer_key_acc_address" \ + --chain-id="$chain_id" \ + --gas-prices="$gas_price" --gas=10000000 \ + --node="$node" \ + --output json --yes) + + # Extract txhash from STORE_OUTPUT + TXHASH=$(echo "$STORE_OUTPUT" | jq -r '.txhash') + echo >&2 "Transaction Hash: $TXHASH" + + sleep 10 + + # Query transaction by txhash to get detailed info, including possibly the code ID + QUERY_OUTPUT=$(injectived query tx --type=hash "$TXHASH" --node="$node" --chain-id="$chain_id" --output json) + CODE_ID=$(echo "$QUERY_OUTPUT" | jq -r '.logs[0].events[] | select(.type == "cosmwasm.wasm.v1.EventCodeStored").attributes[] | select(.key == "code_id").value | gsub("\"";"")') + + echo >&2 "CODE_ID = $CODE_ID" + echo >&2 "Stored $contract_name with code ID: $CODE_ID" + echo $CODE_ID +} + +# Function to migrate a contract +migrate_contract() { + local contract_address=$1 + local new_code_id=$2 + local migrate_msg=$3 + echo >&2 "Migrating contract at address $contract_address to new code ID: $new_code_id..." + MIGRATE_OUTPUT=$(yes "$wallet_password" | injectived tx wasm migrate "$contract_address" "$new_code_id" "$migrate_msg" \ + --from="$signer_key_acc_address" \ + --chain-id="$chain_id" \ + --node="$node" \ + --gas-prices="$gas_price" --gas=10000000 \ + --output json --yes) + + # Extract txhash from MIGRATE_OUTPUT + TXHASH=$(echo "$MIGRATE_OUTPUT" | jq -r '.txhash') + echo >&2 "Migration Transaction Hash: $TXHASH" + + sleep 10 # Wait for the transaction to be processed + + # Query transaction by txhash to get detailed info, including success or failure + QUERY_OUTPUT=$(injectived query tx --type=hash "$TXHASH" --node="$node" --chain-id="$chain_id" --output json) + echo >&2 "Migration tx: $QUERY_OUTPUT" +} + +# Store the new contract code and retrieve the new code ID +new_code_id=$(store_contract "$contract_name") + +# Execute migration for the specified contract using the new code ID +migrate_contract "$resolver_contract_address" "$new_code_id" "$migrate_msg" + +echo "Migration of $contract_name complete with new code ID: $new_code_id." From 01172cb23afa89ae9568040ef1031b1b94688c4a Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 00:21:23 +0100 Subject: [PATCH 10/16] add build warp script --- tasks/injective/build_warp.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 tasks/injective/build_warp.sh diff --git a/tasks/injective/build_warp.sh b/tasks/injective/build_warp.sh new file mode 100755 index 00000000..27a9dec8 --- /dev/null +++ b/tasks/injective/build_warp.sh @@ -0,0 +1,4 @@ +docker run --rm -v "$(pwd)":/code \ +--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \ +--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ +cosmwasm/workspace-optimizer-arm64:0.12.12 \ No newline at end of file From 347694239b581d8382f600575c8cd4af21c358a0 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 00:22:35 +0100 Subject: [PATCH 11/16] add injective-cosmwasm dep + logic for parsing queryrequest into queryrequest + replacing references in string json --- Cargo.lock | 582 +++++++++++++++--- contracts/warp-resolver/Cargo.toml | 2 + .../examples/warp-resolver-schema.rs | 4 +- contracts/warp-resolver/src/util/condition.rs | 20 +- contracts/warp-resolver/src/util/variable.rs | 14 +- package.json | 6 +- packages/resolver/Cargo.toml | 1 + packages/resolver/src/lib.rs | 6 +- packages/resolver/src/variable.rs | 4 +- 9 files changed, 553 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ebe45581..94a323f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -47,18 +47,42 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64ct" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "block-buffer" version = "0.9.0" @@ -77,6 +101,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" + [[package]] name = "byteorder" version = "1.4.3" @@ -95,11 +125,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + [[package]] name = "const-oid" -version = "0.9.1" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "controller" @@ -120,22 +159,23 @@ dependencies = [ [[package]] name = "cosmwasm-crypto" -version = "1.2.4" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b76d2207945b8aa3ce0735da53ab9a74f75fe3e7794754c216a9edfa04e1e627" +checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", + "ecdsa 0.16.9", "ed25519-zebra", - "k256", + "k256 0.13.1", "rand_core 0.6.4", "thiserror", ] [[package]] name = "cosmwasm-derive" -version = "1.2.4" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd07af7736164d2d8126dc67fdb33b1b5c54fb5a3190395c47f46d24fc6d592" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" dependencies = [ "syn 1.0.107", ] @@ -166,11 +206,13 @@ dependencies = [ [[package]] name = "cosmwasm-std" -version = "1.2.4" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d39f20967baeb94709123f7bba13a25ae2fa166bc5e7813f734914df3f8f6a1" +checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" dependencies = [ - "base64", + "base64 0.21.7", + "bech32", + "bnum", "cosmwasm-crypto", "cosmwasm-derive", "derivative", @@ -178,10 +220,10 @@ dependencies = [ "hex", "schemars", "serde", - "serde-json-wasm 0.5.1", + "serde-json-wasm 0.5.2", "sha2 0.10.6", + "static_assertions 1.1.0", "thiserror", - "uint", ] [[package]] @@ -221,6 +263,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -265,11 +319,11 @@ checksum = "c2eb84554bbfa6b66736abcd6a9bfdf237ee0ecb83910f746dff7f799093c80a" dependencies = [ "anyhow", "cosmwasm-std", - "cw-storage-plus 1.0.1", + "cw-storage-plus 1.2.0", "cw-utils 1.0.1", "derivative", "itertools", - "k256", + "k256 0.11.6", "prost 0.9.0", "schemars", "serde", @@ -289,9 +343,9 @@ dependencies = [ [[package]] name = "cw-storage-plus" -version = "1.0.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053a5083c258acd68386734f428a5a171b29f7d733151ae83090c6fcc9417ffa" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" dependencies = [ "cosmwasm-std", "schemars", @@ -362,7 +416,7 @@ checksum = "8fb70cee2cf0b4a8ff7253e6bc6647107905e8eb37208f87d54f67810faa62f8" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw-storage-plus 1.0.1", + "cw-storage-plus 1.2.0", "schemars", "serde", ] @@ -403,6 +457,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "derivative" version = "2.2.0" @@ -425,11 +489,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.3", + "const-oid", "crypto-common", "subtle", ] @@ -446,10 +511,24 @@ version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ - "der", - "elliptic-curve", - "rfc6979", - "signature", + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.8", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -479,20 +558,75 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "base16ct", - "crypto-bigint", - "der", - "digest 0.10.6", - "ff", + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", "generic-array", - "group", - "pkcs8", + "group 0.12.1", + "pkcs8 0.9.0", "rand_core 0.6.4", - "sec1", + "sec1 0.3.0", "subtle", "zeroize", ] +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.0", + "generic-array", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.1", + "subtle", + "zeroize", +] + +[[package]] +name = "ethbloom" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3932e82d64d347a045208924002930dc105a138995ccdc1479d0f05f0359f17c" +dependencies = [ + "crunchy", + "fixed-hash 0.3.2", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b054df51e53f253837ea422681215b42823c02824bde982699d0dceecf6165a1" +dependencies = [ + "crunchy", + "ethbloom", + "ethereum-types-serialize", + "fixed-hash 0.3.2", + "serde", + "uint 0.5.0", +] + +[[package]] +name = "ethereum-types-serialize" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1873d77b32bc1891a79dad925f2acbc318ee942b38b9110f9dbc5fbeffcea350" +dependencies = [ + "serde", +] + [[package]] name = "ff" version = "0.12.1" @@ -503,12 +637,50 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +dependencies = [ + "byteorder", + "heapsize", + "rand", + "rustc-hex", + "static_assertions 0.2.5", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "static_assertions 1.1.0", +] + [[package]] name = "forward_ref" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "generic-array" version = "0.14.6" @@ -517,6 +689,7 @@ checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -536,7 +709,18 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ - "ff", + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] @@ -550,6 +734,15 @@ dependencies = [ "ahash", ] +[[package]] +name = "heapsize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +dependencies = [ + "winapi", +] + [[package]] name = "heck" version = "0.4.0" @@ -561,6 +754,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hmac" @@ -568,7 +764,57 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", +] + +[[package]] +name = "impl-rlp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f7a72f11830b52333f36e3b09a288333888bf54380fd0ac0790a3c31ab0f3c5" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e3cae7e99c7ff5a995da2cf78dd0a5383740eda71d98cf7b1910c301ac69b8" +dependencies = [ + "serde", +] + +[[package]] +name = "injective-cosmwasm" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85e8f06d04d0e20d59d673ae242c5cffb6a13f3b5189fd2e95ea153f3066f52" +dependencies = [ + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "ethereum-types", + "hex", + "injective-math", + "schemars", + "serde", + "serde_repr", + "subtle-encoding", + "tiny-keccak", +] + +[[package]] +name = "injective-math" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4e31ffb7dff274e0be1117bc8f1240f6572d6157be2c4daf13ff82eaaddd85" +dependencies = [ + "cosmwasm-std", + "ethereum-types", + "primitive-types", + "schemars", + "serde", + "subtle-encoding", ] [[package]] @@ -599,9 +845,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", - "ecdsa", - "elliptic-curve", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.6", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "once_cell", "sha2 0.10.6", + "signature 2.2.0", ] [[package]] @@ -612,9 +872,9 @@ checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "once_cell" -version = "1.16.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -628,15 +888,35 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" dependencies = [ - "der", - "spki", + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.8", + "spki 0.7.3", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "uint 0.9.5", ] [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -689,13 +969,41 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "winapi", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.5.1" @@ -719,6 +1027,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-multi-test", + "injective-cosmwasm", ] [[package]] @@ -727,11 +1036,36 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ - "crypto-bigint", + "crypto-bigint 0.4.9", "hmac", "zeroize", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rlp" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1190dcc8c3a512f1eef5d09bb8c84c7f39e1054e174d1795482e18f5272f2e73" +dependencies = [ + "rustc-hex", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + [[package]] name = "rustversion" version = "1.0.11" @@ -746,9 +1080,9 @@ checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" [[package]] name = "schemars" -version = "0.8.11" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5fb6c61f29e723026dc8e923d94c694313212abbecbbe5f55a7748eec5b307" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "dyn-clone", "schemars_derive", @@ -758,9 +1092,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.11" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f188d036977451159430f3b8dc82ec76364a42b7e289c2b18a9a18f4470058e9" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -774,10 +1108,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "base16ct", - "der", + "base16ct 0.1.1", + "der 0.6.1", "generic-array", - "pkcs8", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.8", + "generic-array", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -790,9 +1138,9 @@ checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -808,22 +1156,22 @@ dependencies = [ [[package]] name = "serde-json-wasm" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.53", ] [[package]] @@ -848,6 +1196,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "sha2" version = "0.9.9" @@ -869,7 +1228,7 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -878,7 +1237,17 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", "rand_core 0.6.4", ] @@ -889,9 +1258,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" dependencies = [ "base64ct", - "der", + "der 0.6.1", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.8", +] + +[[package]] +name = "static_assertions" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" + [[package]] name = "static_assertions" version = "1.1.0" @@ -923,6 +1308,15 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + [[package]] name = "syn" version = "1.0.107" @@ -936,9 +1330,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -976,12 +1370,33 @@ dependencies = [ "syn 1.0.107", ] +[[package]] +name = "tiny-keccak" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" +dependencies = [ + "crunchy", +] + [[package]] name = "typenum" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "uint" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "082df6964410f6aa929a61ddfafc997e4f32c62c22490e439ac351cec827f436" +dependencies = [ + "byteorder", + "crunchy", + "heapsize", + "rustc-hex", +] + [[package]] name = "uint" version = "0.9.5" @@ -991,7 +1406,7 @@ dependencies = [ "byteorder", "crunchy", "hex", - "static_assertions", + "static_assertions 1.1.0", ] [[package]] @@ -1012,7 +1427,7 @@ version = "0.1.0" dependencies = [ "account", "anyhow", - "base64", + "base64 0.13.1", "controller", "cosmwasm-schema", "cosmwasm-std", @@ -1037,7 +1452,7 @@ version = "0.1.0" dependencies = [ "account-tracker", "anyhow", - "base64", + "base64 0.13.1", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", @@ -1061,7 +1476,7 @@ version = "0.1.0" dependencies = [ "account", "account-tracker", - "base64", + "base64 0.13.1", "controller", "cosmwasm-schema", "cosmwasm-std", @@ -1083,7 +1498,7 @@ dependencies = [ name = "warp-resolver" version = "0.1.0" dependencies = [ - "base64", + "base64 0.13.1", "controller", "cosmwasm-schema", "cosmwasm-std", @@ -1095,6 +1510,7 @@ dependencies = [ "cw2 0.16.0", "cw20", "cw721", + "injective-cosmwasm", "json-codec-wasm", "resolver", "schemars", @@ -1106,7 +1522,7 @@ dependencies = [ name = "warp-templates" version = "0.1.0" dependencies = [ - "base64", + "base64 0.13.1", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", @@ -1130,8 +1546,30 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "zeroize" -version = "1.5.7" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contracts/warp-resolver/Cargo.toml b/contracts/warp-resolver/Cargo.toml index 1009beb8..664c937e 100644 --- a/contracts/warp-resolver/Cargo.toml +++ b/contracts/warp-resolver/Cargo.toml @@ -46,6 +46,8 @@ schemars = "0.8" thiserror = "1" serde-json-wasm = "0.4.1" json-codec-wasm = "0.1.0" +injective-cosmwasm = "0.2.22" + [dev-dependencies] cw-multi-test = "0.16.0" diff --git a/contracts/warp-resolver/examples/warp-resolver-schema.rs b/contracts/warp-resolver/examples/warp-resolver-schema.rs index 299bd10e..3abd5e69 100644 --- a/contracts/warp-resolver/examples/warp-resolver-schema.rs +++ b/contracts/warp-resolver/examples/warp-resolver-schema.rs @@ -3,7 +3,7 @@ use std::fs::create_dir_all; use controller::account::WarpMsg; use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; -use cosmwasm_std::{CosmosMsg, Empty, QueryRequest}; +use cosmwasm_std::{CosmosMsg, QueryRequest}; use resolver::{ condition::Condition, variable::Variable, ExecuteMsg, InstantiateMsg, QueryMsg, SimulateResponse, @@ -22,6 +22,6 @@ fn main() { export_schema(&schema_for!(Condition), &out_dir); export_schema(&schema_for!(SimulateResponse), &out_dir); export_schema(&schema_for!(CosmosMsg), &out_dir); - export_schema(&schema_for!(QueryRequest), &out_dir); + export_schema(&schema_for!(QueryRequest), &out_dir); export_schema(&schema_for!(WarpMsg), &out_dir); } diff --git a/contracts/warp-resolver/src/util/condition.rs b/contracts/warp-resolver/src/util/condition.rs index b2db2a75..77119328 100644 --- a/contracts/warp-resolver/src/util/condition.rs +++ b/contracts/warp-resolver/src/util/condition.rs @@ -2,9 +2,10 @@ use crate::util::path::resolve_path; use crate::util::variable::get_var; use crate::ContractError; use cosmwasm_std::{ - to_vec, ContractResult, Decimal256, Deps, Env, StdError, SystemResult, Uint256, + to_vec, ContractResult, Decimal256, Deps, Env, QueryRequest, StdError, SystemResult, Uint256, }; use cw_storage_plus::KeyDeserialize; +use injective_cosmwasm::InjectiveQueryWrapper; use json_codec_wasm::ast::Ref; use json_codec_wasm::Decoder; use resolver::condition::{ @@ -577,7 +578,22 @@ pub fn resolve_str_op(_deps: Deps, _env: Env, left: String, right: String, op: S } pub fn resolve_query_expr(deps: Deps, _env: Env, expr: QueryExpr) -> Result { - let raw = to_vec(&expr.query).map_err(|serialize_err| { + let injective_query: QueryRequest = match expr.query { + QueryRequest::Custom(str) => { + let injective_query_wrapper: InjectiveQueryWrapper = serde_json_wasm::from_str(&str)?; + + QueryRequest::Custom(injective_query_wrapper) + } + QueryRequest::Bank(b) => QueryRequest::Bank(b), + QueryRequest::Staking(s) => QueryRequest::Staking(s), + QueryRequest::Distribution(_) => todo!(), + QueryRequest::Stargate { path, data } => QueryRequest::Stargate { path, data }, + QueryRequest::Ibc(i) => QueryRequest::Ibc(i), + QueryRequest::Wasm(w) => QueryRequest::Wasm(w), + _ => panic!("Expected known QueryRequest type"), + }; + + let raw = to_vec(&injective_query).map_err(|serialize_err| { StdError::generic_err(format!("Serializing QueryRequest: {}", serialize_err)) })?; diff --git a/contracts/warp-resolver/src/util/variable.rs b/contracts/warp-resolver/src/util/variable.rs index bf6dfbaf..f31afa77 100644 --- a/contracts/warp-resolver/src/util/variable.rs +++ b/contracts/warp-resolver/src/util/variable.rs @@ -634,7 +634,12 @@ fn replace_references(mut expr: QueryExpr, vars: &[Variable]) -> Result expr.query = replace_in_struct(&expr.query, vars)?, + QueryRequest::Custom(str) => { + *str = replace_in_struct_string(str.to_string(), vars)?; + } + _ => { + expr.query = replace_in_struct(&expr.query, vars)?; + } } Ok(expr) @@ -663,9 +668,12 @@ fn replace_in_struct( msg: "Failed to convert struct to JSON.".to_string(), })?; let updated_struct_as_json = replace_in_struct_string(struct_as_json, vars)?; - serde_json_wasm::from_str(&updated_struct_as_json).map_err(|_| ContractError::HydrationError { + + let replaced_value = serde_json_wasm::from_str(&updated_struct_as_json).map_err(|_| ContractError::HydrationError { msg: "Failed to convert JSON back to struct.".to_string(), - }) + })?; + + Ok(replaced_value) } fn replace_in_struct_string(value: String, vars: &[Variable]) -> Result { diff --git a/package.json b/package.json index e9d7eec5..3889e782 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,12 @@ "scripts": { "deploy:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/deploy_warp.ts --network testnet --signer pisco", "migrate:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/migrate_warp.ts --network testnet --signer pisco", - "build:warp": "TERRARIUMS_ARCH_ARM64=true yarn terrariums run tasks/build_warp.ts --network testnet --signer pisco", + "build:warp": "./tasks/injective/build_warp.sh", "postinstall": "husky install", "deploy:injective": "yarn build:warp && yarn deploy:inj", - "deploy:inj": "./tasks/injective/deploy.sh" + "deploy:inj": "./tasks/injective/deploy.sh", + "migrate:injective": "yarn build:warp && yarn migrate:inj", + "migrate:inj": "./tasks/injective/migrate.sh" }, "dependencies": { "@terra-money/terrariums": "^1.1.9", diff --git a/packages/resolver/Cargo.toml b/packages/resolver/Cargo.toml index aefa9005..53a2b6ff 100644 --- a/packages/resolver/Cargo.toml +++ b/packages/resolver/Cargo.toml @@ -12,6 +12,7 @@ backtraces = ["cosmwasm-std/backtraces"] cosmwasm-std = "1.1" cosmwasm-schema = "1.1" controller = { path = "../controller" } +injective-cosmwasm = "0.2.22" [dev-dependencies] cw-multi-test = "0.16" diff --git a/packages/resolver/src/lib.rs b/packages/resolver/src/lib.rs index 888ea155..34f76f74 100644 --- a/packages/resolver/src/lib.rs +++ b/packages/resolver/src/lib.rs @@ -6,7 +6,7 @@ use controller::{ job::{Execution, ExternalInput, JobStatus}, }; use cosmwasm_schema::{cw_serde, QueryResponses}; -use cosmwasm_std::{Addr, Empty, QueryRequest}; +use cosmwasm_std::{Addr, QueryRequest}; #[cw_serde] pub struct InstantiateMsg {} @@ -49,7 +49,7 @@ pub struct WarpMsgsToCosmosMsgsMsg { #[cw_serde] pub struct ExecuteSimulateQueryMsg { - pub query: QueryRequest, + pub query: QueryRequest, } #[cw_serde] @@ -122,7 +122,7 @@ pub struct QueryApplyVarFnMsg { #[cw_serde] pub struct SimulateQueryMsg { - pub query: QueryRequest, + pub query: QueryRequest, } #[cw_serde] diff --git a/packages/resolver/src/variable.rs b/packages/resolver/src/variable.rs index eb45e1ff..b8cf1228 100644 --- a/packages/resolver/src/variable.rs +++ b/packages/resolver/src/variable.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Decimal256, Empty, QueryRequest, Uint256}; +use cosmwasm_std::{Decimal256, QueryRequest, Uint256}; use crate::condition::StringValue; @@ -48,7 +48,7 @@ pub enum Method { #[cw_serde] pub struct QueryExpr { pub selector: String, - pub query: QueryRequest, + pub query: QueryRequest, } #[cw_serde] From ce1799a30d0b1c96a6e18dac50e101fc5d88972e Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 00:57:34 +0100 Subject: [PATCH 12/16] implement parsing json strings in resolve_query_expr_string --- contracts/warp-resolver/src/util/condition.rs | 62 +++++++++++++++++-- contracts/warp-resolver/src/util/variable.rs | 8 ++- 2 files changed, 63 insertions(+), 7 deletions(-) diff --git a/contracts/warp-resolver/src/util/condition.rs b/contracts/warp-resolver/src/util/condition.rs index 77119328..8d170afc 100644 --- a/contracts/warp-resolver/src/util/condition.rs +++ b/contracts/warp-resolver/src/util/condition.rs @@ -715,8 +715,62 @@ pub fn resolve_query_expr_string( let r = Ref::new(&value); let resolved = resolve_path(r, expr.selector)?; - Ok(resolved - .string() - .ok_or(ContractError::DecodeError {})? - .to_string()) + let v = resolved.value().ok_or(ContractError::DecodeError {})?; + + let json = Json { value: v.clone() }; + + Ok(json.to_string()) +} + +pub struct Json { + value: json_codec_wasm::Json, +} + +impl Json { + fn to_json_string(&self, quote_strings: bool) -> String { + match &self.value { + json_codec_wasm::Json::Bool(b) => b.to_string(), + json_codec_wasm::Json::I128(i) => i.to_string(), + json_codec_wasm::Json::U128(u) => u.to_string(), + json_codec_wasm::Json::String(s) => { + if quote_strings { + format!("\"{}\"", s) + } else { + s.to_string() + } + } + json_codec_wasm::Json::Array(arr) => { + let items: Vec = arr + .iter() + .map(|item| { + Json { + value: item.clone(), + } + .to_json_string(true) + }) + .collect(); + format!("[{}]", items.join(", ")) + } + json_codec_wasm::Json::Object(obj) => { + let items: Vec = obj + .iter() + .map(|(k, v)| { + format!( + "\"{}\":{}", + k, + Json { value: v.clone() }.to_json_string(true) + ) + }) + .collect(); + format!("{{{}}}", items.join(",")) + } + json_codec_wasm::Json::Null => "null".to_string(), + } + } +} + +impl ToString for Json { + fn to_string(&self) -> String { + self.to_json_string(false) + } } diff --git a/contracts/warp-resolver/src/util/variable.rs b/contracts/warp-resolver/src/util/variable.rs index f31afa77..b4437c1e 100644 --- a/contracts/warp-resolver/src/util/variable.rs +++ b/contracts/warp-resolver/src/util/variable.rs @@ -668,9 +668,11 @@ fn replace_in_struct( msg: "Failed to convert struct to JSON.".to_string(), })?; let updated_struct_as_json = replace_in_struct_string(struct_as_json, vars)?; - - let replaced_value = serde_json_wasm::from_str(&updated_struct_as_json).map_err(|_| ContractError::HydrationError { - msg: "Failed to convert JSON back to struct.".to_string(), + + let replaced_value = serde_json_wasm::from_str(&updated_struct_as_json).map_err(|_| { + ContractError::HydrationError { + msg: "Failed to convert JSON back to struct.".to_string(), + } })?; Ok(replaced_value) From 934eea0efed922cf4e4083f58318ac76de30ee8b Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 01:27:44 +0100 Subject: [PATCH 13/16] tests --- contracts/warp-resolver/src/tests.rs | 125 ++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 23 deletions(-) diff --git a/contracts/warp-resolver/src/tests.rs b/contracts/warp-resolver/src/tests.rs index a1c9f1fa..ec0d000a 100644 --- a/contracts/warp-resolver/src/tests.rs +++ b/contracts/warp-resolver/src/tests.rs @@ -1,5 +1,6 @@ use controller::account::WarpMsg; use controller::job::Execution; +use injective_cosmwasm::InjectiveQueryWrapper; use resolver::condition::{NumValue, StringEnvValue, StringValue}; use schemars::_serde_json::json; @@ -13,8 +14,9 @@ use cosmwasm_std::{ use crate::contract::query; use cosmwasm_schema::cw_serde; use cosmwasm_std::testing::{mock_info, MockApi, MockQuerier, MockStorage}; -use cosmwasm_std::{from_slice, Empty, Querier, QueryRequest, SystemError, SystemResult}; +use cosmwasm_std::{from_slice, Querier, QueryRequest, SystemError, SystemResult}; +use core::panic; use resolver::variable::{ FnValue, QueryExpr, QueryVariable, StaticVariable, Variable, VariableKind, }; @@ -77,12 +79,12 @@ pub fn mock_dependencies() -> OwnedDeps { } pub struct WasmMockQuerier { - base: MockQuerier, + base: MockQuerier, } impl Querier for WasmMockQuerier { fn raw_query(&self, bin_request: &[u8]) -> SystemResult> { - let request: QueryRequest = match from_slice(bin_request) { + let request: QueryRequest = match from_slice(bin_request) { Ok(v) => v, Err(e) => { return SystemResult::Err(SystemError::InvalidRequest { @@ -98,25 +100,53 @@ impl Querier for WasmMockQuerier { impl WasmMockQuerier { pub fn handle_query( &self, - request: &QueryRequest, + request: &QueryRequest, ) -> SystemResult> { - match &request { - QueryRequest::Wasm(WasmQuery::Smart { - contract_addr, - msg: _, - }) => { - // Mock logic for the Wasm::Smart case - // Here for simplicity, we return the contract_addr and msg as is. - - // Mock logic for the Wasm::Smart case - // Here we return a JSON object with "address" and "msg" fields. - let response: String = json!({ - "address": contract_addr, - "msg": "Mock message" - }) - .to_string(); - - SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + match request { + QueryRequest::Wasm(WasmQuery::Smart { contract_addr, msg }) => { + // Check if the query is for the vault contract address to get subaccount_id + if contract_addr == "mock_vault_contract_addr" { + // Simulate response with subaccount_id + let response = json!({ + "config": { + "base": { + "subaccount_id": "0xecde8308ee5413d67288fae2abfc94dabeb16bd9000000000000000000000022" + } + } + }); + SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + } else { + // Default mock response for other smart contract queries + let response = json!({ + "address": contract_addr, + "msg": "Mock message" + }) + .to_string(); + SystemResult::Ok(ContractResult::Ok(to_binary(&response).unwrap())) + } + } + QueryRequest::Custom(s) if s.contains("route") && s.contains("exchange") => { + // Parse the custom query to extract the subaccount_id + let query_data: InjectiveQueryWrapper = serde_json_wasm::from_str(s).unwrap(); + let _subaccount_id = match query_data.query_data { + injective_cosmwasm::InjectiveQuery::SubaccountDeposit { + subaccount_id, + denom: _, + } => subaccount_id, + _ => panic!("wtf"), + }; + + // let subaccount_id = query_data.query_data["subaccount_deposit"]["subaccount_id"].as_str().unwrap_or(""); + + // Simulate a response for available balance based on the subaccount_id + SystemResult::Ok(ContractResult::Ok( + to_binary(&json!({ + "deposits": { + "available_balance": "1000", // Mock balance + } + })) + .unwrap(), + )) } QueryRequest::Bank(BankQuery::Balance { address: contract_addr, @@ -124,13 +154,13 @@ impl WasmMockQuerier { }) => SystemResult::Ok(ContractResult::Ok( to_binary(&contract_addr.to_string()).unwrap(), )), - _ => self.base.handle_query(request), + _ => panic!("Unhandled query type in mock querier"), } } } impl WasmMockQuerier { - pub fn new(base: MockQuerier) -> Self { + pub fn new(base: MockQuerier) -> Self { WasmMockQuerier { base } } } @@ -588,3 +618,52 @@ fn test_hydrate_static_env_vars_and_hydrate_msgs() { })) ) } + +#[test] +fn test_hydrate_static_and_custom_query_vars() { + let deps = mock_dependencies(); + let env = mock_env(); + + // Assuming 'vault_contract_addr' and 'vault_strategy_denom' are known and used for the query + let vault_contract_addr = "mock_vault_contract_addr".to_string(); + + // Static variable initialization similar to the SDK code for 'subaccount_id' + let subaccount_id = Variable::Query(QueryVariable { + kind: VariableKind::String, + name: "subaccount_id".to_string(), + encode: false, + value: None, + init_fn: QueryExpr { + selector: "$.config.base.subaccount_id".to_string(), + query: QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: vault_contract_addr.clone(), + msg: to_binary(&json!({"base": {"config": {}}})).unwrap(), + }), + }, + reinitialize: true, + update_fn: None, + }); + + let next_config = Variable::Query(QueryVariable { + name: "next_config".to_string(), + kind: VariableKind::Json, + init_fn: QueryExpr { + selector: "$.config".to_string(), + query: QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: vault_contract_addr.clone(), + msg: to_binary(&json!({ "base": { "config": {} } })).unwrap(), + }), + }, + value: None, + reinitialize: true, + update_fn: None, + encode: false, + }); + + // Hydrate variables + let vars = vec![subaccount_id, next_config]; + // let vars = vec![next_config]; + let hydrated_vars = hydrate_vars(deps.as_ref(), env, vars, None, None).unwrap(); + + println!("{:?}", hydrated_vars); +} From 5e3e60a694bf055d79b1a37a515269bbf9644620 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 17:13:04 +0100 Subject: [PATCH 14/16] hydrate variables before apply_var_fn call in reply --- contracts/warp-controller/src/reply/job.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/contracts/warp-controller/src/reply/job.rs b/contracts/warp-controller/src/reply/job.rs index ee4880eb..a07e2c96 100644 --- a/contracts/warp-controller/src/reply/job.rs +++ b/contracts/warp-controller/src/reply/job.rs @@ -84,11 +84,20 @@ pub fn execute_job( "failed_invalid_job_status", )); } else { + let hydrated_vars: String = deps.querier.query_wasm_smart( + config.resolver_address.clone(), + &resolver::QueryMsg::QueryHydrateVars(resolver::QueryHydrateVarsMsg { + vars: finished_job.vars, + warp_account_addr: Some(finished_job.account.to_string()), + external_inputs: None, + }), + )?; + // vars are updated to next job iteration let new_vars: String = deps.querier.query_wasm_smart( config.resolver_address.clone(), &resolver::QueryMsg::QueryApplyVarFn(resolver::QueryApplyVarFnMsg { - vars: finished_job.vars, + vars: hydrated_vars, status: finished_job.status.clone(), warp_account_addr: Some(finished_job.account.to_string()), }), From 8daf447d9e869a131a0c4fc4798436fd1c64c1cf Mon Sep 17 00:00:00 2001 From: simke9445 Date: Tue, 19 Mar 2024 17:13:23 +0100 Subject: [PATCH 15/16] replace references on init_fn copy in hydrate_vars query --- contracts/warp-resolver/src/util/variable.rs | 74 +++++++++++++++----- 1 file changed, 55 insertions(+), 19 deletions(-) diff --git a/contracts/warp-resolver/src/util/variable.rs b/contracts/warp-resolver/src/util/variable.rs index b4437c1e..63340bdb 100644 --- a/contracts/warp-resolver/src/util/variable.rs +++ b/contracts/warp-resolver/src/util/variable.rs @@ -228,62 +228,98 @@ pub fn hydrate_vars( } Variable::Query(mut v) => { if v.reinitialize || v.value.is_none() { - v.init_fn = replace_references(v.init_fn, &hydrated_vars)?; + let replaced_init_fn = replace_references(v.init_fn.clone(), &hydrated_vars)?; match v.kind { VariableKind::String => { v.value = Some( // \"$warp.variable\" => \"VALUE"\ - resolve_query_expr_string(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_string( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Uint => { v.value = Some( - resolve_query_expr_uint(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_uint( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Int => { v.value = Some( - resolve_query_expr_int(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_int( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Decimal => { v.value = Some( - resolve_query_expr_decimal(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_decimal( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Timestamp => { v.value = Some( - resolve_query_expr_int(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_int( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Bool => { v.value = Some( - resolve_query_expr_bool(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_bool( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Amount => { v.value = Some( - resolve_query_expr_uint(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_uint( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Asset => { v.value = Some( - resolve_query_expr_string(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_string( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } VariableKind::Json => { v.value = Some( - resolve_query_expr_string(deps, env.clone(), v.init_fn.clone())? - .to_string(), + resolve_query_expr_string( + deps, + env.clone(), + replaced_init_fn.clone(), + )? + .to_string(), ) } } From bee77393067093262489e9d55048514043d5d144 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Thu, 21 Mar 2024 14:15:46 +0100 Subject: [PATCH 16/16] fix tests --- contracts/warp-resolver/src/tests.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/contracts/warp-resolver/src/tests.rs b/contracts/warp-resolver/src/tests.rs index ec0d000a..f0e6129e 100644 --- a/contracts/warp-resolver/src/tests.rs +++ b/contracts/warp-resolver/src/tests.rs @@ -249,10 +249,8 @@ fn test_hydrate_vars_nested_variables_binary_json() { init_fn: QueryExpr { selector: "$".to_string(), query: QueryRequest::Wasm(WasmQuery::Smart { - contract_addr: "contract_addr".to_string(), - msg: Binary::from( - r#"{"test":"eyJhZGRyZXNzIjoiY29udHJhY3RfYWRkciIsIm1zZyI6Ik1vY2sgbWVzc2FnZSJ9"}"#.as_bytes() - ), + contract_addr: "$warp.variable.var4".to_string(), + msg: Binary::from(r#"{"test":"$warp.variable.var1"}"#.as_bytes()), }), }, value: Some(r#"{"address":"contract_addr","msg":"Mock message"}"#.to_string()), @@ -307,8 +305,8 @@ fn test_hydrate_vars_nested_variables_binary() { init_fn: QueryExpr { selector: "$".to_string(), query: QueryRequest::Wasm(WasmQuery::Smart { - contract_addr: "static_value".to_string(), - msg: Binary::from(r#"{"test": "static_value"}"#.as_bytes()), + contract_addr: "$warp.variable.var1".to_string(), + msg: Binary::from(r#"{"test": "$warp.variable.var1"}"#.as_bytes()), }), }, value: Some(r#"{"address":"static_value","msg":"Mock message"}"#.to_string()), @@ -362,7 +360,7 @@ fn test_hydrate_vars_nested_variables_non_binary() { init_fn: QueryExpr { selector: "$".to_string(), query: QueryRequest::Bank(BankQuery::Balance { - address: "static_value".to_string(), + address: "$warp.variable.var1".to_string(), denom: "denom".to_string(), }), },