diff --git a/Cargo.lock b/Cargo.lock index bd7ec932..ec4e336c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -207,9 +207,9 @@ dependencies = [ [[package]] name = "cosmwasm-storage" -version = "1.0.0-beta4" +version = "1.0.0-beta5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f472c0bfd584a4510702537d0b65c5331095e76099586a12f749fd69afda9c5e" +checksum = "e7e4338d8e9934effa4594f139ce4e5f4b426796b70e2d53bb7e8605e9adf68c" dependencies = [ "cosmwasm-std", "serde", @@ -401,9 +401,9 @@ dependencies = [ [[package]] name = "cw-controllers" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bfeaf55f8dba5646cc3daddce17cd23a60f8e0c3fbacbe6735d287d7a6e33a" +checksum = "2e125c834c186f20b48106917329fae6459b41715fd1c6a4f4be4a49e4185c49" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -415,9 +415,9 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b44e3ccc6ead7e8c0ecc682e8ab634ce1dec8a2ac97b7b44e84477695adc55" +checksum = "c5363a1903f8e5dd480240fdf007177fc11b3511097a06c5601a885cf619cdd5" dependencies = [ "anyhow", "cosmwasm-std", @@ -434,9 +434,9 @@ dependencies = [ [[package]] name = "cw-storage-plus" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d7ee1963302b0ac2a9d42fe0faec826209c17452bfd36fbfd9d002a88929261" +checksum = "c087ff98fb0475db4c2b5298a5fd12b2848d2854b39d1115d930ee6da24d1eed" dependencies = [ "cosmwasm-std", "schemars", @@ -445,9 +445,9 @@ dependencies = [ [[package]] name = "cw-utils" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef842a1792e4285beff7b3b518705f760fa4111dc1e296e53f3e92d1ef7f6220" +checksum = "e3396c7aff5a0e3fb6dcc6cc89f56862c1d212b40d93ed725a6962955b1887ff" dependencies = [ "cosmwasm-std", "schemars", @@ -457,9 +457,9 @@ dependencies = [ [[package]] name = "cw2" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d81d7c359d6c1fba3aa83dad7ec6f999e512571380ae62f81257c3db569743" +checksum = "4f8a6500c396e33f6a7b05d35a5124eb3e394cdb6ca901f7e88332870407896c" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -469,9 +469,9 @@ dependencies = [ [[package]] name = "cw20" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9671d7edef5608acaf5b2f1e473ee3f501eced2cd4f7392e2106c8cf02ba0720" +checksum = "413911037f6b0106ae37ca82352f9131939ccc995aade435df47a5baf2c815f2" dependencies = [ "cosmwasm-std", "cw-utils", @@ -481,9 +481,9 @@ dependencies = [ [[package]] name = "cw4" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41445666e3f6284c72f569b2240bb52d0add94bb448e169d30ae28fe000cfaeb" +checksum = "f22da7845e99e5a277523d61c19bda3171ec3dd1084b9ca6ebac6b2fd0cdf084" dependencies = [ "cosmwasm-std", "cw-storage-plus", @@ -1647,6 +1647,7 @@ dependencies = [ "schemars", "serde", "tg-bindings", + "tg-bindings-test", "tg-utils", "tg4", "thiserror", diff --git a/contracts/tg4-engagement/Cargo.toml b/contracts/tg4-engagement/Cargo.toml index 7417ab64..411264bc 100644 --- a/contracts/tg4-engagement/Cargo.toml +++ b/contracts/tg4-engagement/Cargo.toml @@ -20,10 +20,10 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw-utils = "0.11.1" -cw2 = "0.11.1" -cw-controllers = "0.11.1" -cw-storage-plus = "0.11.1" +cw-utils = "0.12.1" +cw2 = "0.12.1" +cw-controllers = "0.12.1" +cw-storage-plus = "0.12.1" tg4 = { path = "../../packages/tg4", version = "0.6.2" } tg-utils = { version = "0.6.2", path = "../../packages/utils" } tg-bindings = { version = "0.6.2", path = "../../packages/bindings" } @@ -34,7 +34,7 @@ thiserror = { version = "1.0.21" } [dev-dependencies] cosmwasm-schema = { version = "1.0.0-beta5" } -cw-multi-test = { version = "0.11.1" } +cw-multi-test = { version = "0.12.1" } tg-bindings-test = { version = "0.6.2", path = "../../packages/bindings-test" } derivative = "2" anyhow = "1" diff --git a/contracts/tg4-engagement/src/contract.rs b/contracts/tg4-engagement/src/contract.rs index 3f57969e..a00d3005 100644 --- a/contracts/tg4-engagement/src/contract.rs +++ b/contracts/tg4-engagement/src/contract.rs @@ -1,11 +1,11 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coin, to_binary, Addr, BankMsg, Binary, Coin, Decimal, Deps, DepsMut, Empty, Env, Event, - MessageInfo, Order, StdResult, Timestamp, Uint128, + coin, to_binary, Addr, BankMsg, Binary, Coin, CustomQuery, Decimal, Deps, DepsMut, Empty, Env, + Event, MessageInfo, Order, StdResult, Timestamp, Uint128, }; use cw2::set_contract_version; -use cw_storage_plus::{Bound, PrimaryKey}; +use cw_storage_plus::Bound; use cw_utils::maybe_addr; use tg4::{ HooksResponse, Member, MemberChangedHookMsg, MemberDiff, MemberListResponse, MemberResponse, @@ -21,7 +21,7 @@ use crate::state::{ Distribution, Halflife, WithdrawAdjustment, DISTRIBUTION, HALFLIFE, PREAUTH_SLASHING, SHARES_SHIFT, SLASHERS, WITHDRAW_ADJUSTMENT, }; -use tg_bindings::{request_privileges, Privilege, PrivilegeChangeMsg, TgradeMsg}; +use tg_bindings::{request_privileges, Privilege, PrivilegeChangeMsg, TgradeMsg, TgradeQuery}; use tg_utils::{ ensure_from_older_version, members, validate_portion, Duration, ADMIN, HOOKS, PREAUTH_HOOKS, TOTAL, @@ -38,7 +38,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); // make use of the custom errors #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - deps: DepsMut, + deps: DepsMut, env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -62,8 +62,8 @@ pub fn instantiate( // create is the instantiation logic with set_contract_version removed so it can more // easily be imported in other contracts #[allow(clippy::too_many_arguments)] -pub fn create( - mut deps: DepsMut, +pub fn create( + mut deps: DepsMut, admin: Option, members_list: Vec, preauths_hooks: u64, @@ -120,7 +120,7 @@ pub fn create( // And declare a custom Error variant for the ones where you will want to make use of it #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -149,8 +149,8 @@ pub fn execute( } } -pub fn execute_add_points( - mut deps: DepsMut, +pub fn execute_add_points( + mut deps: DepsMut, env: Env, info: MessageInfo, addr: String, @@ -184,8 +184,8 @@ pub fn execute_add_points( Ok(res) } -pub fn execute_add_hook( - deps: DepsMut, +pub fn execute_add_hook( + deps: DepsMut, info: MessageInfo, hook: String, ) -> Result { @@ -205,8 +205,8 @@ pub fn execute_add_hook( Ok(res) } -pub fn execute_remove_hook( - deps: DepsMut, +pub fn execute_remove_hook( + deps: DepsMut, info: MessageInfo, hook: String, ) -> Result { @@ -229,8 +229,8 @@ pub fn execute_remove_hook( Ok(resp) } -pub fn execute_update_members( - mut deps: DepsMut, +pub fn execute_update_members( + mut deps: DepsMut, env: Env, info: MessageInfo, add: Vec, @@ -253,8 +253,8 @@ pub fn execute_update_members( Ok(res) } -pub fn execute_distribute_rewards( - deps: DepsMut, +pub fn execute_distribute_rewards( + deps: DepsMut, env: Env, info: MessageInfo, sender: Option, @@ -309,8 +309,8 @@ pub fn execute_distribute_rewards( Ok(resp) } -pub fn execute_withdraw_rewards( - deps: DepsMut, +pub fn execute_withdraw_rewards( + deps: DepsMut, info: MessageInfo, owner: Option, receiver: Option, @@ -360,8 +360,8 @@ pub fn execute_withdraw_rewards( Ok(resp) } -pub fn execute_delegate_withdrawal( - deps: DepsMut, +pub fn execute_delegate_withdrawal( + deps: DepsMut, info: MessageInfo, delegated: String, ) -> Result { @@ -390,8 +390,8 @@ pub fn execute_delegate_withdrawal( } /// Adds new slasher to contract -pub fn execute_add_slasher( - deps: DepsMut, +pub fn execute_add_slasher( + deps: DepsMut, info: MessageInfo, slasher: String, ) -> Result { @@ -410,8 +410,8 @@ pub fn execute_add_slasher( } /// Removes slasher from contract -pub fn execute_remove_slasher( - deps: DepsMut, +pub fn execute_remove_slasher( + deps: DepsMut, info: MessageInfo, slasher: String, ) -> Result { @@ -436,8 +436,8 @@ pub fn execute_remove_slasher( } /// Slashes engagement points from address -pub fn execute_slash( - mut deps: DepsMut, +pub fn execute_slash( + mut deps: DepsMut, env: Env, info: MessageInfo, addr: String, @@ -493,8 +493,8 @@ pub fn execute_slash( } /// Calculates withdrawable_rewards from distribution and adjustment info. -pub fn withdrawable_rewards( - deps: Deps, +pub fn withdrawable_rewards( + deps: Deps, owner: &Addr, distribution: &Distribution, adjustment: &WithdrawAdjustment, @@ -514,8 +514,8 @@ pub fn withdrawable_rewards( Ok(coin(amount, &distribution.denom)) } -pub fn sudo_add_member( - mut deps: DepsMut, +pub fn sudo_add_member( + mut deps: DepsMut, env: Env, add: Member, ) -> Result { @@ -534,8 +534,8 @@ pub fn sudo_add_member( } // the logic from execute_update_members extracted for easier import -pub fn update_members( - mut deps: DepsMut, +pub fn update_members( + mut deps: DepsMut, height: u64, to_add: Vec, to_remove: Vec, @@ -583,8 +583,8 @@ pub fn update_members( /// `shares_per_point` is current value from `SHARES_PER_POINT` - not loaded in function, to /// avoid multiple queries on bulk updates. /// `diff` is the points change -pub fn apply_points_correction( - deps: DepsMut, +pub fn apply_points_correction( + deps: DepsMut, addr: &Addr, shares_per_point: u128, diff: i128, @@ -606,7 +606,7 @@ pub fn apply_points_correction( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn sudo(deps: DepsMut, env: Env, msg: SudoMsg) -> Result { +pub fn sudo(deps: DepsMut, env: Env, msg: SudoMsg) -> Result { match msg { SudoMsg::UpdateMember(member) => sudo_add_member(deps, env, member), SudoMsg::PrivilegeChange(PrivilegeChangeMsg::Promoted {}) => privilege_promote(deps), @@ -615,7 +615,7 @@ pub fn sudo(deps: DepsMut, env: Env, msg: SudoMsg) -> Result Result { +fn privilege_promote(deps: DepsMut) -> Result { if HALFLIFE.load(deps.storage)?.halflife.is_some() { let msgs = request_privileges(&[Privilege::EndBlocker]); Ok(Response::new().add_submessages(msgs)) @@ -628,7 +628,7 @@ fn points_reduction(points: u64) -> u64 { points - (points / 2) } -fn end_block(mut deps: DepsMut, env: Env) -> Result { +fn end_block(mut deps: DepsMut, env: Env) -> Result { let resp = Response::new(); // If duration of half life added to timestamp of last applied @@ -693,7 +693,7 @@ fn end_block(mut deps: DepsMut, env: Env) -> Result { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { Member { @@ -732,12 +732,16 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { } } -fn query_total_points(deps: Deps) -> StdResult { +fn query_total_points(deps: Deps) -> StdResult { let points = TOTAL.load(deps.storage)?; Ok(TotalPointsResponse { points }) } -fn query_member(deps: Deps, addr: String, height: Option) -> StdResult { +fn query_member( + deps: Deps, + addr: String, + height: Option, +) -> StdResult { let addr = deps.api.addr_validate(&addr)?; let points = match height { Some(h) => members().may_load_at_height(deps.storage, &addr, h), @@ -746,7 +750,10 @@ fn query_member(deps: Deps, addr: String, height: Option) -> StdResult StdResult { +pub fn query_withdrawable_rewards( + deps: Deps, + owner: String, +) -> StdResult { // Not checking address, as if it is invalid it is guaranteed not to appear in maps, so // `withdrawable_rewards` would return error itself. let owner = Addr::unchecked(&owner); @@ -763,7 +770,10 @@ pub fn query_withdrawable_rewards(deps: Deps, owner: String) -> StdResult StdResult { +pub fn query_undistributed_rewards( + deps: Deps, + env: Env, +) -> StdResult { let distribution = DISTRIBUTION.load(deps.storage)?; let balance = deps .querier @@ -778,14 +788,17 @@ pub fn query_undistributed_rewards(deps: Deps, env: Env) -> StdResult StdResult { +pub fn query_distributed_rewards(deps: Deps) -> StdResult { let distribution = DISTRIBUTION.load(deps.storage)?; Ok(RewardsResponse { rewards: coin(distribution.distributed_total.into(), &distribution.denom), }) } -pub fn query_delegated(deps: Deps, owner: String) -> StdResult { +pub fn query_delegated( + deps: Deps, + owner: String, +) -> StdResult { let owner = deps.api.addr_validate(&owner)?; let delegated = WITHDRAW_ADJUSTMENT @@ -795,7 +808,7 @@ pub fn query_delegated(deps: Deps, owner: String) -> StdResult StdResult { +fn query_halflife(deps: Deps) -> StdResult { let Halflife { halflife, last_applied: last_halflife, @@ -818,14 +831,14 @@ fn query_halflife(deps: Deps) -> StdResult { const MAX_LIMIT: u32 = 100; const DEFAULT_LIMIT: u32 = 30; -fn list_members( - deps: Deps, +fn list_members( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; let addr = maybe_addr(deps.api, start_after)?; - let start = addr.map(|addr| Bound::exclusive(addr.as_ref())); + let start = addr.as_ref().map(Bound::exclusive); let members: StdResult> = members() .range(deps.storage, start, None, Order::Ascending) @@ -842,13 +855,19 @@ fn list_members( Ok(MemberListResponse { members: members? }) } -fn list_members_by_points( - deps: Deps, +fn list_members_by_points( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; - let start = start_after.map(|m| Bound::exclusive((m.points, m.addr.as_str()).joined_key())); + let start = start_after + .map(|m| { + deps.api + .addr_validate(&m.addr) + .map(|addr| Bound::exclusive((m.points, addr))) + }) + .transpose()?; let members: StdResult> = members() .idx .points @@ -878,11 +897,12 @@ mod tests { use crate::i128::Int128; - use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}; + use cosmwasm_std::testing::{mock_env, mock_info}; use cosmwasm_std::{from_slice, Api, OwnedDeps, Querier, StdError, Storage}; use cw_controllers::AdminError; use cw_storage_plus::Map; use tg4::{member_key, TOTAL_KEY}; + use tg_bindings_test::mock_deps_tgrade; use tg_utils::{HookError, PreauthError}; const INIT_ADMIN: &str = "ADMIN"; @@ -899,7 +919,7 @@ mod tests { env } - fn do_instantiate(deps: DepsMut) { + fn do_instantiate(deps: DepsMut) { let msg = InstantiateMsg { admin: Some(INIT_ADMIN.into()), members: vec![ @@ -923,7 +943,7 @@ mod tests { #[test] fn proper_instantiation() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // it worked, let's query the state @@ -970,7 +990,7 @@ mod tests { #[test] fn try_member_queries() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let member1 = query_member(deps.as_ref(), USER1.into(), None).unwrap(); @@ -1039,7 +1059,7 @@ mod tests { #[test] fn try_list_members_by_points() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let members = list_members_by_points(deps.as_ref(), None, None) @@ -1100,7 +1120,7 @@ mod tests { #[test] fn try_halflife_queries() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let HalflifeInfo { @@ -1126,7 +1146,7 @@ mod tests { #[test] fn try_halflife_query_when_no_halflife() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); let msg = InstantiateMsg { admin: Some(INIT_ADMIN.into()), members: vec![ @@ -1153,7 +1173,7 @@ mod tests { #[test] fn handle_non_utf8_in_members_list() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // make sure we get 2 members as expected, no error @@ -1173,7 +1193,7 @@ mod tests { #[track_caller] fn assert_users( - deps: &OwnedDeps, + deps: &OwnedDeps, user1_points: Option, user2_points: Option, user3_points: Option, @@ -1206,7 +1226,7 @@ mod tests { #[test] fn add_new_remove_old_member() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // add a new one and remove existing one @@ -1247,7 +1267,7 @@ mod tests { #[test] fn add_old_remove_new_member() { // add will over-write and remove have no effect - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // add a new one and remove existing one @@ -1268,7 +1288,7 @@ mod tests { #[test] fn add_and_remove_same_member() { // add will over-write and remove have no effect - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // USER1 is updated and remove in the same call, we should remove this an add member3 @@ -1294,7 +1314,7 @@ mod tests { #[test] fn sudo_add_new_member() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // add a new member @@ -1329,7 +1349,7 @@ mod tests { #[test] fn sudo_update_existing_member() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // update an existing member @@ -1365,7 +1385,7 @@ mod tests { #[test] fn add_remove_hooks() { // add will over-write and remove have no effect - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let hooks = HOOKS.list_hooks(&deps.storage).unwrap(); @@ -1442,7 +1462,7 @@ mod tests { #[test] fn hooks_fire() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let hooks = HOOKS.list_hooks(&deps.storage).unwrap(); @@ -1507,7 +1527,7 @@ mod tests { #[test] fn raw_queries_work() { // add will over-write and remove have no effect - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); // get total from raw key @@ -1527,7 +1547,7 @@ mod tests { #[test] fn halflife_workflow() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let mut env = mock_env(); @@ -1575,7 +1595,7 @@ mod tests { #[test] fn add_to_existing_member() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let env = mock_env(); @@ -1588,7 +1608,7 @@ mod tests { #[test] fn add_to_nonexisting_member() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let env = mock_env(); @@ -1603,7 +1623,7 @@ mod tests { #[test] fn slash_nonexisting_user() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut()); let user1 = Addr::unchecked(USER1); diff --git a/contracts/tg4-engagement/src/multitest/suite.rs b/contracts/tg4-engagement/src/multitest/suite.rs index ae683d4d..cad26f5b 100644 --- a/contracts/tg4-engagement/src/multitest/suite.rs +++ b/contracts/tg4-engagement/src/multitest/suite.rs @@ -5,11 +5,11 @@ use cosmwasm_std::{Addr, Coin, CosmosMsg, Decimal, StdResult}; use cw_multi_test::{AppResponse, Contract, ContractWrapper, CosmosRouter, Executor}; use derivative::Derivative; use tg4::{Member, MemberListResponse}; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; use tg_bindings_test::TgradeApp; use tg_utils::Duration; -pub fn contract_engagement() -> Box> { +fn contract_engagement() -> Box> { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, diff --git a/contracts/tg4-group/Cargo.toml b/contracts/tg4-group/Cargo.toml index 24dd7330..9ce11a8d 100644 --- a/contracts/tg4-group/Cargo.toml +++ b/contracts/tg4-group/Cargo.toml @@ -26,12 +26,12 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw-utils = "0.11.1" -cw2 = "0.11.1" -cw4 = "0.11.1" +cw-utils = "0.12.1" +cw2 = "0.12.1" +cw4 = "0.12.1" tg4 = { version = "0.6.2", path = "../../packages/tg4" } -cw-controllers = "0.11.1" -cw-storage-plus = "0.11.1" +cw-controllers = "0.12.1" +cw-storage-plus = "0.12.1" cosmwasm-std = { version = "1.0.0-beta5" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/tg4-group/src/contract.rs b/contracts/tg4-group/src/contract.rs index 72704764..dcfb9e7d 100644 --- a/contracts/tg4-group/src/contract.rs +++ b/contracts/tg4-group/src/contract.rs @@ -189,7 +189,7 @@ fn list_members( ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; let addr = maybe_addr(deps.api, start_after)?; - let start = addr.map(|addr| Bound::exclusive(addr.as_ref())); + let start = addr.as_ref().map(Bound::exclusive); let members = MEMBERS .range(deps.storage, start, None, Order::Ascending) diff --git a/contracts/tg4-mixer/Cargo.toml b/contracts/tg4-mixer/Cargo.toml index e1878da0..1951faca 100644 --- a/contracts/tg4-mixer/Cargo.toml +++ b/contracts/tg4-mixer/Cargo.toml @@ -23,10 +23,10 @@ library = [] benches = [ "cosmwasm-vm" ] [dependencies] -cw-utils = "0.11.1" -cw2 = "0.11.1" -cw20 = "0.11.1" -cw-storage-plus = "0.11.1" +cw-utils = "0.12.1" +cw2 = "0.12.1" +cw20 = "0.12.1" +cw-storage-plus = "0.12.1" tg4 = { path = "../../packages/tg4", version = "0.6.2" } tg-utils = { path = "../../packages/utils", version = "0.6.2" } tg-bindings = { path = "../../packages/bindings", version = "0.6.2" } @@ -42,10 +42,8 @@ rust_decimal_macros = { version = "1.16", default-features = false } cosmwasm-vm = { version = "1.0.0-beta5", optional = true } [dev-dependencies] -cw-multi-test = { version = "0.11.1" } cosmwasm-schema = { version = "1.0.0-beta5" } -# version's workaround for issue with cyclic dependencies during cargo publish -# https://github.com/rust-lang/cargo/issues/4242 +cw-multi-test = { version = "0.12.1" } tg4-engagement = { path = "../tg4-engagement", version = "0.6.2", features = ["library"] } tg4-stake = { path = "../tg4-stake", version = "0.6.2", features = ["library"] } diff --git a/contracts/tg4-mixer/src/contract.rs b/contracts/tg4-mixer/src/contract.rs index 5ca73880..2ad9e308 100644 --- a/contracts/tg4-mixer/src/contract.rs +++ b/contracts/tg4-mixer/src/contract.rs @@ -1,15 +1,15 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, Decimal, Deps, DepsMut, Empty, Env, MessageInfo, Order, StdError, - StdResult, + to_binary, Addr, Binary, CustomQuery, Decimal, Deps, DepsMut, Empty, Env, MessageInfo, Order, + StdError, StdResult, }; use cw2::set_contract_version; -use cw_storage_plus::{Bound, PrimaryKey}; +use cw_storage_plus::Bound; use cw_utils::maybe_addr; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; use tg_utils::{ ensure_from_older_version, members, validate_portion, SlashMsg, HOOKS, PREAUTH_HOOKS, PREAUTH_SLASHING, SLASHERS, TOTAL, @@ -37,7 +37,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - deps: DepsMut, + deps: DepsMut, env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -80,7 +80,10 @@ pub fn instantiate( Ok(res) } -fn verify_tg4_input(deps: Deps, addr: &str) -> Result { +fn verify_tg4_input( + deps: Deps, + addr: &str, +) -> Result { let contract = Tg4Contract(deps.api.addr_validate(addr)?); if !contract.is_tg4(&deps.querier) { return Err(ContractError::NotTg4(addr.into())); @@ -90,8 +93,8 @@ fn verify_tg4_input(deps: Deps, addr: &str) -> Result = Some(30); -fn initialize_members( - deps: DepsMut, +fn initialize_members( + deps: DepsMut, groups: Groups, poe_function: &dyn PoEFunction, height: u64, @@ -123,7 +126,7 @@ fn initialize_members( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -138,8 +141,8 @@ pub fn execute( } } -pub fn execute_member_changed( - mut deps: DepsMut, +pub fn execute_member_changed( + mut deps: DepsMut, env: Env, info: MessageInfo, changes: MemberChangedHookMsg, @@ -184,8 +187,8 @@ pub fn execute_member_changed( } // the logic from execute_update_members extracted for easier re-usability -pub fn update_members( - deps: DepsMut, +pub fn update_members( + deps: DepsMut, height: u64, query_group: Tg4Contract, changes: Vec, @@ -226,8 +229,8 @@ pub fn update_members( Ok(MemberChangedHookMsg { diffs }) } -pub fn execute_add_hook( - deps: DepsMut, +pub fn execute_add_hook( + deps: DepsMut, info: MessageInfo, hook: String, ) -> Result { @@ -245,8 +248,8 @@ pub fn execute_add_hook( Ok(res) } -pub fn execute_remove_hook( - deps: DepsMut, +pub fn execute_remove_hook( + deps: DepsMut, info: MessageInfo, hook: String, ) -> Result { @@ -269,8 +272,8 @@ pub fn execute_remove_hook( Ok(res) } -pub fn execute_add_slasher( - deps: DepsMut, +pub fn execute_add_slasher( + deps: DepsMut, info: MessageInfo, slasher: String, ) -> Result { @@ -288,8 +291,8 @@ pub fn execute_add_slasher( Ok(res) } -pub fn execute_remove_slasher( - deps: DepsMut, +pub fn execute_remove_slasher( + deps: DepsMut, info: MessageInfo, slasher: String, ) -> Result { @@ -312,8 +315,8 @@ pub fn execute_remove_slasher( Ok(res) } -pub fn execute_slash( - deps: DepsMut, +pub fn execute_slash( + deps: DepsMut, _env: Env, info: MessageInfo, addr: String, @@ -344,7 +347,7 @@ pub fn execute_slash( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { Member { @@ -382,12 +385,12 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } } -fn query_total_points(deps: Deps) -> StdResult { +fn query_total_points(deps: Deps) -> StdResult { let points = TOTAL.load(deps.storage)?; Ok(TotalPointsResponse { points }) } -fn query_groups(deps: Deps) -> StdResult { +fn query_groups(deps: Deps) -> StdResult { let groups = GROUPS.load(deps.storage)?; Ok(GroupsResponse { left: groups.left.0.into(), @@ -395,7 +398,11 @@ fn query_groups(deps: Deps) -> StdResult { }) } -fn query_member(deps: Deps, addr: String, height: Option) -> StdResult { +fn query_member( + deps: Deps, + addr: String, + height: Option, +) -> StdResult { let addr = deps.api.addr_validate(&addr)?; let points = match height { Some(h) => members().may_load_at_height(deps.storage, &addr, h), @@ -408,14 +415,14 @@ fn query_member(deps: Deps, addr: String, height: Option) -> StdResult( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; let addr = maybe_addr(deps.api, start_after)?; - let start = addr.map(|addr| Bound::exclusive(addr.as_ref())); + let start = addr.as_ref().map(Bound::exclusive); let members: StdResult> = members() .range(deps.storage, start, None, Order::Ascending) @@ -432,13 +439,19 @@ fn list_members( Ok(MemberListResponse { members: members? }) } -fn list_members_by_points( - deps: Deps, +fn list_members_by_points( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; - let start = start_after.map(|m| Bound::exclusive((m.points, m.addr).joined_key())); + let start = start_after + .map(|m| { + deps.api + .addr_validate(&m.addr) + .map(|addr| Bound::exclusive((m.points, addr))) + }) + .transpose()?; let members: StdResult> = members() .idx .points @@ -456,8 +469,8 @@ fn list_members_by_points( Ok(MemberListResponse { members: members? }) } -pub fn query_mixer_function( - deps: Deps, +pub fn query_mixer_function( + deps: Deps, stake: u64, engagement: u64, poe_function: Option, @@ -472,7 +485,11 @@ pub fn query_mixer_function( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { +pub fn migrate( + deps: DepsMut, + _env: Env, + _msg: Empty, +) -> Result { ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; Ok(Response::new()) } @@ -483,7 +500,7 @@ mod tests { use crate::msg::PoEFunctionType; use cosmwasm_std::{coins, Addr, BankMsg, Uint128}; use cw_multi_test::{next_block, AppBuilder, BasicApp, Contract, ContractWrapper, Executor}; - use tg_bindings::TgradeMsg; + use tg_bindings::{TgradeMsg, TgradeQuery}; const STAKE_DENOM: &str = "utgd"; const OWNER: &str = "owner"; @@ -502,7 +519,7 @@ mod tests { } } - pub fn contract_mixer() -> Box> { + pub fn contract_mixer() -> Box> { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, @@ -511,7 +528,7 @@ mod tests { Box::new(contract) } - pub fn contract_group() -> Box> { + pub fn contract_group() -> Box> { let contract = ContractWrapper::new( tg4_engagement::contract::execute, tg4_engagement::contract::instantiate, @@ -520,7 +537,7 @@ mod tests { Box::new(contract) } - pub fn contract_staking() -> Box> { + pub fn contract_staking() -> Box> { let contract = ContractWrapper::new( tg4_stake::contract::execute, tg4_stake::contract::instantiate, @@ -530,7 +547,7 @@ mod tests { } // uploads code and returns address of group contract - fn instantiate_group(app: &mut BasicApp, members: Vec) -> Addr { + fn instantiate_group(app: &mut BasicApp, members: Vec) -> Addr { let admin = Some(OWNER.into()); let group_id = app.store_code(contract_group()); let msg = tg4_engagement::msg::InstantiateMsg { @@ -546,7 +563,10 @@ mod tests { } // uploads code and returns address of group contract - fn instantiate_staking(app: &mut BasicApp, stakers: Vec) -> Addr { + fn instantiate_staking( + app: &mut BasicApp, + stakers: Vec, + ) -> Addr { let admin = Some(OWNER.into()); let group_id = app.store_code(contract_staking()); let msg = tg4_stake::msg::InstantiateMsg { @@ -585,7 +605,11 @@ mod tests { contract } - fn instantiate_mixer(app: &mut BasicApp, left: &Addr, right: &Addr) -> Addr { + fn instantiate_mixer( + app: &mut BasicApp, + left: &Addr, + right: &Addr, + ) -> Addr { let flex_id = app.store_code(contract_mixer()); let msg = crate::msg::InstantiateMsg { left_group: left.to_string(), @@ -603,7 +627,10 @@ mod tests { /// and connectioning them all to the mixer. /// /// Returns (mixer address, group address, staking address). - fn setup_test_case(app: &mut BasicApp, stakers: Vec) -> (Addr, Addr, Addr) { + fn setup_test_case( + app: &mut BasicApp, + stakers: Vec, + ) -> (Addr, Addr, Addr) { // 1. Instantiate group contract with members (and OWNER as admin) let members = vec![ member(OWNER, 0), @@ -629,7 +656,7 @@ mod tests { #[allow(clippy::too_many_arguments)] fn check_membership( - app: &BasicApp, + app: &BasicApp, mixer_addr: &Addr, owner: Option, voter1: Option, diff --git a/contracts/tg4-stake/Cargo.toml b/contracts/tg4-stake/Cargo.toml index 5087b73c..aa57dd9e 100644 --- a/contracts/tg4-stake/Cargo.toml +++ b/contracts/tg4-stake/Cargo.toml @@ -20,10 +20,10 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw-utils = "0.11.1" -cw2 = "0.11.1" -cw-controllers = "0.11.1" -cw-storage-plus = "0.11.1" +cw-utils = "0.12.1" +cw2 = "0.12.1" +cw-controllers = "0.12.1" +cw-storage-plus = "0.12.1" tg4 = { path = "../../packages/tg4", version = "0.6.2" } tg-utils = { path = "../../packages/utils", version = "0.6.2" } tg-bindings = { path = "../../packages/bindings", version = "0.6.2" } @@ -35,3 +35,4 @@ itertools = "0.10" [dev-dependencies] cosmwasm-schema = { version = "1.0.0-beta5" } +tg-bindings-test = { path = "../../packages/bindings-test", version = "0.6.2" } diff --git a/contracts/tg4-stake/src/claim.rs b/contracts/tg4-stake/src/claim.rs index 63580c23..05b186bc 100644 --- a/contracts/tg4-stake/src/claim.rs +++ b/contracts/tg4-stake/src/claim.rs @@ -5,8 +5,10 @@ use itertools::Itertools; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use cosmwasm_std::{Addr, BlockInfo, Decimal, Deps, Order, StdResult, Storage, Uint128}; -use cw_storage_plus::{Bound, Index, IndexList, IndexedMap, MultiIndex, PrimaryKey}; +use cosmwasm_std::{ + Addr, BlockInfo, CustomQuery, Decimal, Deps, Order, StdResult, Storage, Uint128, +}; +use cw_storage_plus::{Bound, Index, IndexList, IndexedMap, MultiIndex, PrefixBound}; use tg_utils::Expiration; // settings for pagination @@ -30,7 +32,7 @@ pub struct Claim { struct ClaimIndexes<'a> { // Last type param defines the pk deserialization type - pub release_at: MultiIndex<'a, u64, Claim>, + pub release_at: MultiIndex<'a, u64, Claim, (Addr, u64)>, } impl<'a> IndexList for ClaimIndexes<'a> { @@ -121,9 +123,7 @@ impl<'a> Claims<'a> { .range_raw( storage, None, - Some(Bound::inclusive( - Expiration::now(block).as_key().joined_key(), - )), + Some(Bound::inclusive(Expiration::now(block).as_key())), Order::Ascending, ); @@ -144,24 +144,15 @@ impl<'a> Claims<'a> { block: &BlockInfo, limit: impl Into>, ) -> StdResult> { - // Technically it should not be needed, and it should be enough to call for - // `Bound::inclusive` range, but its implementation seems to be buggy. As claim expiration - // is measured in seconds, offsetting it by 1ns would make and querying exclusive range - // would have expected behavior. - // Note: This is solved by `prefix_range_raw` + `PrefixBound::inclusive` - // (after https://github.com/CosmWasm/cw-plus/pull/616) - let excluded_timestamp = block.time.plus_nanos(1); let claims = self .claims .idx .release_at // take all claims which are expired (at most same timestamp as current block) - .range_raw( + .prefix_range_raw( storage, None, - Some(Bound::exclusive(self.claims.idx.release_at.index_key( - Expiration::at_timestamp(excluded_timestamp).as_key(), - ))), + Some(PrefixBound::inclusive(block.time.nanos())), Order::Ascending, ); @@ -246,15 +237,15 @@ impl<'a> Claims<'a> { Ok(total_slashed) } - pub fn query_claims( + pub fn query_claims( &self, - deps: Deps, + deps: Deps, address: Addr, limit: Option, start_after: Option, ) -> StdResult> { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; - let start = start_after.map(|s| Bound::exclusive_int(s.as_key())); + let start = start_after.map(|s| Bound::exclusive(s.as_key())); self.claims .prefix(&address) diff --git a/contracts/tg4-stake/src/contract.rs b/contracts/tg4-stake/src/contract.rs index 9679788a..cd194ae1 100644 --- a/contracts/tg4-stake/src/contract.rs +++ b/contracts/tg4-stake/src/contract.rs @@ -1,17 +1,19 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coin, coins, to_binary, Addr, BankMsg, Binary, Coin, Decimal, Deps, DepsMut, Empty, Env, - MessageInfo, Order, StdResult, Storage, Uint128, + coin, coins, to_binary, Addr, BankMsg, Binary, Coin, CustomQuery, Decimal, Deps, DepsMut, + Empty, Env, MessageInfo, Order, StdResult, Storage, Uint128, }; use cw2::set_contract_version; -use cw_storage_plus::{Bound, PrimaryKey}; +use cw_storage_plus::Bound; use cw_utils::maybe_addr; use tg4::{ HooksResponse, Member, MemberChangedHookMsg, MemberDiff, MemberListResponse, MemberResponse, }; -use tg_bindings::{request_privileges, Privilege, PrivilegeChangeMsg, TgradeMsg, TgradeSudoMsg}; +use tg_bindings::{ + request_privileges, Privilege, PrivilegeChangeMsg, TgradeMsg, TgradeQuery, TgradeSudoMsg, +}; use tg_utils::{ ensure_from_older_version, members, validate_portion, Duration, ADMIN, HOOKS, PREAUTH_HOOKS, PREAUTH_SLASHING, SLASHERS, TOTAL, @@ -35,7 +37,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); // make use of the custom errors #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - mut deps: DepsMut, + mut deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -71,7 +73,7 @@ pub fn instantiate( // And declare a custom Error variant for the ones where you will want to make use of it #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -94,8 +96,8 @@ pub fn execute( } } -pub fn execute_add_hook( - deps: DepsMut, +pub fn execute_add_hook( + deps: DepsMut, info: MessageInfo, hook: String, ) -> Result { @@ -115,8 +117,8 @@ pub fn execute_add_hook( Ok(res) } -pub fn execute_remove_hook( - deps: DepsMut, +pub fn execute_remove_hook( + deps: DepsMut, info: MessageInfo, hook: String, ) -> Result { @@ -139,7 +141,11 @@ pub fn execute_remove_hook( Ok(res) } -pub fn execute_bond(deps: DepsMut, env: Env, info: MessageInfo) -> Result { +pub fn execute_bond( + deps: DepsMut, + env: Env, + info: MessageInfo, +) -> Result { let cfg = CONFIG.load(deps.storage)?; let amount = validate_funds(&info.funds, &cfg.denom)?; @@ -157,8 +163,8 @@ pub fn execute_bond(deps: DepsMut, env: Env, info: MessageInfo) -> Result( + deps: DepsMut, env: Env, info: MessageInfo, amount: Uint128, @@ -196,8 +202,8 @@ pub fn execute_unbond( Ok(res) } -pub fn execute_add_slasher( - deps: DepsMut, +pub fn execute_add_slasher( + deps: DepsMut, info: MessageInfo, slasher: String, ) -> Result { @@ -217,8 +223,8 @@ pub fn execute_add_slasher( Ok(res) } -pub fn execute_remove_slasher( - deps: DepsMut, +pub fn execute_remove_slasher( + deps: DepsMut, info: MessageInfo, slasher: String, ) -> Result { @@ -241,8 +247,8 @@ pub fn execute_remove_slasher( Ok(res) } -pub fn execute_slash( - deps: DepsMut, +pub fn execute_slash( + deps: DepsMut, env: Env, info: MessageInfo, addr: String, @@ -354,8 +360,8 @@ fn calc_points(stake: Uint128, cfg: &Config) -> Option { } } -pub fn execute_claim( - deps: DepsMut, +pub fn execute_claim( + deps: DepsMut, env: Env, info: MessageInfo, ) -> Result { @@ -389,7 +395,11 @@ fn coins_to_string(coins: &[Coin]) -> String { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn sudo(deps: DepsMut, env: Env, msg: TgradeSudoMsg) -> Result { +pub fn sudo( + deps: DepsMut, + env: Env, + msg: TgradeSudoMsg, +) -> Result { match msg { TgradeSudoMsg::PrivilegeChange(PrivilegeChangeMsg::Promoted {}) => privilege_promote(deps), TgradeSudoMsg::EndBlock {} => end_block(deps, env), @@ -397,7 +407,7 @@ pub fn sudo(deps: DepsMut, env: Env, msg: TgradeSudoMsg) -> Result Result { +fn privilege_promote(deps: DepsMut) -> Result { let config = CONFIG.load(deps.storage)?; if config.auto_return_limit > 0 { @@ -408,7 +418,7 @@ fn privilege_promote(deps: DepsMut) -> Result { } } -fn end_block(deps: DepsMut, env: Env) -> Result { +fn end_block(deps: DepsMut, env: Env) -> Result { let mut resp = Response::new(); let config = CONFIG.load(deps.storage)?; @@ -420,8 +430,8 @@ fn end_block(deps: DepsMut, env: Env) -> Result { Ok(resp) } -fn release_expired_claims( - deps: DepsMut, +fn release_expired_claims( + deps: DepsMut, env: Env, config: Config, ) -> Result, ContractError> { @@ -440,7 +450,7 @@ fn release_expired_claims( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { Configuration {} => to_binary(&CONFIG.load(deps.storage)?), @@ -489,13 +499,13 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { } } -fn query_total_points(deps: Deps) -> StdResult { +fn query_total_points(deps: Deps) -> StdResult { let points = TOTAL.load(deps.storage)?; let denom = CONFIG.load(deps.storage)?.denom; Ok(TotalPointsResponse { points, denom }) } -pub fn query_staked(deps: Deps, addr: String) -> StdResult { +pub fn query_staked(deps: Deps, addr: String) -> StdResult { let addr = deps.api.addr_validate(&addr)?; let stake = STAKE.may_load(deps.storage, &addr)?.unwrap_or_default(); let config = CONFIG.load(deps.storage)?; @@ -505,7 +515,11 @@ pub fn query_staked(deps: Deps, addr: String) -> StdResult { }) } -fn query_member(deps: Deps, addr: String, height: Option) -> StdResult { +fn query_member( + deps: Deps, + addr: String, + height: Option, +) -> StdResult { let addr = deps.api.addr_validate(&addr)?; let points = match height { Some(h) => members().may_load_at_height(deps.storage, &addr, h), @@ -518,14 +532,14 @@ fn query_member(deps: Deps, addr: String, height: Option) -> StdResult( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; let addr = maybe_addr(deps.api, start_after)?; - let start = addr.map(|addr| Bound::exclusive(addr.as_ref())); + let start = addr.as_ref().map(Bound::exclusive); let members: StdResult> = members() .range(deps.storage, start, None, Order::Ascending) @@ -542,13 +556,19 @@ fn list_members( Ok(MemberListResponse { members: members? }) } -fn list_members_by_points( - deps: Deps, +fn list_members_by_points( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; - let start = start_after.map(|m| Bound::exclusive((m.points, m.addr.as_str()).joined_key())); + let start = start_after + .map(|m| { + deps.api + .addr_validate(&m.addr) + .map(|addr| Bound::exclusive((m.points, addr))) + }) + .transpose()?; let members: StdResult> = members() .idx @@ -568,7 +588,11 @@ fn list_members_by_points( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result { +pub fn migrate( + deps: DepsMut, + _env: Env, + _msg: Empty, +) -> Result { ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; Ok(Response::new()) } @@ -576,7 +600,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result) { do_instantiate(deps, TOKENS_PER_POINT, MIN_BOND, UNBONDING_DURATION, 0) } fn do_instantiate( - deps: DepsMut, + deps: DepsMut, tokens_per_point: Uint128, min_bond: Uint128, unbonding_period: u64, @@ -621,7 +646,13 @@ mod tests { instantiate(deps, mock_env(), info, msg).unwrap(); } - fn bond(mut deps: DepsMut, user1: u128, user2: u128, user3: u128, height_delta: u64) { + fn bond( + mut deps: DepsMut, + user1: u128, + user2: u128, + user3: u128, + height_delta: u64, + ) { let mut env = mock_env(); env.block.height += height_delta; @@ -635,7 +666,7 @@ mod tests { } fn unbond( - mut deps: DepsMut, + mut deps: DepsMut, user1: u128, user2: u128, user3: u128, @@ -659,7 +690,7 @@ mod tests { #[test] fn proper_instantiation() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // it worked, let's query the state @@ -686,7 +717,7 @@ mod tests { #[test] fn unbonding_period_query_works() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let raw = query(deps.as_ref(), mock_env(), QueryMsg::UnbondingPeriod {}).unwrap(); @@ -694,7 +725,7 @@ mod tests { assert_eq!(res.unbonding_period, Duration::new(UNBONDING_DURATION)); } - fn get_member(deps: Deps, addr: String, at_height: Option) -> Option { + fn get_member(deps: Deps, addr: String, at_height: Option) -> Option { let raw = query(deps, mock_env(), QueryMsg::Member { addr, at_height }).unwrap(); let res: MemberResponse = from_slice(&raw).unwrap(); res.points @@ -702,7 +733,7 @@ mod tests { // this tests the member queries fn assert_users( - deps: Deps, + deps: Deps, user1_points: Option, user2_points: Option, user3_points: Option, @@ -740,7 +771,12 @@ mod tests { } // this tests the member queries - fn assert_stake(deps: Deps, user1_stake: u128, user2_stake: u128, user3_stake: u128) { + fn assert_stake( + deps: Deps, + user1_stake: u128, + user2_stake: u128, + user3_stake: u128, + ) { let stake1 = query_staked(deps, USER1.into()).unwrap(); assert_eq!(stake1.stake, coin(user1_stake, DENOM)); @@ -753,7 +789,7 @@ mod tests { #[test] fn bond_stake_adds_membership() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let height = mock_env().block.height; @@ -783,7 +819,7 @@ mod tests { #[test] fn try_member_queries() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -851,7 +887,7 @@ mod tests { #[test] fn try_list_members_by_points() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); bond(deps.as_mut(), 11_000, 6_500, 5_000, 1); @@ -926,7 +962,7 @@ mod tests { #[test] fn unbond_stake_update_membership() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let height = mock_env().block.height; @@ -971,7 +1007,7 @@ mod tests { #[test] fn raw_queries_work() { // add will over-write and remove have no effect - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // Set values as (11, 6, None) bond(deps.as_mut(), 11_000, 6_000, 0, 1); @@ -993,7 +1029,7 @@ mod tests { #[track_caller] fn get_claims( - deps: Deps, + deps: Deps, addr: Addr, limit: Option, start_after: Option, @@ -1005,7 +1041,7 @@ mod tests { #[test] fn unbond_claim_workflow() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // create some data @@ -1189,7 +1225,7 @@ mod tests { #[test] fn add_remove_hooks() { // add will over-write and remove have no effect - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let hooks = HOOKS.list_hooks(&deps.storage).unwrap(); @@ -1267,21 +1303,21 @@ mod tests { mod slash { use super::*; - fn query_is_slasher(deps: Deps, env: Env, addr: String) -> StdResult { + fn query_is_slasher(deps: Deps, env: Env, addr: String) -> StdResult { let msg = QueryMsg::IsSlasher { addr }; let raw = query(deps, env, msg)?; let is_slasher: bool = from_slice(&raw)?; Ok(is_slasher) } - fn query_list_slashers(deps: Deps, env: Env) -> StdResult> { + fn query_list_slashers(deps: Deps, env: Env) -> StdResult> { let msg = QueryMsg::ListSlashers {}; let raw = query(deps, env, msg)?; let slashers: Vec = from_slice(&raw)?; Ok(slashers) } - fn add_slasher(deps: DepsMut) -> String { + fn add_slasher(deps: DepsMut) -> String { let slasher = String::from("slasher"); let add_msg = ExecuteMsg::AddSlasher { addr: slasher.clone(), @@ -1292,7 +1328,7 @@ mod tests { slasher } - fn remove_slasher(deps: DepsMut, slasher: &str) { + fn remove_slasher(deps: DepsMut, slasher: &str) { let add_msg = ExecuteMsg::RemoveSlasher { addr: slasher.to_string(), }; @@ -1301,7 +1337,7 @@ mod tests { } fn slash( - deps: DepsMut, + deps: DepsMut, slasher: &str, addr: &str, portion: Decimal, @@ -1341,7 +1377,7 @@ mod tests { #[test] fn add_remove_slashers() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); let env = mock_env(); default_instantiate(deps.as_mut()); @@ -1427,7 +1463,7 @@ mod tests { #[test] fn slashing_nonexisting_member() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // confirm address doesn't return true on slasher query @@ -1446,7 +1482,7 @@ mod tests { #[test] fn slashing_bonded_tokens_works() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let cfg = CONFIG.load(&deps.storage).unwrap(); let slasher = add_slasher(deps.as_mut()); @@ -1466,7 +1502,7 @@ mod tests { #[test] fn slashing_claims_works() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let cfg = CONFIG.load(&deps.storage).unwrap(); let slasher = add_slasher(deps.as_mut()); @@ -1506,7 +1542,7 @@ mod tests { #[test] fn random_user_cannot_slash() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let _slasher = add_slasher(deps.as_mut()); @@ -1525,7 +1561,7 @@ mod tests { #[test] fn admin_cannot_slash() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let _slasher = add_slasher(deps.as_mut()); @@ -1544,7 +1580,7 @@ mod tests { #[test] fn removed_slasher_cannot_slash() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // Add, then remove a slasher @@ -1567,7 +1603,7 @@ mod tests { #[test] fn hooks_fire() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); let hooks = HOOKS.list_hooks(&deps.storage).unwrap(); @@ -1635,7 +1671,7 @@ mod tests { #[test] fn only_bond_valid_coins() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // cannot bond with 0 coins @@ -1662,7 +1698,7 @@ mod tests { #[test] fn ensure_bonding_edge_cases() { // use min_bond 0, tokens_per_points 500 - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), Uint128::new(100), Uint128::zero(), 5, 0); // setting 50 tokens, gives us Some(0) points @@ -1677,7 +1713,7 @@ mod tests { #[test] fn paginated_claim_query() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); default_instantiate(deps.as_mut()); // create some data @@ -1729,7 +1765,7 @@ mod tests { use super::*; - fn do_instantiate(deps: DepsMut, limit: u64) { + fn do_instantiate(deps: DepsMut, limit: u64) { super::do_instantiate(deps, TOKENS_PER_POINT, MIN_BOND, UNBONDING_DURATION, limit) } @@ -1788,7 +1824,7 @@ mod tests { #[test] fn single_claim() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 2); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -1805,7 +1841,7 @@ mod tests { #[test] fn multiple_users_claims() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 4); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -1823,7 +1859,7 @@ mod tests { #[test] fn single_user_multiple_claims() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 3); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -1841,7 +1877,7 @@ mod tests { #[test] fn only_expired_claims() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 3); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -1866,7 +1902,7 @@ mod tests { #[test] fn claim_returned_once() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 5); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -1902,7 +1938,7 @@ mod tests { #[test] fn up_to_limit_claims_returned() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 2); bond(deps.as_mut(), 12_000, 7_500, 4_000, 1); @@ -1955,7 +1991,7 @@ mod tests { #[test] fn unbound_with_invalid_denom_fails() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); do_instantiate(deps.as_mut(), 2); bond(deps.as_mut(), 5_000, 0, 0, 1); diff --git a/contracts/tgrade-community-pool/Cargo.toml b/contracts/tgrade-community-pool/Cargo.toml index dcf10789..becf3b0d 100644 --- a/contracts/tgrade-community-pool/Cargo.toml +++ b/contracts/tgrade-community-pool/Cargo.toml @@ -17,7 +17,7 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw2 = "0.11.1" +cw2 = "0.12.1" tg3 = { path = "../../packages/tg3", version = "0.6.2" } cosmwasm-std = "1.0.0-beta5" schemars = "0.8.1" @@ -31,6 +31,6 @@ thiserror = "1" [dev-dependencies] anyhow = "1" cosmwasm-schema = "1.0.0-beta5" -cw-multi-test = "0.11.1" +cw-multi-test = "0.12.1" tg-bindings-test = { path = "../../packages/bindings-test", version = "0.6.2" } tg4 = { path = "../../packages/tg4", version = "0.6.2" } diff --git a/contracts/tgrade-community-pool/src/contract.rs b/contracts/tgrade-community-pool/src/contract.rs index 98b996a4..b2949528 100644 --- a/contracts/tgrade-community-pool/src/contract.rs +++ b/contracts/tgrade-community-pool/src/contract.rs @@ -1,11 +1,12 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, BankMsg, Binary, Coin, Deps, DepsMut, Empty, Env, MessageInfo, StdResult, + to_binary, BankMsg, Binary, Coin, CustomQuery, Deps, DepsMut, Empty, Env, MessageInfo, + StdResult, }; use cw2::set_contract_version; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; use tg_utils::ensure_from_older_version; use crate::msg::{ExecuteMsg, InstantiateMsg, Proposal, QueryMsg}; @@ -27,7 +28,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - deps: DepsMut, + deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -38,7 +39,7 @@ pub fn instantiate( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -50,20 +51,21 @@ pub fn execute( proposal, } => execute_propose(deps, env, info, title, description, proposal), ExecuteMsg::Vote { proposal_id, vote } => { - execute_vote::(deps, env, info, proposal_id, vote) + execute_vote::(deps, env, info, proposal_id, vote) .map_err(ContractError::from) } ExecuteMsg::Execute { proposal_id } => execute_execute(deps, env, info, proposal_id), ExecuteMsg::Close { proposal_id } => { - execute_close::(deps, env, info, proposal_id).map_err(ContractError::from) + execute_close::(deps, env, info, proposal_id) + .map_err(ContractError::from) } ExecuteMsg::WithdrawEngagementRewards {} => execute_withdraw_engagement_rewards(deps, info), ExecuteMsg::DistributeRewards {} => Ok(Response::new()), } } -pub fn execute_propose( - deps: DepsMut, +pub fn execute_propose( + deps: DepsMut, env: Env, info: MessageInfo, title: String, @@ -96,8 +98,8 @@ pub fn execute_send_proposal(to_address: String, amount: Coin) -> Result( + deps: DepsMut, env: Env, info: MessageInfo, proposal_id: u64, @@ -124,8 +126,8 @@ pub fn execute_execute( Ok(resp) } -pub fn execute_withdraw_engagement_rewards( - deps: DepsMut, +pub fn execute_withdraw_engagement_rewards( + deps: DepsMut, info: MessageInfo, ) -> Result { let group_contract = VOTING_CONFIG.load(deps.storage)?.group_contract; @@ -152,27 +154,27 @@ fn align_limit(limit: Option) -> usize { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { Rules {} => to_binary(&query_rules(deps)?), - Proposal { proposal_id } => to_binary(&query_proposal::( - deps, - env, - proposal_id, - )?), + Proposal { proposal_id } => to_binary( + &query_proposal::(deps, env, proposal_id)?, + ), Vote { proposal_id, voter } => to_binary(&query_vote(deps, proposal_id, voter)?), - ListProposals { start_after, limit } => to_binary(&list_proposals::( - deps, - env, - start_after, - align_limit(limit), - )?), + ListProposals { start_after, limit } => { + to_binary(&list_proposals::( + deps, + env, + start_after, + align_limit(limit), + )?) + } ReverseProposals { start_before, limit, - } => to_binary(&reverse_proposals::( + } => to_binary(&reverse_proposals::( deps, env, start_before, @@ -217,16 +219,13 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result Box> { +fn contract_validator_proposals() -> Box> { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, @@ -20,7 +20,7 @@ fn contract_validator_proposals() -> Box> { Box::new(contract) } -fn contract_engagement() -> Box> { +fn contract_engagement() -> Box> { let contract = ContractWrapper::new( tg4_engagement::contract::execute, tg4_engagement::contract::instantiate, diff --git a/contracts/tgrade-gov-reflect/Cargo.toml b/contracts/tgrade-gov-reflect/Cargo.toml index 4e27a995..8318a1d7 100644 --- a/contracts/tgrade-gov-reflect/Cargo.toml +++ b/contracts/tgrade-gov-reflect/Cargo.toml @@ -24,7 +24,7 @@ backtraces = ["cosmwasm-std/backtraces"] [dependencies] cosmwasm-std = "1.0.0-beta5" -cw-storage-plus = "0.11.1" +cw-storage-plus = "0.12.1" tg-bindings = { version = "0.6.2", path = "../../packages/bindings" } schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } diff --git a/contracts/tgrade-validator-voting/Cargo.toml b/contracts/tgrade-validator-voting/Cargo.toml index 700d8138..4ee56e2c 100644 --- a/contracts/tgrade-validator-voting/Cargo.toml +++ b/contracts/tgrade-validator-voting/Cargo.toml @@ -17,7 +17,7 @@ backtraces = ["cosmwasm-std/backtraces"] library = [] [dependencies] -cw2 = "0.11.1" +cw2 = "0.12.1" tg3 = { path = "../../packages/tg3", version = "0.6.2" } cosmwasm-std = "1.0.0-beta5" schemars = "0.8.1" @@ -30,8 +30,8 @@ thiserror = "1" [dev-dependencies] anyhow = "1" cosmwasm-schema = "1.0.0-beta5" -cw-multi-test = "0.11.1" -cw-storage-plus = "0.11.1" +cw-multi-test = "0.12.1" +cw-storage-plus = "0.12.1" tg-bindings-test = { version = "0.6.2", path = "../../packages/bindings-test" } tg-utils = { version = "0.6.2", path = "../../packages/utils" } tg-voting-contract = { version = "0.6.2", path = "../../packages/voting-contract" } diff --git a/contracts/tgrade-validator-voting/src/contract.rs b/contracts/tgrade-validator-voting/src/contract.rs index 4bf7f3ff..2e3d354c 100644 --- a/contracts/tgrade-validator-voting/src/contract.rs +++ b/contracts/tgrade-validator-voting/src/contract.rs @@ -1,14 +1,14 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - from_slice, to_binary, to_vec, Binary, ContractInfoResponse, ContractResult, Deps, DepsMut, - Empty, Env, MessageInfo, QueryRequest, StdResult, SystemResult, WasmMsg, WasmQuery, + from_slice, to_binary, to_vec, Binary, ContractInfoResponse, ContractResult, CustomQuery, Deps, + DepsMut, Empty, Env, MessageInfo, QueryRequest, StdResult, SystemResult, WasmMsg, WasmQuery, }; use cw2::set_contract_version; use tg_bindings::{ request_privileges, BlockParams, ConsensusParams, EvidenceParams, GovProposal, Privilege, - PrivilegeChangeMsg, TgradeMsg, TgradeSudoMsg, + PrivilegeChangeMsg, TgradeMsg, TgradeQuery, TgradeSudoMsg, }; use tg_utils::ensure_from_older_version; @@ -31,7 +31,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - deps: DepsMut, + deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -42,7 +42,7 @@ pub fn instantiate( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -72,17 +72,19 @@ pub fn execute( .map_err(ContractError::from) } Vote { proposal_id, vote } => { - execute_vote::(deps, env, info, proposal_id, vote) + execute_vote::(deps, env, info, proposal_id, vote) .map_err(ContractError::from) } Execute { proposal_id } => execute_execute(deps, env, info, proposal_id), - Close { proposal_id } => execute_close::(deps, env, info, proposal_id) - .map_err(ContractError::from), + Close { proposal_id } => { + execute_close::(deps, env, info, proposal_id) + .map_err(ContractError::from) + } } } -fn confirm_admin_in_contract( - deps: Deps, +fn confirm_admin_in_contract( + deps: Deps, env: &Env, contract_addr: String, ) -> Result<(), ContractError> { @@ -114,8 +116,8 @@ fn confirm_admin_in_contract( )) } -pub fn execute_execute( - deps: DepsMut, +pub fn execute_execute( + deps: DepsMut, env: Env, info: MessageInfo, proposal_id: u64, @@ -203,27 +205,29 @@ fn align_limit(limit: Option) -> usize { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { use QueryMsg::*; match msg { Rules {} => to_binary(&query_rules(deps)?), - Proposal { proposal_id } => to_binary(&query_proposal::( + Proposal { proposal_id } => to_binary(&query_proposal::( deps, env, proposal_id, )?), Vote { proposal_id, voter } => to_binary(&query_vote(deps, proposal_id, voter)?), - ListProposals { start_after, limit } => to_binary(&list_proposals::( - deps, - env, - start_after, - align_limit(limit), - )?), + ListProposals { start_after, limit } => { + to_binary(&list_proposals::( + deps, + env, + start_after, + align_limit(limit), + )?) + } ReverseProposals { start_before, limit, - } => to_binary(&reverse_proposals::( + } => to_binary(&reverse_proposals::( deps, env, start_before, @@ -259,14 +263,18 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn sudo(deps: DepsMut, _env: Env, msg: TgradeSudoMsg) -> Result { +pub fn sudo( + _deps: DepsMut, + _env: Env, + msg: TgradeSudoMsg, +) -> Result { match msg { - TgradeSudoMsg::PrivilegeChange(change) => Ok(privilege_change(deps, change)), + TgradeSudoMsg::PrivilegeChange(change) => Ok(privilege_change(change)), _ => Err(ContractError::UnsupportedSudoType {}), } } -fn privilege_change(_deps: DepsMut, change: PrivilegeChangeMsg) -> Response { +fn privilege_change(change: PrivilegeChangeMsg) -> Response { match change { PrivilegeChangeMsg::Promoted {} => { let msgs = request_privileges(&[ @@ -288,7 +296,7 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: Empty) -> Result = Item::new("hackatom"); -fn instantiate( - deps: DepsMut, +fn instantiate( + deps: DepsMut, _env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -43,8 +45,8 @@ fn instantiate( Ok(Response::default()) } -fn execute( - deps: DepsMut, +fn execute( + deps: DepsMut, env: Env, _info: MessageInfo, _msg: ExecuteMsg, @@ -60,7 +62,7 @@ fn execute( Ok(resp) } -fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { +fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { match msg { QueryMsg::Beneficiary {} => { let res = HACKATOM.load(deps.storage)?; @@ -69,7 +71,11 @@ fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { } } -fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { +fn migrate( + deps: DepsMut, + _env: Env, + msg: MigrateMsg, +) -> Result { HACKATOM.update::<_, StdError>(deps.storage, |mut state| { state.beneficiary = msg.new_guy; Ok(state) @@ -78,7 +84,7 @@ fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result Box> { +pub fn contract() -> Box> { let contract = ContractWrapper::new(execute, instantiate, query).with_migrate(migrate); Box::new(contract) } diff --git a/contracts/tgrade-validator-voting/src/multitest/suite.rs b/contracts/tgrade-validator-voting/src/multitest/suite.rs index 88b2e9f6..73b299c1 100644 --- a/contracts/tgrade-validator-voting/src/multitest/suite.rs +++ b/contracts/tgrade-validator-voting/src/multitest/suite.rs @@ -4,7 +4,7 @@ use cosmwasm_std::{to_binary, Addr, ContractInfoResponse, Decimal}; use cw_multi_test::{AppResponse, Contract, ContractWrapper, Executor}; use tg3::Status; use tg4::{Member, Tg4ExecuteMsg}; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; use tg_bindings_test::{TgradeApp, UpgradePlan}; use crate::msg::ValidatorProposal; @@ -16,7 +16,7 @@ pub fn get_proposal_id(response: &AppResponse) -> Result Box> { +fn contract_validator_proposals() -> Box> { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, @@ -27,7 +27,7 @@ fn contract_validator_proposals() -> Box> { Box::new(contract) } -fn contract_engagement() -> Box> { +fn contract_engagement() -> Box> { let contract = ContractWrapper::new( tg4_engagement::contract::execute, tg4_engagement::contract::instantiate, diff --git a/contracts/tgrade-valset/Cargo.toml b/contracts/tgrade-valset/Cargo.toml index 45840e6c..d0a4c5ba 100644 --- a/contracts/tgrade-valset/Cargo.toml +++ b/contracts/tgrade-valset/Cargo.toml @@ -27,17 +27,17 @@ library = [] integration = ["bech32", "cosmwasm-vm"] [dependencies] -cw-utils = { version = "0.11.1" } -cw2 = { version = "0.11.1" } -tg4 = { path = "../../packages/tg4", version = "0.6.2" } -tg-bindings = { version = "0.6.2", path = "../../packages/bindings" } -tg-utils = { version = "0.6.2", path = "../../packages/utils" } -cw-controllers = { version = "0.11.1" } -cw-storage-plus = { version = "0.11.1" } cosmwasm-std = { version = "1.0.0-beta5" } +cw2 = { version = "0.12.1" } +cw-utils = { version = "0.12.1" } +cw-controllers = { version = "0.12.1" } +cw-storage-plus = { version = "0.12.1" } schemars = "0.8" serde = { version = "1.0.103", default-features = false, features = ["derive"] } thiserror = { version = "1.0.21" } +tg4 = { path = "../../packages/tg4", version = "0.6.2" } +tg-bindings = { version = "0.6.2", path = "../../packages/bindings" } +tg-utils = { version = "0.6.2", path = "../../packages/utils" } # For integration tests ("integration" feature) bech32 = { version = "0.8.1", optional = true } @@ -45,7 +45,7 @@ cosmwasm-vm = { version = "1.0.0-beta5", optional = true, default-features = fal [dev-dependencies] cosmwasm-schema = { version = "1.0.0-beta5" } -cw-multi-test = "0.11.1" +cw-multi-test = "0.12.1" tg4-engagement = { path = "../tg4-engagement", version = "0.6.2" } tg4-stake = { path = "../tg4-stake", version = "0.6.2" } # we enable multitest feature only for tests diff --git a/contracts/tgrade-valset/src/contract.rs b/contracts/tgrade-valset/src/contract.rs index b964fd06..c0583b62 100644 --- a/contracts/tgrade-valset/src/contract.rs +++ b/contracts/tgrade-valset/src/contract.rs @@ -5,8 +5,8 @@ use std::convert::TryInto; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - to_binary, Addr, Binary, BlockInfo, Decimal, Deps, DepsMut, Env, MessageInfo, Order, Reply, - StdError, StdResult, Timestamp, WasmMsg, + to_binary, Addr, Binary, BlockInfo, CustomQuery, Decimal, Deps, DepsMut, Env, MessageInfo, + Order, Reply, StdError, StdResult, Timestamp, WasmMsg, }; use cw2::set_contract_version; @@ -17,7 +17,7 @@ use cw_utils::{maybe_addr, parse_reply_instantiate_data}; use tg4::{Member, Tg4Contract}; use tg_bindings::{ request_privileges, Ed25519Pubkey, Evidence, EvidenceType, Privilege, PrivilegeChangeMsg, - Pubkey, TgradeMsg, TgradeSudoMsg, ValidatorDiff, ValidatorUpdate, + Pubkey, TgradeMsg, TgradeQuery, TgradeSudoMsg, ValidatorDiff, ValidatorUpdate, }; use tg_utils::{ensure_from_older_version, JailingDuration, SlashMsg, ADMIN}; @@ -46,7 +46,7 @@ pub type SubMsg = cosmwasm_std::SubMsg; #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - deps: DepsMut, + deps: DepsMut, env: Env, _info: MessageInfo, msg: InstantiateMsg, @@ -140,7 +140,7 @@ pub fn instantiate( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -174,8 +174,8 @@ pub fn execute( } } -fn execute_update_config( - deps: DepsMut, +fn execute_update_config( + deps: DepsMut, info: MessageInfo, min_points: Option, max_validators: Option, @@ -199,8 +199,8 @@ fn execute_update_config( Ok(res) } -fn execute_register_validator_key( - deps: DepsMut, +fn execute_register_validator_key( + deps: DepsMut, _env: Env, info: MessageInfo, pubkey: Pubkey, @@ -231,8 +231,8 @@ fn execute_register_validator_key( Ok(res) } -fn execute_update_metadata( - deps: DepsMut, +fn execute_update_metadata( + deps: DepsMut, _env: Env, info: MessageInfo, metadata: ValidatorMetadata, @@ -257,8 +257,8 @@ fn execute_update_metadata( Ok(res) } -fn execute_jail( - deps: DepsMut, +fn execute_jail( + deps: DepsMut, env: Env, info: MessageInfo, operator: String, @@ -287,8 +287,8 @@ fn execute_jail( Ok(res) } -fn execute_unjail( - deps: DepsMut, +fn execute_unjail( + deps: DepsMut, env: Env, info: MessageInfo, operator: Option, @@ -325,8 +325,8 @@ fn execute_unjail( Ok(res) } -fn store_slashing_event( - deps: DepsMut, +fn store_slashing_event( + deps: DepsMut, env: &Env, addr: Addr, portion: Decimal, @@ -342,8 +342,8 @@ fn store_slashing_event( Ok(()) } -fn execute_slash( - mut deps: DepsMut, +fn execute_slash( + mut deps: DepsMut, env: Env, info: MessageInfo, operator: String, @@ -375,8 +375,8 @@ fn execute_slash( } #[cfg(debug_assertions)] -fn execute_simulate_validators( - deps: DepsMut, +fn execute_simulate_validators( + deps: DepsMut, _info: MessageInfo, validators: Vec, ) -> Result { @@ -398,7 +398,7 @@ fn execute_simulate_validators( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { use QueryMsg::*; match msg { Configuration {} => Ok(to_binary(&CONFIG.load(deps.storage)?)?), @@ -429,7 +429,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { +fn query_epoch(deps: Deps, env: Env) -> Result { let epoch = EPOCH.load(deps.storage)?; let mut next_update_time = Timestamp::from_seconds((epoch.current_epoch + 1) * epoch.epoch_length); @@ -447,8 +447,8 @@ fn query_epoch(deps: Deps, env: Env) -> Result { Ok(resp) } -fn query_validator_key( - deps: Deps, +fn query_validator_key( + deps: Deps, env: Env, operator: String, ) -> Result { @@ -470,8 +470,8 @@ fn query_validator_key( const MAX_LIMIT: u32 = 100; const DEFAULT_LIMIT: u32 = 30; -fn list_validator_keys( - deps: Deps, +fn list_validator_keys( + deps: Deps, env: Env, start_after: Option, limit: Option, @@ -479,7 +479,7 @@ fn list_validator_keys( let cfg = CONFIG.load(deps.storage)?; let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; let start_after = maybe_addr(deps.api, start_after)?; - let start = start_after.map(|addr| Bound::exclusive(addr.as_str())); + let start = start_after.as_ref().map(Bound::exclusive); let operators: StdResult> = operators() .range(deps.storage, start, None, Order::Ascending) @@ -506,8 +506,8 @@ fn list_validator_keys( }) } -fn list_active_validators( - deps: Deps, +fn list_active_validators( + deps: Deps, start_after: Option, limit: Option, ) -> Result { @@ -532,8 +532,8 @@ fn list_active_validators( }) } -fn list_jailed_validators( - deps: Deps, +fn list_jailed_validators( + deps: Deps, env: Env, start_after: Option, limit: Option, @@ -541,7 +541,7 @@ fn list_jailed_validators( let cfg = CONFIG.load(deps.storage)?; let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize; let start_after = maybe_addr(deps.api, start_after)?; - let start = start_after.map(|addr| Bound::exclusive(addr.as_str())); + let start = start_after.as_ref().map(Bound::exclusive); let validators = JAIL .range(deps.storage, start, None, Order::Ascending) @@ -572,16 +572,16 @@ fn list_jailed_validators( Ok(ListValidatorResponse { validators }) } -fn simulate_active_validators( - deps: Deps, +fn simulate_active_validators( + deps: Deps, env: Env, ) -> Result { let (validators, _) = calculate_validators(deps, &env)?; Ok(ListActiveValidatorsResponse { validators }) } -fn list_validator_slashing( - deps: Deps, +fn list_validator_slashing( + deps: Deps, _env: Env, operator: String, ) -> Result { @@ -608,7 +608,11 @@ fn list_validator_slashing( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn sudo(deps: DepsMut, env: Env, msg: TgradeSudoMsg) -> Result { +pub fn sudo( + deps: DepsMut, + env: Env, + msg: TgradeSudoMsg, +) -> Result { match msg { TgradeSudoMsg::PrivilegeChange(change) => Ok(privilege_change(deps, change)), TgradeSudoMsg::EndWithValidatorUpdate {} => end_block(deps, env), @@ -617,7 +621,7 @@ pub fn sudo(deps: DepsMut, env: Env, msg: TgradeSudoMsg) -> Result Response { +fn privilege_change(_deps: DepsMut, change: PrivilegeChangeMsg) -> Response { match change { PrivilegeChangeMsg::Promoted {} => { let msgs = request_privileges(&[ @@ -642,7 +646,7 @@ fn is_genesis_block(block: &BlockInfo) -> bool { block.height < 2 } -fn end_block(deps: DepsMut, env: Env) -> Result { +fn end_block(deps: DepsMut, env: Env) -> Result { let cfg = CONFIG.load(deps.storage)?; // check if needed and quit early if we didn't hit epoch boundary @@ -736,8 +740,8 @@ const QUERY_LIMIT: Option = Some(30); /// Selects validators to be used for incoming epoch. Returns vector of validators info paired /// with vector of addresses to be un-jailed (always empty if auto un-jailing is disabled). -fn calculate_validators( - deps: Deps, +fn calculate_validators( + deps: Deps, env: &Env, ) -> Result<(Vec, Vec), ContractError> { let cfg = CONFIG.load(deps.storage)?; @@ -873,7 +877,11 @@ fn calculate_diff( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> Result { +pub fn migrate( + deps: DepsMut, + _env: Env, + msg: MigrateMsg, +) -> Result { ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; CONFIG.update::<_, StdError>(deps.storage, |mut cfg| { @@ -899,8 +907,8 @@ mod evidence { /// suspect, this function computes sha256 hashes for all existing validator and /// compares result with suspect. It is acceptable approach, since it shouldn't /// happen too often. - pub fn find_matching_validator( - deps: Deps, + pub fn find_matching_validator( + deps: Deps, suspect: &Validator, evidence_height: u64, ) -> Result, cosmwasm_std::StdError> { @@ -941,8 +949,8 @@ mod evidence { /// If some validators are caught on malicious behavior (for example double signing), /// they are reported and punished on begin of next block. -fn begin_block( - mut deps: DepsMut, +fn begin_block( + mut deps: DepsMut, env: Env, evidences: Vec, ) -> Result { @@ -991,15 +999,15 @@ fn begin_block( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn reply(deps: DepsMut, env: Env, msg: Reply) -> Result { +pub fn reply(deps: DepsMut, env: Env, msg: Reply) -> Result { match msg.id { REWARDS_INIT_REPLY_ID => rewards_instantiate_reply(deps, env, msg), _ => Err(ContractError::UnrecognisedReply(msg.id)), } } -pub fn rewards_instantiate_reply( - deps: DepsMut, +pub fn rewards_instantiate_reply( + deps: DepsMut, _env: Env, msg: Reply, ) -> Result { diff --git a/contracts/tgrade-valset/src/multitest/contract.rs b/contracts/tgrade-valset/src/multitest/contract.rs index 9ddd6e12..6e55c223 100644 --- a/contracts/tgrade-valset/src/multitest/contract.rs +++ b/contracts/tgrade-valset/src/multitest/contract.rs @@ -368,7 +368,7 @@ fn update_metadata_invalid_metadata() { mod instantiate { use cosmwasm_std::{coin, Addr, Decimal, Uint128}; use cw_multi_test::{AppBuilder, BasicApp, Executor}; - use tg_bindings::TgradeMsg; + use tg_bindings::{TgradeMsg, TgradeQuery}; use crate::error::ContractError; use crate::msg::{ @@ -380,7 +380,8 @@ mod instantiate { #[test] fn instantiate_invalid_metadata() { - let mut app: BasicApp = AppBuilder::new_custom().build(|_, _, _| ()); + let mut app: BasicApp = + AppBuilder::new_custom().build(|_, _, _| ()); let stake_id = app.store_code(contract_stake()); let admin = "steakhouse owner".to_owned(); diff --git a/contracts/tgrade-valset/src/multitest/suite.rs b/contracts/tgrade-valset/src/multitest/suite.rs index 742359e8..f6883b6f 100644 --- a/contracts/tgrade-valset/src/multitest/suite.rs +++ b/contracts/tgrade-valset/src/multitest/suite.rs @@ -9,13 +9,13 @@ use cosmwasm_std::{ use cw_multi_test::{next_block, AppResponse, Contract, ContractWrapper, CosmosRouter, Executor}; use derivative::Derivative; use tg4::{AdminResponse, Member}; -use tg_bindings::{Evidence, Pubkey, TgradeMsg, ValidatorDiff}; +use tg_bindings::{Evidence, Pubkey, TgradeMsg, TgradeQuery, ValidatorDiff}; use tg_bindings_test::TgradeApp; use tg_utils::{Duration, JailingDuration}; use crate::msg::OperatorInitInfo; -pub fn contract_engagement() -> Box> { +pub fn contract_engagement() -> Box> { let contract = ContractWrapper::new( tg4_engagement::contract::execute, tg4_engagement::contract::instantiate, @@ -24,7 +24,7 @@ pub fn contract_engagement() -> Box> { Box::new(contract) } -pub fn contract_stake() -> Box> { +pub fn contract_stake() -> Box> { let contract = ContractWrapper::new( tg4_stake::contract::execute, tg4_stake::contract::instantiate, @@ -33,7 +33,7 @@ pub fn contract_stake() -> Box> { Box::new(contract) } -pub fn contract_valset() -> Box> { +pub fn contract_valset() -> Box> { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, diff --git a/contracts/tgrade-valset/src/rewards.rs b/contracts/tgrade-valset/src/rewards.rs index 67d7ffcb..142ab68c 100644 --- a/contracts/tgrade-valset/src/rewards.rs +++ b/contracts/tgrade-valset/src/rewards.rs @@ -1,12 +1,14 @@ use crate::msg::{DistributionMsg, RewardsDistribution}; use crate::state::Config; -use cosmwasm_std::{coins, to_binary, Coin, DepsMut, Env, StdResult, SubMsg, Uint128, WasmMsg}; +use cosmwasm_std::{ + coins, to_binary, Coin, CustomQuery, DepsMut, Env, StdResult, SubMsg, Uint128, WasmMsg, +}; use tg_bindings::TgradeMsg; /// Ensure you pass in non-empty pay-validators, it will panic if total validator points is 0 /// This handles all deps and calls into pure functions -pub fn pay_block_rewards( - deps: DepsMut, +pub fn pay_block_rewards( + deps: DepsMut, env: Env, pay_epochs: u64, config: &Config, diff --git a/contracts/tgrade-vesting-account/Cargo.toml b/contracts/tgrade-vesting-account/Cargo.toml index e26a7866..91f7cd35 100644 --- a/contracts/tgrade-vesting-account/Cargo.toml +++ b/contracts/tgrade-vesting-account/Cargo.toml @@ -17,9 +17,9 @@ library = [] [dependencies] cosmwasm-std = "1.0.0-beta5" -cw-utils = "0.11.1" -cw2 = "0.11.1" -cw-storage-plus = "0.11.1" +cw-utils = "0.12.1" +cw2 = "0.12.1" +cw-storage-plus = "0.12.1" schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } tg-bindings = { version = "0.6.2", path = "../../packages/bindings" } @@ -31,5 +31,5 @@ anyhow = "1" assert_matches = "1" derivative = "2" cosmwasm-schema = "1.0.0-beta5" -cw-multi-test = "0.11.1" +cw-multi-test = "0.12.1" tg-bindings-test = { version = "0.6.2", path = "../../packages/bindings-test" } diff --git a/contracts/tgrade-vesting-account/src/contract.rs b/contracts/tgrade-vesting-account/src/contract.rs index fa32d349..38ad76ec 100644 --- a/contracts/tgrade-vesting-account/src/contract.rs +++ b/contracts/tgrade-vesting-account/src/contract.rs @@ -1,8 +1,8 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - coins, to_binary, Addr, BankMsg, Binary, CosmosMsg, Decimal, Deps, DepsMut, Env, MessageInfo, - StdResult, Uint128, + coins, to_binary, Addr, BankMsg, Binary, CosmosMsg, CustomQuery, Decimal, Deps, DepsMut, Env, + MessageInfo, StdResult, Uint128, }; use cw2::set_contract_version; @@ -12,7 +12,7 @@ use crate::msg::{ QueryMsg, TokenInfoResponse, }; use crate::state::{VestingAccount, VestingPlan, VESTING_ACCOUNT}; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; pub type Response = cosmwasm_std::Response; pub type SubMsg = cosmwasm_std::SubMsg; @@ -23,7 +23,7 @@ const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( - deps: DepsMut, + deps: DepsMut, _env: Env, info: MessageInfo, msg: InstantiateMsg, @@ -33,8 +33,8 @@ pub fn instantiate( Ok(Response::default()) } -fn create_vesting_account( - deps: DepsMut, +fn create_vesting_account( + deps: DepsMut, info: MessageInfo, msg: InstantiateMsg, ) -> Result<(), ContractError> { @@ -57,7 +57,7 @@ fn create_vesting_account( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg, @@ -103,7 +103,11 @@ fn hand_over_completed(account: &VestingAccount) -> Result<(), ContractError> { } /// Returns information about amount of tokens that is allowed to be released -fn allowed_release(deps: Deps, env: &Env, plan: &VestingPlan) -> Result { +fn allowed_release( + deps: Deps, + env: &Env, + plan: &VestingPlan, +) -> Result { let token_info = token_info(deps, env)?; // In order to allow releasing any extra tokens sent to the account AFTER vesting @@ -150,8 +154,8 @@ fn allowed_release(deps: Deps, env: &Env, plan: &VestingPlan) -> Result( + deps: DepsMut, sender: Addr, msgs: Vec>, ) -> Result { @@ -166,8 +170,8 @@ fn execute_msg( .add_attribute("action", "execute")) } -fn release_tokens( - deps: DepsMut, +fn release_tokens( + deps: DepsMut, env: Env, sender: Addr, requested_amount: Option, @@ -183,8 +187,8 @@ fn release_tokens( helpers::release_tokens(requested_amount, sender, &mut account, deps.storage) } -fn freeze_tokens( - deps: DepsMut, +fn freeze_tokens( + deps: DepsMut, sender: Addr, requested_amount: Option, ) -> Result { @@ -200,8 +204,8 @@ fn freeze_tokens( } } -fn unfreeze_tokens( - deps: DepsMut, +fn unfreeze_tokens( + deps: DepsMut, sender: Addr, requested_amount: Option, ) -> Result { @@ -215,8 +219,8 @@ fn unfreeze_tokens( } } -fn change_operator( - deps: DepsMut, +fn change_operator( + deps: DepsMut, sender: Addr, new_operator: Addr, ) -> Result { @@ -232,7 +236,11 @@ fn change_operator( .add_attribute("sender", sender)) } -fn hand_over(deps: DepsMut, env: Env, sender: Addr) -> Result { +fn hand_over( + deps: DepsMut, + env: Env, + sender: Addr, +) -> Result { let mut account = VESTING_ACCOUNT.load(deps.storage)?; hand_over_completed(&account)?; if ![&account.recipient, &account.oversight].contains(&&sender) { @@ -334,7 +342,7 @@ mod helpers { } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::AccountInfo {} => to_binary(&account_info(deps)?), QueryMsg::TokenInfo {} => to_binary(&token_info(deps, &env)?), @@ -343,7 +351,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { } } -fn account_info(deps: Deps) -> StdResult { +fn account_info(deps: Deps) -> StdResult { let account = VESTING_ACCOUNT.load(deps.storage)?; let info = AccountInfoResponse { @@ -355,7 +363,7 @@ fn account_info(deps: Deps) -> StdResult { Ok(info) } -fn token_info(deps: Deps, env: &Env) -> StdResult { +fn token_info(deps: Deps, env: &Env) -> StdResult { let account = VESTING_ACCOUNT.load(deps.storage)?; let denom = account.denom; let balance = deps @@ -373,14 +381,14 @@ fn token_info(deps: Deps, env: &Env) -> StdResult { Ok(info) } -fn is_handed_over(deps: Deps) -> StdResult { +fn is_handed_over(deps: Deps) -> StdResult { let account = VESTING_ACCOUNT.load(deps.storage)?; Ok(IsHandedOverResponse { is_handed_over: account.handed_over, }) } -fn can_execute(deps: Deps, sender: String) -> StdResult { +fn can_execute(deps: Deps, sender: String) -> StdResult { let account = VESTING_ACCOUNT.load(deps.storage)?; if !account.handed_over { return Ok(CanExecuteResponse { can_execute: false }); @@ -394,13 +402,11 @@ fn can_execute(deps: Deps, sender: String) -> StdResult { #[cfg(test)] mod tests { use super::*; - use assert_matches::assert_matches; - use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage, - }; + use cosmwasm_std::testing::{mock_env, mock_info, MockApi, MockQuerier, MockStorage}; use cosmwasm_std::{from_binary, Coin, MessageInfo, OwnedDeps, Timestamp}; + use tg_bindings_test::mock_deps_tgrade; use tg_utils::Expiration; const OWNER: &str = "owner"; @@ -445,7 +451,7 @@ mod tests { } fn build(self) -> Suite { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); let owner = mock_info(self.recipient.as_str(), &self.coins); let instantiate_message = InstantiateMsg { @@ -472,7 +478,7 @@ mod tests { } struct Suite { - deps: OwnedDeps, + deps: OwnedDeps, env: Env, } @@ -748,7 +754,7 @@ mod tests { #[test] fn instantiate_without_tokens() { - let mut deps = mock_dependencies(); + let mut deps = mock_deps_tgrade(); let owner = mock_info(OWNER, &[]); let instantiate_message = InstantiateMsg { diff --git a/contracts/tgrade-vesting-account/src/multitest/suite.rs b/contracts/tgrade-vesting-account/src/multitest/suite.rs index cb867152..25a2c4dd 100644 --- a/contracts/tgrade-vesting-account/src/multitest/suite.rs +++ b/contracts/tgrade-vesting-account/src/multitest/suite.rs @@ -2,14 +2,14 @@ use crate::{error::ContractError, msg::*, state::*}; use cosmwasm_std::{coin, Addr, CosmosMsg, Timestamp, Uint128}; use cw_multi_test::{AppResponse, Contract, ContractWrapper, CosmosRouter, Executor}; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; use tg_bindings_test::TgradeApp; use tg_utils::Expiration; use anyhow::Result as AnyResult; use derivative::Derivative; -pub fn vesting_contract() -> Box> { +pub fn contract_vesting() -> Box> { let contract = ContractWrapper::new( crate::contract::execute, crate::contract::instantiate, @@ -108,7 +108,7 @@ impl SuiteBuilder { }) .unwrap(); - let contract_id = self.app.store_code(vesting_contract()); + let contract_id = self.app.store_code(contract_vesting()); let recipient = Addr::unchecked(self.recipient); let operator = Addr::unchecked(self.operator); let oversight = Addr::unchecked(self.oversight); diff --git a/packages/bindings-test/Cargo.toml b/packages/bindings-test/Cargo.toml index 5126224f..27f2370e 100644 --- a/packages/bindings-test/Cargo.toml +++ b/packages/bindings-test/Cargo.toml @@ -13,7 +13,7 @@ tg-bindings = { version = "0.6.2", path = "../bindings" } cosmwasm-std = { version = "1.0.0-beta5" } schemars = "0.8" serde = { version = "1.0.103", default-features = false, features = ["derive"] } -cw-multi-test = { version = "0.11.1" } -cw-storage-plus = { version = "0.11.1" } +cw-multi-test = { version = "0.12.1" } +cw-storage-plus = { version = "0.12.1" } anyhow = { version = "1" } thiserror = { version = "1.0.21" } diff --git a/packages/bindings-test/src/lib.rs b/packages/bindings-test/src/lib.rs index 35d72e6d..a91ac564 100644 --- a/packages/bindings-test/src/lib.rs +++ b/packages/bindings-test/src/lib.rs @@ -1,5 +1,6 @@ mod multitest; pub use multitest::{ - Privileges, TgradeApp, TgradeAppWrapped, TgradeError, TgradeModule, UpgradePlan, BLOCK_TIME, + mock_deps_tgrade, Privileges, TgradeApp, TgradeAppWrapped, TgradeDeps, TgradeError, + TgradeModule, UpgradePlan, BLOCK_TIME, }; diff --git a/packages/bindings-test/src/multitest.rs b/packages/bindings-test/src/multitest.rs index 1cd6ad3f..1728f90a 100644 --- a/packages/bindings-test/src/multitest.rs +++ b/packages/bindings-test/src/multitest.rs @@ -7,7 +7,10 @@ use std::fmt::Debug; use std::ops::{Deref, DerefMut}; use thiserror::Error; -use cosmwasm_std::testing::{MockApi, MockStorage}; +use cosmwasm_std::testing::{MockApi, MockQuerier, MockStorage}; +use cosmwasm_std::OwnedDeps; +use std::marker::PhantomData; + use cosmwasm_std::{ from_slice, to_binary, Addr, Api, Binary, BlockInfo, Coin, CustomQuery, Empty, Order, Querier, QuerierResult, StdError, StdResult, Storage, Timestamp, @@ -43,6 +46,17 @@ const ADMIN_PRIVILEGES: &[Privilege] = &[ Privilege::ConsensusParamChanger, ]; +pub type TgradeDeps = OwnedDeps; + +pub fn mock_deps_tgrade() -> TgradeDeps { + OwnedDeps { + storage: MockStorage::default(), + api: MockApi::default(), + querier: MockQuerier::default(), + custom_query_type: PhantomData, + } +} + impl TgradeModule { /// Intended for init_modules to set someone who can grant privileges or call arbitrary /// TgradeMsg externally diff --git a/packages/tg4/src/helpers.rs b/packages/tg4/src/helpers.rs index 58dd42ae..f2baa1f2 100644 --- a/packages/tg4/src/helpers.rs +++ b/packages/tg4/src/helpers.rs @@ -2,7 +2,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use cosmwasm_std::{ - from_slice, to_binary, to_vec, Addr, Binary, ContractResult, Empty, QuerierWrapper, + from_slice, to_binary, to_vec, Addr, Binary, ContractResult, CustomQuery, QuerierWrapper, QueryRequest, StdError, StdResult, SystemResult, WasmMsg, WasmQuery, }; use tg_bindings::TgradeMsg; @@ -63,7 +63,7 @@ impl Tg4Contract { self.encode_msg(msg) } - fn encode_smart_query(&self, msg: Tg4QueryMsg) -> StdResult> { + fn encode_smart_query(&self, msg: Tg4QueryMsg) -> StdResult> { Ok(WasmQuery::Smart { contract_addr: self.addr().into(), msg: to_binary(&msg)?, @@ -71,7 +71,7 @@ impl Tg4Contract { .into()) } - fn encode_raw_query>(&self, key: T) -> QueryRequest { + fn encode_raw_query, Q: CustomQuery>(&self, key: T) -> QueryRequest { WasmQuery::Raw { contract_addr: self.addr().into(), key: key.into(), @@ -80,22 +80,26 @@ impl Tg4Contract { } /// Show the hooks - pub fn hooks(&self, querier: &QuerierWrapper) -> StdResult> { + pub fn hooks(&self, querier: &QuerierWrapper) -> StdResult> { let query = self.encode_smart_query(Tg4QueryMsg::Hooks {})?; let res: HooksResponse = querier.query(&query)?; Ok(res.hooks) } /// Read the total points - pub fn total_points(&self, querier: &QuerierWrapper) -> StdResult { + pub fn total_points(&self, querier: &QuerierWrapper) -> StdResult { let query = self.encode_raw_query(TOTAL_KEY.as_bytes()); querier.query(&query) } /// Check if this address is a member, and if so, with which points - pub fn is_member(&self, querier: &QuerierWrapper, addr: &Addr) -> StdResult> { + pub fn is_member( + &self, + querier: &QuerierWrapper, + addr: &Addr, + ) -> StdResult> { let path = member_key(addr.as_ref()); - let query = self.encode_raw_query(path); + let query = self.encode_raw_query::<_, Q>(path); // We have to copy the logic of Querier.query to handle the empty case, and not // try to decode empty result into a u64. @@ -121,7 +125,11 @@ impl Tg4Contract { } /// Check if this address is a member - pub fn is_voting_member(&self, querier: &QuerierWrapper, member: &str) -> StdResult { + pub fn is_voting_member( + &self, + querier: &QuerierWrapper, + member: &str, + ) -> StdResult { self.is_member(querier, &Addr::unchecked(member))?.map_or( Err(StdError::generic_err("Unauthorized: not member of a group")), |member_points| { @@ -137,9 +145,9 @@ impl Tg4Contract { } /// Check if this address was a member, and if its points is >= 1 - pub fn was_voting_member>( + pub fn was_voting_member, Q: CustomQuery>( &self, - querier: &QuerierWrapper, + querier: &QuerierWrapper, member: T, height: u64, ) -> StdResult { @@ -162,9 +170,9 @@ impl Tg4Contract { } /// Return the member's points at the given snapshot - requires a smart query - pub fn member_at_height>( + pub fn member_at_height, Q: CustomQuery>( &self, - querier: &QuerierWrapper, + querier: &QuerierWrapper, member: T, height: u64, ) -> StdResult> { @@ -176,9 +184,9 @@ impl Tg4Contract { Ok(res.points) } - pub fn list_members( + pub fn list_members( &self, - querier: &QuerierWrapper, + querier: &QuerierWrapper, start_after: Option, limit: Option, ) -> StdResult> { @@ -187,9 +195,9 @@ impl Tg4Contract { Ok(res.members) } - pub fn list_members_by_points( + pub fn list_members_by_points( &self, - querier: &QuerierWrapper, + querier: &QuerierWrapper, start_after: Option, limit: Option, ) -> StdResult> { @@ -201,12 +209,12 @@ impl Tg4Contract { /// This will make some queries to ensure that the target contract is tg4-compatible. /// It returns `true` iff it appears to be compatible. - pub fn is_tg4(&self, querier: &QuerierWrapper) -> bool { + pub fn is_tg4(&self, querier: &QuerierWrapper) -> bool { self.list_members(querier, None, Some(1)).is_ok() } /// Read the admin - pub fn admin(&self, querier: &QuerierWrapper) -> StdResult> { + pub fn admin(&self, querier: &QuerierWrapper) -> StdResult> { let query = self.encode_smart_query(Tg4QueryMsg::Admin {})?; let res: AdminResponse = querier.query(&query)?; Ok(res.admin) diff --git a/packages/utils/Cargo.toml b/packages/utils/Cargo.toml index ceaeeb0f..f969ac8d 100644 --- a/packages/utils/Cargo.toml +++ b/packages/utils/Cargo.toml @@ -12,10 +12,10 @@ license = "Apache-2.0" [dependencies] cosmwasm-std = "1.0.0-beta5" -cw-utils = "0.11.1" -cw-controllers = "0.11.1" -cw-storage-plus = "0.11.1" -cw2 = "0.11.1" +cw-utils = "0.12.1" +cw-controllers = "0.12.1" +cw-storage-plus = "0.12.1" +cw2 = "0.12.1" schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } tg4 = { path = "../tg4", version = "0.6.2" } diff --git a/packages/voting-contract/Cargo.toml b/packages/voting-contract/Cargo.toml index 85c4f178..ca59f8b8 100644 --- a/packages/voting-contract/Cargo.toml +++ b/packages/voting-contract/Cargo.toml @@ -11,9 +11,9 @@ license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -cw-utils = "0.11.1" +cw-utils = "0.12.1" tg3 = { path = "../../packages/tg3", version = "0.6.2" } -cw-storage-plus = "0.11.1" +cw-storage-plus = "0.12.1" cosmwasm-std = "1.0.0-beta5" schemars = "0.8.1" serde = { version = "1", default-features = false, features = ["derive"] } @@ -25,7 +25,7 @@ thiserror = { version = "1" } [dev-dependencies] anyhow = "1" cosmwasm-schema = "1.0.0-beta5" -cw-multi-test = "0.11.1" +cw-multi-test = "0.12.1" derivative = "2" tg-bindings-test = { path = "../../packages/bindings-test", version = "0.6.2" } tg4-engagement = { path = "../../contracts/tg4-engagement", version = "0.6.2", features = ["library"] } diff --git a/packages/voting-contract/src/lib.rs b/packages/voting-contract/src/lib.rs index c193147e..ceb3e4f6 100644 --- a/packages/voting-contract/src/lib.rs +++ b/packages/voting-contract/src/lib.rs @@ -14,7 +14,9 @@ use state::{ TEXT_PROPOSALS, }; -use cosmwasm_std::{Addr, BlockInfo, Deps, DepsMut, Env, MessageInfo, Order, StdResult, Storage}; +use cosmwasm_std::{ + Addr, BlockInfo, CustomQuery, Deps, DepsMut, Env, MessageInfo, Order, StdResult, Storage, +}; use cw_storage_plus::Bound; use cw_utils::maybe_addr; use tg3::{ @@ -27,8 +29,8 @@ use tg_utils::Expiration; type Response = cosmwasm_std::Response; -pub fn instantiate( - deps: DepsMut, +pub fn instantiate( + deps: DepsMut, rules: VotingRules, group_addr: &str, ) -> Result { @@ -60,8 +62,8 @@ fn save_ballot( Ok(()) } -pub fn propose

( - deps: DepsMut, +pub fn propose( + deps: DepsMut, env: Env, info: MessageInfo, title: String, @@ -121,8 +123,8 @@ where .set_data(cosmwasm_std::to_binary(&resp)?)) } -pub fn vote

( - deps: DepsMut, +pub fn vote( + deps: DepsMut, env: Env, info: MessageInfo, proposal_id: u64, @@ -200,7 +202,11 @@ where Ok(proposal) } -pub fn execute_text

(deps: DepsMut, id: u64, proposal: Proposal

) -> Result<(), ContractError> +pub fn execute_text( + deps: DepsMut, + id: u64, + proposal: Proposal

, +) -> Result<(), ContractError> where P: Serialize + DeserializeOwned, { @@ -209,8 +215,8 @@ where Ok(()) } -pub fn close

( - deps: DepsMut, +pub fn close( + deps: DepsMut, env: Env, info: MessageInfo, proposal_id: u64, @@ -247,12 +253,16 @@ where .add_attribute("proposal_id", proposal_id.to_string())) } -pub fn query_rules(deps: Deps) -> StdResult { +pub fn query_rules(deps: Deps) -> StdResult { let cfg = CONFIG.load(deps.storage)?; Ok(cfg.rules) } -pub fn query_proposal

(deps: Deps, env: Env, id: u64) -> StdResult> +pub fn query_proposal( + deps: Deps, + env: Env, + id: u64, +) -> StdResult> where P: Serialize + DeserializeOwned, { @@ -293,8 +303,8 @@ fn map_proposal

( }) } -pub fn list_proposals

( - deps: Deps, +pub fn list_proposals( + deps: Deps, env: Env, start_after: Option, limit: usize, @@ -302,7 +312,7 @@ pub fn list_proposals

( where P: Serialize + DeserializeOwned, { - let start = start_after.map(Bound::exclusive_int); + let start = start_after.map(Bound::exclusive); let props: StdResult> = proposals() .range(deps.storage, start, None, Order::Ascending) .take(limit) @@ -312,12 +322,12 @@ where Ok(ProposalListResponse { proposals: props? }) } -pub fn list_text_proposals( - deps: Deps, +pub fn list_text_proposals( + deps: Deps, start_after: Option, limit: usize, ) -> StdResult { - let start = start_after.map(Bound::exclusive_int); + let start = start_after.map(Bound::exclusive); let props: StdResult> = TEXT_PROPOSALS .range(deps.storage, start, None, Order::Ascending) .take(limit) @@ -327,8 +337,8 @@ pub fn list_text_proposals( Ok(TextProposalListResponse { proposals: props? }) } -pub fn reverse_proposals

( - deps: Deps, +pub fn reverse_proposals( + deps: Deps, env: Env, start_before: Option, limit: usize, @@ -336,7 +346,7 @@ pub fn reverse_proposals

( where P: Serialize + DeserializeOwned, { - let end = start_before.map(Bound::exclusive_int); + let end = start_before.map(Bound::exclusive); let props: StdResult> = proposals() .range(deps.storage, None, end, Order::Descending) .take(limit) @@ -346,7 +356,11 @@ where Ok(ProposalListResponse { proposals: props? }) } -pub fn query_vote(deps: Deps, proposal_id: u64, voter: String) -> StdResult { +pub fn query_vote( + deps: Deps, + proposal_id: u64, + voter: String, +) -> StdResult { let voter_addr = deps.api.addr_validate(&voter)?; let prop = BALLOTS.may_load(deps.storage, (proposal_id, &voter_addr))?; let vote = prop.map(|b| VoteInfo { @@ -358,14 +372,14 @@ pub fn query_vote(deps: Deps, proposal_id: u64, voter: String) -> StdResult( + deps: Deps, proposal_id: u64, start_after: Option, limit: usize, ) -> StdResult { let addr = maybe_addr(deps.api, start_after)?; - let start = addr.map(|addr| Bound::exclusive(addr.as_ref())); + let start = addr.as_ref().map(Bound::exclusive); let votes: StdResult> = BALLOTS .prefix(proposal_id) @@ -385,13 +399,13 @@ pub fn list_votes( Ok(VoteListResponse { votes: votes? }) } -pub fn list_votes_by_voter( - deps: Deps, +pub fn list_votes_by_voter( + deps: Deps, voter: String, start_after: Option, limit: usize, ) -> StdResult { - let start = start_after.map(Bound::exclusive_int); + let start = start_after.map(Bound::exclusive); let voter_addr = deps.api.addr_validate(&voter)?; let votes: StdResult> = BALLOTS_BY_VOTER @@ -412,7 +426,7 @@ pub fn list_votes_by_voter( Ok(VoteListResponse { votes: votes? }) } -pub fn query_voter(deps: Deps, voter: String) -> StdResult { +pub fn query_voter(deps: Deps, voter: String) -> StdResult { let cfg = CONFIG.load(deps.storage)?; let voter_addr = deps.api.addr_validate(&voter)?; let points = cfg.group_contract.is_member(&deps.querier, &voter_addr)?; @@ -420,8 +434,8 @@ pub fn query_voter(deps: Deps, voter: String) -> StdResult { Ok(VoterResponse { points }) } -pub fn list_voters( - deps: Deps, +pub fn list_voters( + deps: Deps, start_after: Option, limit: Option, ) -> StdResult { @@ -435,7 +449,7 @@ pub fn list_voters( Ok(VoterListResponse { voters }) } -pub fn query_group_contract(deps: Deps) -> StdResult { +pub fn query_group_contract(deps: Deps) -> StdResult { let cfg = CONFIG.load(deps.storage)?; Ok(cfg.group_contract.addr()) } diff --git a/packages/voting-contract/src/multitest/contracts.rs b/packages/voting-contract/src/multitest/contracts.rs index 6374afad..d58613e3 100644 --- a/packages/voting-contract/src/multitest/contracts.rs +++ b/packages/voting-contract/src/multitest/contracts.rs @@ -4,12 +4,12 @@ use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo}; use cw_multi_test::{Contract, ContractWrapper}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use tg_bindings::TgradeMsg; +use tg_bindings::{TgradeMsg, TgradeQuery}; pub use voting::VotingContract; -pub fn engagement_contract() -> Box> { - let contract = ContractWrapper::new( +pub fn engagement_contract() -> Box> { + let contract = ContractWrapper::<_, _, _, _, _, _, _, TgradeQuery>::new( tg4_engagement::contract::execute, tg4_engagement::contract::instantiate, tg4_engagement::contract::query, diff --git a/packages/voting-contract/src/multitest/contracts/voting.rs b/packages/voting-contract/src/multitest/contracts/voting.rs index f3a92165..29291cda 100644 --- a/packages/voting-contract/src/multitest/contracts/voting.rs +++ b/packages/voting-contract/src/multitest/contracts/voting.rs @@ -3,8 +3,9 @@ use crate::{ list_votes_by_voter, propose, query_group_contract, query_proposal, query_rules, query_vote, query_voter, reverse_proposals, state::VotingRules, ContractError, Response, }; -use cosmwasm_std::{from_slice, to_binary}; +use cosmwasm_std::{from_slice, to_binary, CustomQuery}; use tg3::Vote; +use tg_bindings::TgradeQuery; use super::*; @@ -90,10 +91,10 @@ pub enum QueryMsg { pub struct VotingContract; -impl Contract for VotingContract { +impl Contract for VotingContract { fn instantiate( &self, - deps: DepsMut, + deps: DepsMut, _env: Env, _info: MessageInfo, msg: Vec, @@ -105,7 +106,7 @@ impl Contract for VotingContract { fn execute( &self, - deps: DepsMut, + deps: DepsMut, env: Env, info: MessageInfo, msg: Vec, @@ -120,35 +121,39 @@ impl Contract for VotingContract { proposal, } => propose(deps, env, info, title, description, proposal), Vote { proposal_id, vote } => { - crate::vote::(deps, env, info, proposal_id, vote) + crate::vote::(deps, env, info, proposal_id, vote) } Execute { proposal_id } => execute(deps, env, info, proposal_id), - Close { proposal_id } => crate::close::(deps, env, info, proposal_id), + Close { proposal_id } => { + crate::close::(deps, env, info, proposal_id) + } } .map_err(anyhow::Error::from) } - fn query(&self, deps: Deps, env: Env, msg: Vec) -> anyhow::Result { + fn query(&self, deps: Deps, env: Env, msg: Vec) -> anyhow::Result { let msg: QueryMsg = from_slice(&msg)?; use QueryMsg::*; match msg { Rules {} => to_binary(&query_rules(deps)?), ListVoters { start_after, limit } => to_binary(&list_voters(deps, start_after, limit)?), - Proposal { proposal_id } => { - to_binary(&query_proposal::(deps, env, proposal_id)?) - } - Vote { proposal_id, voter } => to_binary(&query_vote(deps, proposal_id, voter)?), - ListProposals { start_after, limit } => to_binary(&list_proposals::( + Proposal { proposal_id } => to_binary(&query_proposal::( deps, env, - start_after, - limit, + proposal_id, + )?), + Vote { proposal_id, voter } => to_binary(&query_vote(deps, proposal_id, voter)?), + ListProposals { start_after, limit } => to_binary(&list_proposals::< + self::Proposal, + TgradeQuery, + >( + deps, env, start_after, limit )?), ReverseProposals { start_before, limit, - } => to_binary(&reverse_proposals::( + } => to_binary(&reverse_proposals::( deps, env, start_before, @@ -175,7 +180,7 @@ impl Contract for VotingContract { fn sudo( &self, - _deps: DepsMut, + _deps: DepsMut, _env: Env, _msg: Vec, ) -> anyhow::Result> { @@ -184,7 +189,7 @@ impl Contract for VotingContract { fn reply( &self, - _deps: DepsMut, + _deps: DepsMut, _env: Env, _msg: cosmwasm_std::Reply, ) -> anyhow::Result> { @@ -193,7 +198,7 @@ impl Contract for VotingContract { fn migrate( &self, - _deps: DepsMut, + _deps: DepsMut, _env: Env, _msg: Vec, ) -> anyhow::Result> { @@ -201,8 +206,8 @@ impl Contract for VotingContract { } } -fn execute( - deps: DepsMut, +fn execute( + deps: DepsMut, env: Env, info: MessageInfo, proposal_id: u64,