From a522e333d35e253d5a2241ac7834036363e38325 Mon Sep 17 00:00:00 2001 From: Gabe Lopez Date: Tue, 25 Feb 2025 12:39:47 -0600 Subject: [PATCH] Initial dao actions on instantiate (#903) --- ci/bootstrap-env/src/main.rs | 1 + ci/integration-tests/src/helpers/helper.rs | 1 + contracts/dao-dao-core/src/contract.rs | 20 ++++++++++++++++--- contracts/dao-dao-core/src/state.rs | 5 ++++- contracts/dao-dao-core/src/tests.rs | 13 ++++++++++++ .../btsg-ft-factory/src/testing/tests.rs | 4 ++++ .../cw-admin-factory/src/integration_tests.rs | 1 + .../external/cw-admin-factory/src/tests.rs | 2 ++ .../src/testing/suite.rs | 1 + .../src/testing/instantiate.rs | 7 +++++++ .../src/testing/instantiate.rs | 5 +++++ .../dao-proposal-hook-counter/src/tests.rs | 1 + .../src/testing/integration_tests.rs | 1 + .../src/testing/test_tube_env.rs | 1 + .../src/tests/test_tube/integration_tests.rs | 4 ++++ .../src/tests/test_tube/test_env.rs | 1 + justfile | 4 ++-- packages/dao-interface/src/msg.rs | 6 ++++++ packages/dao-testing/src/helpers.rs | 4 ++++ packages/dao-testing/src/suite/base.rs | 1 + 20 files changed, 77 insertions(+), 6 deletions(-) diff --git a/ci/bootstrap-env/src/main.rs b/ci/bootstrap-env/src/main.rs index 4d2c3731d..c8f073fce 100644 --- a/ci/bootstrap-env/src/main.rs +++ b/ci/bootstrap-env/src/main.rs @@ -122,6 +122,7 @@ fn main() -> Result<()> { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Init dao dao dao with an initial treasury of 9000000 tokens diff --git a/ci/integration-tests/src/helpers/helper.rs b/ci/integration-tests/src/helpers/helper.rs index 548fc59f5..e029ea503 100644 --- a/ci/integration-tests/src/helpers/helper.rs +++ b/ci/integration-tests/src/helpers/helper.rs @@ -105,6 +105,7 @@ pub fn create_dao( label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; chain diff --git a/contracts/dao-dao-core/src/contract.rs b/contracts/dao-dao-core/src/contract.rs index 1ee52a165..06c76fdbd 100644 --- a/contracts/dao-dao-core/src/contract.rs +++ b/contracts/dao-dao-core/src/contract.rs @@ -21,11 +21,11 @@ use dao_interface::{ voting, }; -use crate::error::ContractError; use crate::state::{ ACTIVE_PROPOSAL_MODULE_COUNT, ADMIN, CONFIG, CW20_LIST, CW721_LIST, ITEMS, NOMINATED_ADMIN, PAUSED, PROPOSAL_MODULES, SUBDAO_LIST, TOTAL_PROPOSAL_MODULE_COUNT, VOTING_MODULE, }; +use crate::{error::ContractError, state::INITIAL_DAO_ACTIONS}; pub(crate) const CONTRACT_NAME: &str = "crates.io:dao-dao-core"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -92,11 +92,18 @@ pub fn instantiate( TOTAL_PROPOSAL_MODULE_COUNT.save(deps.storage, &0)?; ACTIVE_PROPOSAL_MODULE_COUNT.save(deps.storage, &0)?; - Ok(Response::new() + let res = Response::new() .add_attribute("action", "instantiate") .add_attribute("sender", info.sender) .add_submessage(vote_module_msg) - .add_submessages(proposal_module_msgs)) + .add_submessages(proposal_module_msgs); + + if let Some(initial_dao_actions) = msg.initial_dao_actions { + INITIAL_DAO_ACTIONS.save(deps.storage, &initial_dao_actions)?; + + return Ok(res.add_messages(initial_dao_actions)); + } + Ok(res) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -595,6 +602,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { query_list_sub_daos(deps, start_after, limit) } QueryMsg::DaoURI {} => query_dao_uri(deps), + QueryMsg::InitialDaoActions {} => query_initial_dao_actions(deps), } } @@ -868,6 +876,12 @@ pub fn query_proposal_module_count(deps: Deps) -> StdResult { }) } +pub fn query_initial_dao_actions(deps: Deps) -> StdResult { + let actions = INITIAL_DAO_ACTIONS.may_load(deps.storage)?; + + to_json_binary(&actions) +} + #[cfg_attr(not(feature = "library"), entry_point)] pub fn migrate(deps: DepsMut, env: Env, msg: MigrateMsg) -> Result { let ContractVersion { version, .. } = get_contract_version(deps.storage)?; diff --git a/contracts/dao-dao-core/src/state.rs b/contracts/dao-dao-core/src/state.rs index cd9e6198d..483ba0c5b 100644 --- a/contracts/dao-dao-core/src/state.rs +++ b/contracts/dao-dao-core/src/state.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{Addr, Empty}; +use cosmwasm_std::{Addr, CosmosMsg, Empty}; use cw_storage_plus::{Item, Map}; use cw_utils::Expiration; use dao_interface::state::{Config, ProposalModule}; @@ -53,3 +53,6 @@ pub const CW721_LIST: Map = Map::new("cw721s"); /// List of SubDAOs associated to this DAO. Each SubDAO has an optional charter. pub const SUBDAO_LIST: Map<&Addr, Option> = Map::new("sub_daos"); + +/// List of initial dao actions. +pub const INITIAL_DAO_ACTIONS: Item> = Item::new("initial_dao_actions"); diff --git a/contracts/dao-dao-core/src/tests.rs b/contracts/dao-dao-core/src/tests.rs index 4c04f8cc3..9e2a379fc 100644 --- a/contracts/dao-dao-core/src/tests.rs +++ b/contracts/dao-dao-core/src/tests.rs @@ -80,6 +80,7 @@ fn test_instantiate_with_n_gov_modules(n: usize) { }) .collect(), initial_items: None, + initial_dao_actions: None, }; let gov_addr = instantiate_gov(&mut app, gov_id, instantiate); @@ -180,6 +181,7 @@ makes wickedness." }, proposal_modules_instantiate_info: governance_modules, initial_items: None, + initial_dao_actions: None, }; instantiate_gov(&mut app, gov_id, instantiate); } @@ -217,6 +219,7 @@ fn test_update_config() { label: "voting module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -316,6 +319,7 @@ fn test_swap_governance(swaps: Vec<(u32, u32)>) { label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -495,6 +499,7 @@ fn test_removed_modules_can_not_execute() { label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -658,6 +663,7 @@ fn test_module_already_disabled() { label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -760,6 +766,7 @@ fn test_swap_voting_module() { label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -866,6 +873,7 @@ fn test_permissions() { initial_items: None, automatically_add_cw20s: true, automatically_add_cw721s: true, + initial_dao_actions: None, }; let gov_addr = app @@ -966,6 +974,7 @@ fn do_standard_instantiate(auto_add: bool, admin: Option) -> (Addr, App) label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -1683,6 +1692,7 @@ fn test_list_items() { label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app @@ -1817,6 +1827,7 @@ fn test_instantiate_with_items() { label: "governance module".to_string(), }], initial_items: Some(initial_items.clone()), + initial_dao_actions: None, }; // Ensure duplicates are dissallowed. @@ -2646,6 +2657,7 @@ fn test_migrate_from_compatible() { label: "governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let core_addr = app @@ -2947,6 +2959,7 @@ fn test_module_prefixes() { }, ], initial_items: None, + initial_dao_actions: None, }; let gov_addr = app diff --git a/contracts/external/btsg-ft-factory/src/testing/tests.rs b/contracts/external/btsg-ft-factory/src/testing/tests.rs index d095b8280..82b08c662 100644 --- a/contracts/external/btsg-ft-factory/src/testing/tests.rs +++ b/contracts/external/btsg-ft-factory/src/testing/tests.rs @@ -91,6 +91,7 @@ fn test_issue_fantoken() -> anyhow::Result<()> { label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let dao = app @@ -194,6 +195,7 @@ fn test_initial_fantoken_balances() -> anyhow::Result<()> { label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let dao = app @@ -302,6 +304,7 @@ fn test_fantoken_minter_and_authority_set_to_dao() -> anyhow::Result<()> { label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let dao = app @@ -460,6 +463,7 @@ fn test_fantoken_can_be_staked() -> anyhow::Result<()> { label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let dao = app diff --git a/contracts/external/cw-admin-factory/src/integration_tests.rs b/contracts/external/cw-admin-factory/src/integration_tests.rs index 71d1b0bb8..280a8d302 100644 --- a/contracts/external/cw-admin-factory/src/integration_tests.rs +++ b/contracts/external/cw-admin-factory/src/integration_tests.rs @@ -99,6 +99,7 @@ fn test_set_self_admin_instantiate2() { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let salt = Binary::from("salt".as_bytes()); diff --git a/contracts/external/cw-admin-factory/src/tests.rs b/contracts/external/cw-admin-factory/src/tests.rs index 45b009979..efd8e4b9c 100644 --- a/contracts/external/cw-admin-factory/src/tests.rs +++ b/contracts/external/cw-admin-factory/src/tests.rs @@ -80,6 +80,7 @@ pub fn test_set_self_admin() { }, ], initial_items: None, + initial_dao_actions: None, }; let res: AppResponse = app @@ -174,6 +175,7 @@ pub fn test_authorized_set_self_admin() { }, ], initial_items: None, + initial_dao_actions: None, }; // Fails when not the admin. diff --git a/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs b/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs index 7ab46d511..ea8753c49 100644 --- a/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs +++ b/contracts/proposal/dao-proposal-condorcet/src/testing/suite.rs @@ -108,6 +108,7 @@ impl SuiteBuilder { label: "condorcet module".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; let core = app diff --git a/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs b/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs index 7a186c6de..8f20bfb88 100644 --- a/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs +++ b/contracts/proposal/dao-proposal-multiple/src/testing/instantiate.rs @@ -180,6 +180,7 @@ pub fn _instantiate_with_staked_cw721_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; @@ -299,6 +300,7 @@ pub fn instantiate_with_native_staked_balances_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; @@ -416,6 +418,7 @@ pub fn instantiate_with_cw20_balances_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; @@ -502,6 +505,7 @@ pub fn instantiate_with_staked_balances_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; @@ -641,6 +645,7 @@ pub fn instantiate_with_multiple_staked_balances_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; @@ -756,6 +761,7 @@ pub fn instantiate_with_staking_active_threshold( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; @@ -835,6 +841,7 @@ pub fn _instantiate_with_cw4_groups_governance( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, dao_uri: None, }; diff --git a/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs b/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs index 74b50330a..a21ab6cd8 100644 --- a/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs +++ b/contracts/proposal/dao-proposal-single/src/testing/instantiate.rs @@ -181,6 +181,7 @@ pub(crate) fn instantiate_with_staked_cw721_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let core_addr = app @@ -300,6 +301,7 @@ pub(crate) fn instantiate_with_native_staked_balances_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let core_addr = app @@ -421,6 +423,7 @@ pub(crate) fn instantiate_with_staked_balances_governance( label: "DAO DAO governance module.".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let core_addr = app @@ -536,6 +539,7 @@ pub(crate) fn instantiate_with_staking_active_threshold( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; app.instantiate_contract( @@ -615,6 +619,7 @@ pub(crate) fn instantiate_with_cw4_groups_governance( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let addr = app diff --git a/contracts/test/dao-proposal-hook-counter/src/tests.rs b/contracts/test/dao-proposal-hook-counter/src/tests.rs index 6255e6f97..230bf568d 100644 --- a/contracts/test/dao-proposal-hook-counter/src/tests.rs +++ b/contracts/test/dao-proposal-hook-counter/src/tests.rs @@ -87,6 +87,7 @@ fn instantiate_with_default_governance( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; instantiate_governance(app, governance_id, governance_instantiate) diff --git a/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs b/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs index 4739124f3..4792c94e2 100644 --- a/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs +++ b/contracts/voting/dao-voting-cw721-staked/src/testing/integration_tests.rs @@ -121,6 +121,7 @@ fn test_full_integration_with_factory() { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiating without funds fails diff --git a/contracts/voting/dao-voting-cw721-staked/src/testing/test_tube_env.rs b/contracts/voting/dao-voting-cw721-staked/src/testing/test_tube_env.rs index d8a67b05f..18f20183b 100644 --- a/contracts/voting/dao-voting-cw721-staked/src/testing/test_tube_env.rs +++ b/contracts/voting/dao-voting-cw721-staked/src/testing/test_tube_env.rs @@ -145,6 +145,7 @@ impl TestEnvBuilder { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiate DAO diff --git a/contracts/voting/dao-voting-token-staked/src/tests/test_tube/integration_tests.rs b/contracts/voting/dao-voting-token-staked/src/tests/test_tube/integration_tests.rs index 07fe47e87..17eb00b7a 100644 --- a/contracts/voting/dao-voting-token-staked/src/tests/test_tube/integration_tests.rs +++ b/contracts/voting/dao-voting-token-staked/src/tests/test_tube/integration_tests.rs @@ -405,6 +405,7 @@ fn test_factory() { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiate DAO succeeds @@ -516,6 +517,7 @@ fn test_factory_funds_pass_through() { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiate DAO fails because no funds to create the token were sent @@ -643,6 +645,7 @@ fn test_factory_no_callback() { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiate DAO fails because no callback @@ -725,6 +728,7 @@ fn test_factory_wrong_callback() { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiate DAO fails because of wrong callback diff --git a/contracts/voting/dao-voting-token-staked/src/tests/test_tube/test_env.rs b/contracts/voting/dao-voting-token-staked/src/tests/test_tube/test_env.rs index 416c955ae..5709a05d3 100644 --- a/contracts/voting/dao-voting-token-staked/src/tests/test_tube/test_env.rs +++ b/contracts/voting/dao-voting-token-staked/src/tests/test_tube/test_env.rs @@ -256,6 +256,7 @@ impl TestEnvBuilder { label: "DAO DAO Proposal Module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; // Instantiate DAO diff --git a/justfile b/justfile index 59bcd434e..ff52601ee 100644 --- a/justfile +++ b/justfile @@ -59,9 +59,9 @@ workspace-optimize: --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ --platform linux/arm64 \ - cosmwasm/optimizer-arm64:0.16.0; \ + cosmwasm/optimizer-arm64:0.16.1; \ elif [[ $(uname -m) == 'x86_64' ]]; then docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ --platform linux/amd64 \ - cosmwasm/optimizer:0.16.0; fi + cosmwasm/optimizer:0.16.1; fi diff --git a/packages/dao-interface/src/msg.rs b/packages/dao-interface/src/msg.rs index 969288433..b731e46f2 100644 --- a/packages/dao-interface/src/msg.rs +++ b/packages/dao-interface/src/msg.rs @@ -50,6 +50,8 @@ pub struct InstantiateMsg { pub initial_items: Option>, /// Implements the DAO Star standard: pub dao_uri: Option, + /// Optional initial actions for the DAO + pub initial_dao_actions: Option>, } #[cw_serde] @@ -229,6 +231,10 @@ pub enum QueryMsg { /// Returns the total voting power at a given block height. #[returns(crate::voting::TotalPowerAtHeightResponse)] TotalPowerAtHeight { height: Option }, + /// Returns the initial dao actions. + /// These are optional actions that were executed when the DAO was instantiated. + #[returns(Option>)] + InitialDaoActions {}, } #[allow(clippy::large_enum_variant)] diff --git a/packages/dao-testing/src/helpers.rs b/packages/dao-testing/src/helpers.rs index 0a36640f0..b404281af 100644 --- a/packages/dao-testing/src/helpers.rs +++ b/packages/dao-testing/src/helpers.rs @@ -80,6 +80,7 @@ pub fn instantiate_with_cw20_balances_governance( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; app.instantiate_contract( @@ -165,6 +166,7 @@ pub fn instantiate_with_staked_balances_governance( funds: vec![], }], initial_items: None, + initial_dao_actions: None, }; let core_addr = app @@ -286,6 +288,7 @@ pub fn instantiate_with_staking_active_threshold( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; app.instantiate_contract( @@ -360,6 +363,7 @@ pub fn instantiate_with_cw4_groups_governance( label: "DAO DAO governance module".to_string(), }], initial_items: None, + initial_dao_actions: None, }; let addr = app diff --git a/packages/dao-testing/src/suite/base.rs b/packages/dao-testing/src/suite/base.rs index 2b29927e4..6f08e6bb9 100644 --- a/packages/dao-testing/src/suite/base.rs +++ b/packages/dao-testing/src/suite/base.rs @@ -281,6 +281,7 @@ impl DaoTestingSuiteBase { proposal_modules_instantiate_info, initial_items: None, dao_uri: None, + initial_dao_actions: None, }; let res = self