1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
use cosmwasm_std::{CosmosMsg, Empty, Uint128};
use cw_utils::Duration;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use cw_core_macros::govmod_query;
use dao_voting::Threshold;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
/// The threshold a proposal must reach to complete.
pub threshold: Threshold,
/// The default maximum amount of time a proposal may be voted on
/// before expiring.
pub max_voting_period: Duration,
/// The minimum amount of time a proposal must be open before
/// passing. A proposal may fail before this amount of time has
/// elapsed, but it will not pass. This can be useful for
/// preventing governance attacks wherein an attacker aquires a
/// large number of tokens and forces a proposal through.
pub min_voting_period: Option<Duration>,
/// If set to true only members may execute passed
/// proposals. Otherwise, any address may execute a passed
/// proposal.
pub only_members_execute: bool,
/// Allows changing votes before the proposal expires. If this is
/// enabled proposals will not be able to complete early as final
/// vote information is not known until the time of proposal
/// expiration.
pub allow_revoting: bool,
/// Information about the deposit required to create a
/// proposal. None if there is no deposit requirement, Some
/// otherwise.
pub deposit_info: Option<DepositInfo>,
}
/// Information about the token to use for proposal deposits.
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DepositToken {
/// Use a specific token address as the deposit token.
Token { address: String },
/// Use the token address of the associated DAO's voting
/// module. NOTE: in order to use the token address of the voting
/// module the voting module must (1) use a cw20 token and (2)
/// implement the `TokenContract {}` query type defined by
/// `cw_core_macros::token_query`. Failing to implement that
/// and using this option will cause instantiation to fail.
VotingModuleToken {},
}
/// Information about the deposit required to create a proposal.
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct DepositInfo {
/// The address of the cw20 token to be used for proposal
/// deposits.
pub token: DepositToken,
/// The number of tokens that must be deposited to create a
/// proposal.
pub deposit: Uint128,
/// If failed proposals should have their deposits refunded.
pub refund_failed_proposals: bool,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
/// Creates a proposal in the governance module.
Propose {
/// The title of the proposal.
title: String,
/// A description of the proposal.
description: String,
/// The messages that should be executed in response to this
/// proposal passing.
msgs: Vec<CosmosMsg<Empty>>,
},
/// Votes on a proposal. Voting power is determined by the DAO's
/// voting power module.
Vote {
/// The ID of the proposal to vote on.
proposal_id: u64,
/// The senders position on the proposal.
vote: dao_voting::Vote,
},
/// Causes the messages associated with a passed proposal to be
/// executed by the DAO.
Execute {
/// The ID of the proposal to execute.
proposal_id: u64,
},
/// Closes a proposal that has failed (either not passed or timed
/// out). If applicable this will cause the proposal deposit
/// associated wth said proposal to be returned.
Close {
/// The ID of the proposal to close.
proposal_id: u64,
},
/// Updates the governance module's config.
UpdateConfig {
/// The new proposal passing threshold. This will only apply
/// to proposals created after the config update.
threshold: Threshold,
/// The default maximum amount of time a proposal may be voted
/// on before expiring. This will only apply to proposals
/// created after the config update.
max_voting_period: Duration,
/// The minimum amount of time a proposal must be open before
/// passing. A proposal may fail before this amount of time has
/// elapsed, but it will not pass. This can be useful for
/// preventing governance attacks wherein an attacker aquires a
/// large number of tokens and forces a proposal through.
min_voting_period: Option<Duration>,
/// If set to true only members may execute passed
/// proposals. Otherwise, any address may execute a passed
/// proposal. Applies to all outstanding and future proposals.
only_members_execute: bool,
/// Allows changing votes before the proposal expires. If this is
/// enabled proposals will not be able to complete early as final
/// vote information is not known until the time of proposal
/// expiration.
allow_revoting: bool,
/// The address if tge DAO that this governance module is
/// associated with.
dao: String,
/// Information about the deposit required to make a
/// proposal. None if no deposit, Some otherwise.
deposit_info: Option<DepositInfo>,
},
AddProposalHook {
address: String,
},
RemoveProposalHook {
address: String,
},
AddVoteHook {
address: String,
},
RemoveVoteHook {
address: String,
},
}
#[govmod_query]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
/// Gets the governance module's config. Returns `state::Config`.
Config {},
/// Gets information about a proposal. Returns
/// `proposals::Proposal`.
Proposal {
proposal_id: u64,
},
ListProposals {
start_after: Option<u64>,
limit: Option<u64>,
},
ReverseProposals {
start_before: Option<u64>,
limit: Option<u64>,
},
ProposalCount {},
Vote {
proposal_id: u64,
voter: String,
},
ListVotes {
proposal_id: u64,
start_after: Option<String>,
limit: Option<u64>,
},
ProposalHooks {},
VoteHooks {},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct MigrateMsg {}