diff --git a/contracts/atomic-order-example/.circleci/config.yml b/contracts/atomic-order-example/.circleci/config.yml deleted file mode 100644 index 9b076696..00000000 --- a/contracts/atomic-order-example/.circleci/config.yml +++ /dev/null @@ -1,61 +0,0 @@ -version: 2.1 - -executors: - builder: - docker: - - image: buildpack-deps:trusty - -jobs: - docker-image: - executor: builder - steps: - - checkout - - setup_remote_docker - docker_layer_caching: true - - run: - name: Build Docker artifact - command: docker build --pull -t "cosmwasm/cw-gitpod-base:${CIRCLE_SHA1}" . - - run: - name: Push application Docker image to docker hub - command: | - if [ "${CIRCLE_BRANCH}" = "master" ]; then - docker tag "cosmwasm/cw-gitpod-base:${CIRCLE_SHA1}" cosmwasm/cw-gitpod-base:latest - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push cosmwasm/cw-gitpod-base:latest - docker logout - fi - - docker-tagged: - executor: builder - steps: - - checkout - - setup_remote_docker - docker_layer_caching: true - - run: - name: Push application Docker image to docker hub - command: | - docker tag "cosmwasm/cw-gitpod-base:${CIRCLE_SHA1}" "cosmwasm/cw-gitpod-base:${CIRCLE_TAG}" - docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS" - docker push - docker logout - -workflows: - version: 2 - test-suite: - jobs: - # this is now a slow process... let's only run on master - - docker-image: - filters: - branches: - only: - - master - - docker-tagged: - filters: - tags: - only: - - /^v.*/ - branches: - ignore: - - /.*/ - requires: - - docker-image diff --git a/contracts/atomic-order-example/Cargo.toml b/contracts/atomic-order-example/Cargo.toml index 347beaff..247bb19a 100644 --- a/contracts/atomic-order-example/Cargo.toml +++ b/contracts/atomic-order-example/Cargo.toml @@ -32,9 +32,9 @@ cosmwasm-storage = { workspace = true } cw-storage-plus = { workspace = true } cw-utils = { workspace = true } cw2 = { workspace = true } -injective-cosmwasm = { workspace = true, path = "../../packages/injective-cosmwasm" } -injective-math = { workspace = true, path = "../../packages/injective-math" } -injective-std = { workspace = true, path = "../../packages/injective-std" } +injective-cosmwasm = { path = "../../packages/injective-cosmwasm" } +injective-math = { path = "../../packages/injective-math" } +injective-std = { path = "../../packages/injective-std" } prost = { workspace = true } schemars = { workspace = true } serde = { workspace = true } diff --git a/contracts/dummy/Cargo.toml b/contracts/dummy/Cargo.toml index fb07089b..647c5406 100644 --- a/contracts/dummy/Cargo.toml +++ b/contracts/dummy/Cargo.toml @@ -30,7 +30,7 @@ optimize = """docker run --rm -v "$(pwd)":/code \ cosmwasm-std = { workspace = true } cw-storage-plus = { workspace = true } cw2 = { workspace = true } -injective-cosmwasm = { workspace = true, path = "../../packages/injective-cosmwasm" } +injective-cosmwasm = { path = "../../packages/injective-cosmwasm" } schemars = { workspace = true } serde = { workspace = true } thiserror = { workspace = true } diff --git a/contracts/injective-cosmwasm-mock/Cargo.toml b/contracts/injective-cosmwasm-mock/Cargo.toml index 4a4274b0..f30f6d2c 100644 --- a/contracts/injective-cosmwasm-mock/Cargo.toml +++ b/contracts/injective-cosmwasm-mock/Cargo.toml @@ -26,9 +26,9 @@ cosmwasm-schema = { workspace = true } cosmwasm-std = { workspace = true } cw-storage-plus = { workspace = true } cw2 = { workspace = true } -injective-cosmwasm = { workspace = true, path = "../../packages/injective-cosmwasm" } -injective-math = { workspace = true, path = "../../packages/injective-math" } -injective-std = { workspace = true, path = "../../packages/injective-std" } +injective-cosmwasm = { path = "../../packages/injective-cosmwasm" } +injective-math = { path = "../../packages/injective-math" } +injective-std = { path = "../../packages/injective-std" } prost = { workspace = true } schemars = { workspace = true } serde = { workspace = true } @@ -36,4 +36,4 @@ thiserror = { workspace = true } [dev-dependencies] injective-test-tube = { workspace = true } -injective-testing = { workspace = true, path = "../../packages/injective-testing" } +injective-testing = { path = "../../packages/injective-testing" } diff --git a/contracts/injective-cosmwasm-stargate-example/Cargo.toml b/contracts/injective-cosmwasm-stargate-example/Cargo.toml index 7ec3e677..980533d3 100644 --- a/contracts/injective-cosmwasm-stargate-example/Cargo.toml +++ b/contracts/injective-cosmwasm-stargate-example/Cargo.toml @@ -27,9 +27,9 @@ cosmwasm-schema = { workspace = true } cosmwasm-std = { workspace = true } cw-storage-plus = { workspace = true } cw2 = { workspace = true } -injective-cosmwasm = { workspace = true } -injective-math = { workspace = true } -injective-std = { workspace = true } +injective-cosmwasm = { path = "../../packages/injective-cosmwasm" } +injective-math = { path = "../../packages/injective-math" } +injective-std = { path = "../../packages/injective-std" } prost = { workspace = true } schemars = { workspace = true } serde = { workspace = true } diff --git a/contracts/injective-cosmwasm-stargate-example/src/testing/authz.rs b/contracts/injective-cosmwasm-stargate-example/src/testing/authz.rs new file mode 100644 index 00000000..250932e9 --- /dev/null +++ b/contracts/injective-cosmwasm-stargate-example/src/testing/authz.rs @@ -0,0 +1,154 @@ +use crate::{ + encode_helper::encode_proto_message, + msg::{QueryMsg, QueryStargateResponse}, + utils::{execute_all_authorizations, ExchangeType, Setup}, +}; +use cosmos_sdk_proto::cosmos::authz::v1beta1::{QueryGranteeGrantsRequest, QueryGranterGrantsRequest, QueryGrantsRequest}; +use injective_test_tube::RunnerError::QueryError; +use injective_test_tube::{Account, Module, RunnerResult, Wasm}; + +use crate::testing::type_helpers::{Authorization, Grants, StargateQueryGranteeGrantsResponse, StargateQueryGranterGrantsResponse}; +use crate::utils::get_stargate_query_result; + +#[test] +#[cfg_attr(not(feature = "integration"), ignore)] +fn test_query_grantee_grants() { + let env = Setup::new(ExchangeType::None); + let wasm = Wasm::new(&env.app); + + execute_all_authorizations(&env.app, &env.users[0].account, env.users[1].account.address().to_string()); + execute_all_authorizations(&env.app, &env.users[2].account, env.users[1].account.address().to_string()); + + let query_msg = QueryMsg::QueryStargateRaw { + path: "/cosmos.authz.v1beta1.Query/GranteeGrants".to_string(), + query_request: encode_proto_message(QueryGranteeGrantsRequest { + grantee: env.users[1].account.address().to_string(), + pagination: None, + }), + }; + + let messages = vec![ + "/injective.exchange.v1beta1.MsgBatchUpdateOrders", + "/injective.exchange.v1beta1.MsgCreateDerivativeLimitOrder", + "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrder", + "/injective.exchange.v1beta1.MsgCreateSpotLimitOrder", + "/injective.exchange.v1beta1.MsgWithdraw", + ]; + + let response_user0 = create_stargate_response( + messages.clone(), + env.users[0].account.address().to_string(), + env.users[1].account.address().to_string(), + ); + let response_user2 = create_stargate_response( + messages, + env.users[2].account.address().to_string(), + env.users[1].account.address().to_string(), + ); + + let combined_grants = response_user0 + .grants + .into_iter() + .chain(response_user2.grants.into_iter()) + .collect::>(); + let query_result = get_stargate_query_result::(wasm.query(&env.contract_address, &query_msg)).unwrap(); + + let all_grants_present = combined_grants.iter().all(|grant| query_result.grants.contains(grant)); + let no_extra_grants = combined_grants.len() == query_result.grants.len(); + + assert!(all_grants_present); + assert!(no_extra_grants); +} + +#[test] +#[cfg_attr(not(feature = "integration"), ignore)] +fn test_query_granter_grants() { + let env = Setup::new(ExchangeType::None); + let wasm = Wasm::new(&env.app); + + execute_all_authorizations(&env.app, &env.users[0].account, env.users[1].account.address().to_string()); + + let query_msg = QueryMsg::QueryStargateRaw { + path: "/cosmos.authz.v1beta1.Query/GranterGrants".to_string(), + query_request: encode_proto_message(QueryGranterGrantsRequest { + granter: env.users[0].account.address().to_string(), + pagination: None, + }), + }; + + let query_result = get_stargate_query_result::(wasm.query(&env.contract_address, &query_msg)).unwrap(); + assert_eq!(query_result.grants.len(), 5); + + let query_msg = QueryMsg::QueryStargateRaw { + path: "/cosmos.authz.v1beta1.Query/GranterGrants".to_string(), + query_request: encode_proto_message(QueryGranterGrantsRequest { + granter: env.users[2].account.address().to_string(), + pagination: None, + }), + }; + + let query_result = get_stargate_query_result::(wasm.query(&env.contract_address, &query_msg)).unwrap(); + assert_eq!(query_result.grants.len(), 0); +} + +#[test] +#[cfg_attr(not(feature = "integration"), ignore)] +fn test_query_grants() { + let env = Setup::new(ExchangeType::None); + let wasm = Wasm::new(&env.app); + + execute_all_authorizations(&env.app, &env.users[0].account, env.users[1].account.address().to_string()); + + let query_msg = QueryMsg::QueryStargateRaw { + path: "/cosmos.authz.v1beta1.Query/Grants".to_string(), + query_request: encode_proto_message(QueryGrantsRequest { + granter: env.users[0].account.address().to_string(), + grantee: env.users[1].account.address().to_string(), + msg_type_url: "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrder".to_string(), + pagination: None, + }), + }; + + let contract_response: QueryStargateResponse = wasm.query(&env.contract_address, &query_msg).unwrap(); + println!("{:?}", contract_response); + // let query_result = get_stargate_query_result::(wasm.query(&env.contract_address, &query_msg)).unwrap(); + // println!("{:?}", query_result); + + let query_msg = QueryMsg::QueryStargateRaw { + path: "/cosmos.authz.v1beta1.Query/Grants".to_string(), + query_request: encode_proto_message(QueryGrantsRequest { + granter: env.users[2].account.address().to_string(), + grantee: env.users[1].account.address().to_string(), + msg_type_url: "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrder".to_string(), + pagination: None, + }), + }; + + let contract_response: RunnerResult = wasm.query(&env.contract_address, &query_msg); + println!("{:?}", contract_response); + + if let Err(QueryError { msg }) = contract_response { + assert_eq!( + msg, "Generic error: Querier contract error: codespace: authz, code: 2: query wasm contract failed", + "The error message does not match the expected value" + ); + } else { + assert!(false, "Expected an error, but got a success: {:?}", contract_response); + } +} + +fn create_stargate_response(messages: Vec<&str>, granter: String, grantee: String) -> StargateQueryGranteeGrantsResponse { + let grants = messages + .into_iter() + .map(|msg| Grants { + granter: granter.clone(), + grantee: grantee.clone(), + authorization: Authorization { + type_str: "/cosmos.authz.v1beta1.GenericAuthorization".to_string(), + msg: msg.to_string(), + }, + }) + .collect(); + + StargateQueryGranteeGrantsResponse { grants } +} diff --git a/contracts/injective-cosmwasm-stargate-example/src/testing/mod.rs b/contracts/injective-cosmwasm-stargate-example/src/testing/mod.rs index f79a70e5..dbeede1a 100644 --- a/contracts/injective-cosmwasm-stargate-example/src/testing/mod.rs +++ b/contracts/injective-cosmwasm-stargate-example/src/testing/mod.rs @@ -1,3 +1,4 @@ +mod authz; mod test_auction; mod test_auth; mod test_bank; diff --git a/contracts/injective-cosmwasm-stargate-example/src/testing/type_helpers.rs b/contracts/injective-cosmwasm-stargate-example/src/testing/type_helpers.rs index a765f816..62d3c633 100644 --- a/contracts/injective-cosmwasm-stargate-example/src/testing/type_helpers.rs +++ b/contracts/injective-cosmwasm-stargate-example/src/testing/type_helpers.rs @@ -233,3 +233,27 @@ pub struct DenomUnit { pub struct Pagination { // Define fields based on your pagination structure, if any } + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct StargateQueryGranteeGrantsResponse { + pub grants: Vec, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct StargateQueryGranterGrantsResponse { + pub grants: Vec, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct Grants { + pub granter: String, + pub grantee: String, + pub authorization: Authorization, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct Authorization { + #[serde(rename = "@type")] + pub type_str: String, + pub msg: String, +} diff --git a/packages/injective-std/Cargo.toml b/packages/injective-std/Cargo.toml index a94f6374..ea3aaa65 100644 --- a/packages/injective-std/Cargo.toml +++ b/packages/injective-std/Cargo.toml @@ -12,7 +12,7 @@ version = "1.13.0" [dependencies] chrono = { workspace = true } cosmwasm-std = { workspace = true } -injective-std-derive = { workspace = true, path = "../injective-std-derive" } +injective-std-derive = { path = "../injective-std-derive" } prost = { workspace = true } prost-types = { workspace = true } schemars = { workspace = true } diff --git a/packages/injective-testing/Cargo.toml b/packages/injective-testing/Cargo.toml index 6b1a7a69..45fb841a 100644 --- a/packages/injective-testing/Cargo.toml +++ b/packages/injective-testing/Cargo.toml @@ -12,9 +12,9 @@ anyhow = { workspace = true } base64 = { workspace = true } cosmwasm-std = { workspace = true } cw-multi-test = { workspace = true } -injective-cosmwasm = { workspace = true, path = "../injective-cosmwasm" } -injective-math = { workspace = true, path = "../injective-math" } -injective-std = { workspace = true, path = "../injective-std" } +injective-cosmwasm = { path = "../injective-cosmwasm" } +injective-math = { path = "../injective-math" } +injective-std = { path = "../injective-std" } injective-test-tube = { workspace = true } prost = { workspace = true } rand = { workspace = true }