From 92ba326a8e551720193bf13a9523ba8d9d1557c3 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:34:59 +0200 Subject: [PATCH 01/53] wip --- contracts/dao/subdao-registry/.cargo/config | 6 + .../.cargo/schema/execute_msg.json | 82 +++++++ .../.cargo/schema/instantiate_msg.json | 49 ++++ .../.cargo/schema/query_msg.json | 31 +++ contracts/dao/subdao-registry/Cargo.toml | 22 ++ contracts/dao/subdao-registry/README.md | 1 + .../dao/subdao-registry/examples/schema.rs | 31 +++ .../examples/schema/execute_msg.json | 82 +++++++ .../examples/schema/instantiate_msg.json | 49 ++++ .../examples/schema/query_msg.json | 31 +++ .../subdao-registry/schema/execute_msg.json | 82 +++++++ .../schema/instantiate_msg.json | 49 ++++ .../dao/subdao-registry/schema/query_msg.json | 31 +++ .../schema/schema/execute_msg.json | 82 +++++++ .../schema/schema/instantiate_msg.json | 49 ++++ .../schema/schema/query_msg.json | 31 +++ contracts/dao/subdao-registry/src/contract.rs | 216 ++++++++++++++++++ contracts/dao/subdao-registry/src/lib.rs | 5 + contracts/dao/subdao-registry/src/msg.rs | 57 +++++ .../src/schema/execute_msg.json | 82 +++++++ .../src/schema/instantiate_msg.json | 49 ++++ .../subdao-registry/src/schema/query_msg.json | 31 +++ contracts/dao/subdao-registry/src/state.rs | 26 +++ .../src/testing/mock_querier.rs | 22 ++ .../dao/subdao-registry/src/testing/mod.rs | 2 + .../dao/subdao-registry/src/testing/tests.rs | 195 ++++++++++++++++ 26 files changed, 1393 insertions(+) create mode 100644 contracts/dao/subdao-registry/.cargo/config create mode 100644 contracts/dao/subdao-registry/.cargo/schema/execute_msg.json create mode 100644 contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json create mode 100644 contracts/dao/subdao-registry/.cargo/schema/query_msg.json create mode 100644 contracts/dao/subdao-registry/Cargo.toml create mode 100644 contracts/dao/subdao-registry/README.md create mode 100644 contracts/dao/subdao-registry/examples/schema.rs create mode 100644 contracts/dao/subdao-registry/examples/schema/execute_msg.json create mode 100644 contracts/dao/subdao-registry/examples/schema/instantiate_msg.json create mode 100644 contracts/dao/subdao-registry/examples/schema/query_msg.json create mode 100644 contracts/dao/subdao-registry/schema/execute_msg.json create mode 100644 contracts/dao/subdao-registry/schema/instantiate_msg.json create mode 100644 contracts/dao/subdao-registry/schema/query_msg.json create mode 100644 contracts/dao/subdao-registry/schema/schema/execute_msg.json create mode 100644 contracts/dao/subdao-registry/schema/schema/instantiate_msg.json create mode 100644 contracts/dao/subdao-registry/schema/schema/query_msg.json create mode 100644 contracts/dao/subdao-registry/src/contract.rs create mode 100644 contracts/dao/subdao-registry/src/lib.rs create mode 100644 contracts/dao/subdao-registry/src/msg.rs create mode 100644 contracts/dao/subdao-registry/src/schema/execute_msg.json create mode 100644 contracts/dao/subdao-registry/src/schema/instantiate_msg.json create mode 100644 contracts/dao/subdao-registry/src/schema/query_msg.json create mode 100644 contracts/dao/subdao-registry/src/state.rs create mode 100644 contracts/dao/subdao-registry/src/testing/mock_querier.rs create mode 100644 contracts/dao/subdao-registry/src/testing/mod.rs create mode 100644 contracts/dao/subdao-registry/src/testing/tests.rs diff --git a/contracts/dao/subdao-registry/.cargo/config b/contracts/dao/subdao-registry/.cargo/config new file mode 100644 index 00000000..7c115322 --- /dev/null +++ b/contracts/dao/subdao-registry/.cargo/config @@ -0,0 +1,6 @@ +[alias] +wasm = "build --release --target wasm32-unknown-unknown" +wasm-debug = "build --target wasm32-unknown-unknown" +unit-test = "test --lib --features backtraces" +integration-test = "test --test integration" +schema = "run --example schema" diff --git a/contracts/dao/subdao-registry/.cargo/schema/execute_msg.json b/contracts/dao/subdao-registry/.cargo/schema/execute_msg.json new file mode 100644 index 00000000..991dcceb --- /dev/null +++ b/contracts/dao/subdao-registry/.cargo/schema/execute_msg.json @@ -0,0 +1,82 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer the contract's ownership to another account", + "type": "object", + "required": [ + "transfer_ownership" + ], + "properties": { + "transfer_ownership": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Distribute pending funds between Bank and Distribution accounts", + "type": "object", + "required": [ + "distribute" + ], + "properties": { + "distribute": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_config" + ], + "properties": { + "update_config": { + "type": "object", + "properties": { + "distribution_contract": { + "type": [ + "string", + "null" + ] + }, + "distribution_rate": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "min_period": { + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "reserve_contract": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json b/contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json new file mode 100644 index 00000000..cdd51d4c --- /dev/null +++ b/contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "denom", + "distribution_contract", + "distribution_rate", + "min_period", + "owner", + "reserve_contract" + ], + "properties": { + "denom": { + "type": "string" + }, + "distribution_contract": { + "description": "Address of distribution contract", + "type": "string" + }, + "distribution_rate": { + "description": "Distribution rate (0-1) which goes to distribution contract", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_period": { + "description": "Minimum period between distribution calls", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "reserve_contract": { + "description": "Address of reserve contract", + "type": "string" + } + }, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/.cargo/schema/query_msg.json b/contracts/dao/subdao-registry/.cargo/schema/query_msg.json new file mode 100644 index 00000000..967b89ed --- /dev/null +++ b/contracts/dao/subdao-registry/.cargo/schema/query_msg.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "The contract's configurations; returns [`ConfigResponse`]", + "type": "object", + "required": [ + "config" + ], + "properties": { + "config": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "stats" + ], + "properties": { + "stats": { + "type": "object" + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/dao/subdao-registry/Cargo.toml b/contracts/dao/subdao-registry/Cargo.toml new file mode 100644 index 00000000..15c45822 --- /dev/null +++ b/contracts/dao/subdao-registry/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "neutron-subdao-registry" +version = "0.1.0" +authors = ["oldremez"] +edition = "2021" +license = "Apache-2.0" +repository = "https://github.com/neutron/neutron-dao" + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +backtraces = ["cosmwasm-std/backtraces"] + +[dependencies] +cosmwasm-std = { version = "1.0" } +cw-storage-plus = "1.0.1" +schemars = "0.8.1" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } + +[dev-dependencies] +cosmwasm-schema = { version = "1.0.0", default-features = false } diff --git a/contracts/dao/subdao-registry/README.md b/contracts/dao/subdao-registry/README.md new file mode 100644 index 00000000..7ea2d5e1 --- /dev/null +++ b/contracts/dao/subdao-registry/README.md @@ -0,0 +1 @@ +# Neutron subdao registry diff --git a/contracts/dao/subdao-registry/examples/schema.rs b/contracts/dao/subdao-registry/examples/schema.rs new file mode 100644 index 00000000..7fa49979 --- /dev/null +++ b/contracts/dao/subdao-registry/examples/schema.rs @@ -0,0 +1,31 @@ +// Copyright 2022 Neutron +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::env::current_dir; +use std::fs::create_dir_all; + +use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; + +use neutron_treasury::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +fn main() { + let mut out_dir = current_dir().unwrap(); + out_dir.push("schema"); + create_dir_all(&out_dir).unwrap(); + remove_schemas(&out_dir).unwrap(); + + export_schema(&schema_for!(InstantiateMsg), &out_dir); + export_schema(&schema_for!(ExecuteMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); +} diff --git a/contracts/dao/subdao-registry/examples/schema/execute_msg.json b/contracts/dao/subdao-registry/examples/schema/execute_msg.json new file mode 100644 index 00000000..991dcceb --- /dev/null +++ b/contracts/dao/subdao-registry/examples/schema/execute_msg.json @@ -0,0 +1,82 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer the contract's ownership to another account", + "type": "object", + "required": [ + "transfer_ownership" + ], + "properties": { + "transfer_ownership": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Distribute pending funds between Bank and Distribution accounts", + "type": "object", + "required": [ + "distribute" + ], + "properties": { + "distribute": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_config" + ], + "properties": { + "update_config": { + "type": "object", + "properties": { + "distribution_contract": { + "type": [ + "string", + "null" + ] + }, + "distribution_rate": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "min_period": { + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "reserve_contract": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/examples/schema/instantiate_msg.json b/contracts/dao/subdao-registry/examples/schema/instantiate_msg.json new file mode 100644 index 00000000..cdd51d4c --- /dev/null +++ b/contracts/dao/subdao-registry/examples/schema/instantiate_msg.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "denom", + "distribution_contract", + "distribution_rate", + "min_period", + "owner", + "reserve_contract" + ], + "properties": { + "denom": { + "type": "string" + }, + "distribution_contract": { + "description": "Address of distribution contract", + "type": "string" + }, + "distribution_rate": { + "description": "Distribution rate (0-1) which goes to distribution contract", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_period": { + "description": "Minimum period between distribution calls", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "reserve_contract": { + "description": "Address of reserve contract", + "type": "string" + } + }, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/examples/schema/query_msg.json b/contracts/dao/subdao-registry/examples/schema/query_msg.json new file mode 100644 index 00000000..967b89ed --- /dev/null +++ b/contracts/dao/subdao-registry/examples/schema/query_msg.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "The contract's configurations; returns [`ConfigResponse`]", + "type": "object", + "required": [ + "config" + ], + "properties": { + "config": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "stats" + ], + "properties": { + "stats": { + "type": "object" + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/dao/subdao-registry/schema/execute_msg.json b/contracts/dao/subdao-registry/schema/execute_msg.json new file mode 100644 index 00000000..991dcceb --- /dev/null +++ b/contracts/dao/subdao-registry/schema/execute_msg.json @@ -0,0 +1,82 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer the contract's ownership to another account", + "type": "object", + "required": [ + "transfer_ownership" + ], + "properties": { + "transfer_ownership": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Distribute pending funds between Bank and Distribution accounts", + "type": "object", + "required": [ + "distribute" + ], + "properties": { + "distribute": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_config" + ], + "properties": { + "update_config": { + "type": "object", + "properties": { + "distribution_contract": { + "type": [ + "string", + "null" + ] + }, + "distribution_rate": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "min_period": { + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "reserve_contract": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/schema/instantiate_msg.json b/contracts/dao/subdao-registry/schema/instantiate_msg.json new file mode 100644 index 00000000..cdd51d4c --- /dev/null +++ b/contracts/dao/subdao-registry/schema/instantiate_msg.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "denom", + "distribution_contract", + "distribution_rate", + "min_period", + "owner", + "reserve_contract" + ], + "properties": { + "denom": { + "type": "string" + }, + "distribution_contract": { + "description": "Address of distribution contract", + "type": "string" + }, + "distribution_rate": { + "description": "Distribution rate (0-1) which goes to distribution contract", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_period": { + "description": "Minimum period between distribution calls", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "reserve_contract": { + "description": "Address of reserve contract", + "type": "string" + } + }, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/schema/query_msg.json b/contracts/dao/subdao-registry/schema/query_msg.json new file mode 100644 index 00000000..967b89ed --- /dev/null +++ b/contracts/dao/subdao-registry/schema/query_msg.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "The contract's configurations; returns [`ConfigResponse`]", + "type": "object", + "required": [ + "config" + ], + "properties": { + "config": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "stats" + ], + "properties": { + "stats": { + "type": "object" + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/dao/subdao-registry/schema/schema/execute_msg.json b/contracts/dao/subdao-registry/schema/schema/execute_msg.json new file mode 100644 index 00000000..991dcceb --- /dev/null +++ b/contracts/dao/subdao-registry/schema/schema/execute_msg.json @@ -0,0 +1,82 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer the contract's ownership to another account", + "type": "object", + "required": [ + "transfer_ownership" + ], + "properties": { + "transfer_ownership": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Distribute pending funds between Bank and Distribution accounts", + "type": "object", + "required": [ + "distribute" + ], + "properties": { + "distribute": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_config" + ], + "properties": { + "update_config": { + "type": "object", + "properties": { + "distribution_contract": { + "type": [ + "string", + "null" + ] + }, + "distribution_rate": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "min_period": { + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "reserve_contract": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/schema/schema/instantiate_msg.json b/contracts/dao/subdao-registry/schema/schema/instantiate_msg.json new file mode 100644 index 00000000..cdd51d4c --- /dev/null +++ b/contracts/dao/subdao-registry/schema/schema/instantiate_msg.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "denom", + "distribution_contract", + "distribution_rate", + "min_period", + "owner", + "reserve_contract" + ], + "properties": { + "denom": { + "type": "string" + }, + "distribution_contract": { + "description": "Address of distribution contract", + "type": "string" + }, + "distribution_rate": { + "description": "Distribution rate (0-1) which goes to distribution contract", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_period": { + "description": "Minimum period between distribution calls", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "reserve_contract": { + "description": "Address of reserve contract", + "type": "string" + } + }, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/schema/schema/query_msg.json b/contracts/dao/subdao-registry/schema/schema/query_msg.json new file mode 100644 index 00000000..967b89ed --- /dev/null +++ b/contracts/dao/subdao-registry/schema/schema/query_msg.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "The contract's configurations; returns [`ConfigResponse`]", + "type": "object", + "required": [ + "config" + ], + "properties": { + "config": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "stats" + ], + "properties": { + "stats": { + "type": "object" + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/dao/subdao-registry/src/contract.rs b/contracts/dao/subdao-registry/src/contract.rs new file mode 100644 index 00000000..cc98b7fb --- /dev/null +++ b/contracts/dao/subdao-registry/src/contract.rs @@ -0,0 +1,216 @@ +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; +use cosmwasm_std::{ + coins, to_binary, Addr, BankMsg, Binary, CosmosMsg, Decimal, Deps, DepsMut, Env, MessageInfo, + Response, StdError, StdResult, Uint128, WasmMsg, +}; + +use crate::msg::{DistributeMsg, ExecuteMsg, InstantiateMsg, QueryMsg, StatsResponse}; +use crate::state::{ + Config, CONFIG, LAST_DISTRIBUTION_TIME, TOTAL_DISTRIBUTED, TOTAL_RECEIVED, TOTAL_RESERVED, +}; + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: InstantiateMsg, +) -> StdResult { + let config = Config { + denom: msg.denom, + min_period: msg.min_period, + distribution_contract: deps.api.addr_validate(msg.distribution_contract.as_str())?, + reserve_contract: deps.api.addr_validate(msg.reserve_contract.as_str())?, + distribution_rate: msg.distribution_rate, + owner: deps.api.addr_validate(&msg.owner)?, + }; + CONFIG.save(deps.storage, &config)?; + TOTAL_RECEIVED.save(deps.storage, &Uint128::zero())?; + TOTAL_DISTRIBUTED.save(deps.storage, &Uint128::zero())?; + TOTAL_RESERVED.save(deps.storage, &Uint128::zero())?; + LAST_DISTRIBUTION_TIME.save(deps.storage, &0)?; + + Ok(Response::new()) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> StdResult { + let api = deps.api; + match msg { + // permissioned - owner + ExecuteMsg::TransferOwnership(new_owner) => { + execute_transfer_ownership(deps, info, api.addr_validate(&new_owner)?) + } + // permissionless + ExecuteMsg::Distribute {} => execute_distribute(deps, env), + + // permissioned - owner + ExecuteMsg::UpdateConfig { + distribution_rate, + min_period, + distribution_contract, + reserve_contract, + } => execute_update_config( + deps, + info, + distribution_rate, + min_period, + distribution_contract, + reserve_contract, + ), + } +} + +pub fn execute_add_subdao( + deps: DepsMut, + info: MessageInfo, + new_owner_addr: Addr, +) -> StdResult { + let config = CONFIG.load(deps.storage)?; + let sender_addr = info.sender; + let old_owner = config.owner; + if sender_addr != old_owner { + return Err(StdError::generic_err("unauthorized")); + } + + CONFIG.update(deps.storage, |mut config| -> StdResult<_> { + config.owner = new_owner_addr.clone(); + Ok(config) + })?; + + Ok(Response::new() + .add_attribute("action", "neutron/treasury/transfer_ownership") + .add_attribute("previous_owner", old_owner) + .add_attribute("new_owner", new_owner_addr)) +} + +pub fn execute_update_config( + deps: DepsMut, + info: MessageInfo, + distribution_rate: Option, + min_period: Option, + distribution_contract: Option, + reserve_contract: Option, +) -> StdResult { + let mut config: Config = CONFIG.load(deps.storage)?; + if info.sender != config.owner { + return Err(StdError::generic_err("unauthorized")); + } + + if let Some(min_period) = min_period { + config.min_period = min_period; + } + if let Some(distribution_contract) = distribution_contract { + config.distribution_contract = deps.api.addr_validate(distribution_contract.as_str())?; + } + if let Some(reserve_contract) = reserve_contract { + config.reserve_contract = deps.api.addr_validate(reserve_contract.as_str())?; + } + if let Some(distribution_rate) = distribution_rate { + if (distribution_rate > Decimal::one()) || (distribution_rate < Decimal::zero()) { + return Err(StdError::generic_err( + "distribution_rate must be between 0 and 1", + )); + } + config.distribution_rate = distribution_rate; + } + + CONFIG.save(deps.storage, &config)?; + + Ok(Response::new() + .add_attribute("action", "neutron/treasury/update_config") + .add_attribute("denom", config.denom) + .add_attribute("min_period", config.min_period.to_string()) + .add_attribute("distribution_contract", config.distribution_contract) + .add_attribute("distribution_rate", config.distribution_rate.to_string()) + .add_attribute("owner", config.owner)) +} + +pub fn execute_distribute(deps: DepsMut, env: Env) -> StdResult { + let config: Config = CONFIG.load(deps.storage)?; + let denom = config.denom; + let current_time = env.block.time.seconds(); + if current_time - LAST_DISTRIBUTION_TIME.load(deps.storage)? < config.min_period { + return Err(StdError::generic_err("too soon to distribute")); + } + LAST_DISTRIBUTION_TIME.save(deps.storage, ¤t_time)?; + let current_balance = deps + .querier + .query_balance(env.contract.address, &denom)? + .amount; + + if current_balance.is_zero() { + return Err(StdError::GenericErr { + msg: "no new funds to distribute".to_string(), + }); + } + + let to_distribute = current_balance * config.distribution_rate; + let to_reserve = current_balance.checked_sub(to_distribute)?; + // update stats + let total_received = TOTAL_RECEIVED.load(deps.storage)?; + TOTAL_RECEIVED.save( + deps.storage, + &(total_received.checked_add(current_balance)?), + )?; + let total_distributed = TOTAL_DISTRIBUTED.load(deps.storage)?; + TOTAL_DISTRIBUTED.save( + deps.storage, + &(total_distributed.checked_add(to_distribute)?), + )?; + let total_reserved = TOTAL_RESERVED.load(deps.storage)?; + TOTAL_RESERVED.save(deps.storage, &(total_reserved.checked_add(to_reserve)?))?; + + let mut resp = Response::default(); + if !to_distribute.is_zero() { + let msg = CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: config.distribution_contract.to_string(), + funds: coins(to_distribute.u128(), denom.clone()), + msg: to_binary(&DistributeMsg::Fund {})?, + }); + resp = resp.add_message(msg) + } + + if !to_reserve.is_zero() { + let msg = CosmosMsg::Bank(BankMsg::Send { + to_address: config.reserve_contract.to_string(), + amount: coins(to_reserve.u128(), denom), + }); + resp = resp.add_message(msg); + } + + Ok(resp + .add_attribute("action", "neutron/treasury/distribute") + .add_attribute("reserved", to_reserve) + .add_attribute("distributed", to_distribute)) +} + +//-------------------------------------------------------------------------------------------------- +// Queries +//-------------------------------------------------------------------------------------------------- + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::Stats {} => to_binary(&query_stats(deps)?), + } +} + +pub fn query_config(deps: Deps) -> StdResult { + let config = CONFIG.load(deps.storage)?; + Ok(config) +} + +pub fn query_stats(deps: Deps) -> StdResult { + let total_received = TOTAL_RECEIVED.load(deps.storage)?; + let total_distributed = TOTAL_DISTRIBUTED.load(deps.storage)?; + let total_reserved = TOTAL_RESERVED.load(deps.storage)?; + + Ok(StatsResponse { + total_received, + total_distributed, + total_reserved, + }) +} diff --git a/contracts/dao/subdao-registry/src/lib.rs b/contracts/dao/subdao-registry/src/lib.rs new file mode 100644 index 00000000..2a287a05 --- /dev/null +++ b/contracts/dao/subdao-registry/src/lib.rs @@ -0,0 +1,5 @@ +pub mod contract; +pub mod msg; +pub mod state; +#[cfg(test)] +mod testing; diff --git a/contracts/dao/subdao-registry/src/msg.rs b/contracts/dao/subdao-registry/src/msg.rs new file mode 100644 index 00000000..58db1887 --- /dev/null +++ b/contracts/dao/subdao-registry/src/msg.rs @@ -0,0 +1,57 @@ +use cosmwasm_std::{Decimal, Uint128}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct InstantiateMsg { + pub owner: String, + pub denom: String, + /// Distribution rate (0-1) which goes to distribution contract + pub distribution_rate: Decimal, + /// Minimum period between distribution calls + pub min_period: u64, + /// Address of distribution contract + pub distribution_contract: String, + /// Address of reserve contract + pub reserve_contract: String, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg { + /// Transfer the contract's ownership to another account + TransferOwnership(String), + + /// Distribute pending funds between Bank and Distribution accounts + Distribute {}, + + // //Update config + UpdateConfig { + distribution_rate: Option, + min_period: Option, + distribution_contract: Option, + reserve_contract: Option, + }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg { + /// The contract's configurations; returns [`ConfigResponse`] + Config {}, + Stats {}, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct StatsResponse { + pub total_received: Uint128, + pub total_distributed: Uint128, + pub total_reserved: Uint128, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum DistributeMsg { + Fund {}, +} diff --git a/contracts/dao/subdao-registry/src/schema/execute_msg.json b/contracts/dao/subdao-registry/src/schema/execute_msg.json new file mode 100644 index 00000000..991dcceb --- /dev/null +++ b/contracts/dao/subdao-registry/src/schema/execute_msg.json @@ -0,0 +1,82 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer the contract's ownership to another account", + "type": "object", + "required": [ + "transfer_ownership" + ], + "properties": { + "transfer_ownership": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Distribute pending funds between Bank and Distribution accounts", + "type": "object", + "required": [ + "distribute" + ], + "properties": { + "distribute": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_config" + ], + "properties": { + "update_config": { + "type": "object", + "properties": { + "distribution_contract": { + "type": [ + "string", + "null" + ] + }, + "distribution_rate": { + "anyOf": [ + { + "$ref": "#/definitions/Decimal" + }, + { + "type": "null" + } + ] + }, + "min_period": { + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 0.0 + }, + "reserve_contract": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/src/schema/instantiate_msg.json b/contracts/dao/subdao-registry/src/schema/instantiate_msg.json new file mode 100644 index 00000000..cdd51d4c --- /dev/null +++ b/contracts/dao/subdao-registry/src/schema/instantiate_msg.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "denom", + "distribution_contract", + "distribution_rate", + "min_period", + "owner", + "reserve_contract" + ], + "properties": { + "denom": { + "type": "string" + }, + "distribution_contract": { + "description": "Address of distribution contract", + "type": "string" + }, + "distribution_rate": { + "description": "Distribution rate (0-1) which goes to distribution contract", + "allOf": [ + { + "$ref": "#/definitions/Decimal" + } + ] + }, + "min_period": { + "description": "Minimum period between distribution calls", + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "reserve_contract": { + "description": "Address of reserve contract", + "type": "string" + } + }, + "definitions": { + "Decimal": { + "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", + "type": "string" + } + } +} diff --git a/contracts/dao/subdao-registry/src/schema/query_msg.json b/contracts/dao/subdao-registry/src/schema/query_msg.json new file mode 100644 index 00000000..967b89ed --- /dev/null +++ b/contracts/dao/subdao-registry/src/schema/query_msg.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "The contract's configurations; returns [`ConfigResponse`]", + "type": "object", + "required": [ + "config" + ], + "properties": { + "config": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "stats" + ], + "properties": { + "stats": { + "type": "object" + } + }, + "additionalProperties": false + } + ] +} diff --git a/contracts/dao/subdao-registry/src/state.rs b/contracts/dao/subdao-registry/src/state.rs new file mode 100644 index 00000000..9c18d4bd --- /dev/null +++ b/contracts/dao/subdao-registry/src/state.rs @@ -0,0 +1,26 @@ +use cosmwasm_std::{Addr, Decimal, Uint128}; +use cw_storage_plus::Item; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct Config { + /// Distribution rate (0-1) which goes to distribution contract + pub distribution_rate: Decimal, + /// Address of distribution contract, which will receive funds defined but distribution_rate % + pub distribution_contract: Addr, + /// Address of reserve contract, which will receive funds defined by 100-distribution_rate % + pub reserve_contract: Addr, + /// Minimum period between distribution calls + pub min_period: u64, + pub denom: String, + pub owner: Addr, +} + +pub const TOTAL_RECEIVED: Item = Item::new("total_received"); +pub const TOTAL_DISTRIBUTED: Item = Item::new("total_distributed"); +pub const TOTAL_RESERVED: Item = Item::new("total_reserved"); + +pub const LAST_DISTRIBUTION_TIME: Item = Item::new("last_grab_time"); + +pub const CONFIG: Item = Item::new("config"); diff --git a/contracts/dao/subdao-registry/src/testing/mock_querier.rs b/contracts/dao/subdao-registry/src/testing/mock_querier.rs new file mode 100644 index 00000000..df2eaa1f --- /dev/null +++ b/contracts/dao/subdao-registry/src/testing/mock_querier.rs @@ -0,0 +1,22 @@ +use std::marker::PhantomData; + +use cosmwasm_std::{ + testing::{MockApi, MockQuerier, MockStorage}, + Coin, OwnedDeps, +}; + +const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; + +pub fn mock_dependencies( + contract_balance: &[Coin], +) -> OwnedDeps { + let contract_addr = MOCK_CONTRACT_ADDR; + let custom_querier = MockQuerier::new(&[(contract_addr, contract_balance)]); + + OwnedDeps { + storage: MockStorage::default(), + api: MockApi::default(), + querier: custom_querier, + custom_query_type: PhantomData, + } +} diff --git a/contracts/dao/subdao-registry/src/testing/mod.rs b/contracts/dao/subdao-registry/src/testing/mod.rs new file mode 100644 index 00000000..a1e507b6 --- /dev/null +++ b/contracts/dao/subdao-registry/src/testing/mod.rs @@ -0,0 +1,2 @@ +mod mock_querier; +mod tests; diff --git a/contracts/dao/subdao-registry/src/testing/tests.rs b/contracts/dao/subdao-registry/src/testing/tests.rs new file mode 100644 index 00000000..22b7e6c0 --- /dev/null +++ b/contracts/dao/subdao-registry/src/testing/tests.rs @@ -0,0 +1,195 @@ +use std::str::FromStr; + +use cosmwasm_std::{ + coin, coins, + testing::{mock_env, mock_info}, + to_binary, BankMsg, Coin, CosmosMsg, Decimal, DepsMut, Empty, Uint128, WasmMsg, +}; + +use crate::{ + contract::{execute, instantiate}, + msg::{DistributeMsg, ExecuteMsg, InstantiateMsg}, + state::{CONFIG, TOTAL_DISTRIBUTED, TOTAL_RECEIVED, TOTAL_RESERVED}, + testing::mock_querier::mock_dependencies, +}; + +const DENOM: &str = "denom"; + +pub fn init_base_contract(deps: DepsMut, distribution_rate: &str) { + let msg = InstantiateMsg { + denom: DENOM.to_string(), + min_period: 1000, + distribution_contract: "distribution_contract".to_string(), + reserve_contract: "reserve_contract".to_string(), + distribution_rate: Decimal::from_str(distribution_rate).unwrap(), + owner: "owner".to_string(), + }; + let info = mock_info("creator", &coins(2, DENOM)); + instantiate(deps, mock_env(), info, msg).unwrap(); +} + +#[test] +fn test_transfer_ownership() { + let mut deps = mock_dependencies(&[]); + init_base_contract(deps.as_mut(), "0.23"); + let msg = ExecuteMsg::TransferOwnership("new_owner".to_string()); + let res = execute(deps.as_mut(), mock_env(), mock_info("owner", &[]), msg); + assert!(res.is_ok()); + let config = CONFIG.load(deps.as_ref().storage).unwrap(); + assert_eq!(config.owner.to_string(), "new_owner".to_string()); +} + +#[test] +fn test_collect_with_no_money() { + let mut deps = mock_dependencies(&[]); + init_base_contract(deps.as_mut(), "1"); + let msg = ExecuteMsg::Distribute {}; + let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); + assert!(res.is_err()); + assert_eq!( + res.unwrap_err().to_string(), + "Generic error: no new funds to distribute" + ); +} + +#[test] +fn test_distribute_success() { + let mut deps = mock_dependencies(&[coin(1000000, DENOM)]); + init_base_contract(deps.as_mut(), "0.23"); + let msg = ExecuteMsg::Distribute {}; + let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); + assert!(res.is_ok()); + let messages = res.unwrap().messages; + assert_eq!(messages.len(), 2); + assert_eq!( + messages[0].msg, + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "distribution_contract".to_string(), + funds: vec![Coin { + denom: DENOM.to_string(), + amount: Uint128::from(230000u128) + }], + msg: to_binary(&DistributeMsg::Fund {}).unwrap(), + }) + ); + assert_eq!( + messages[1].msg, + CosmosMsg::Bank(BankMsg::Send { + to_address: "reserve_contract".to_string(), + amount: vec![Coin { + denom: DENOM.to_string(), + amount: Uint128::from(770000u128) + }] + }) + ); + let total_received = TOTAL_RECEIVED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_received, Uint128::from(1000000u128)); + let total_reserved = TOTAL_RESERVED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_reserved, Uint128::from(770000u128)); + let total_distributed = TOTAL_DISTRIBUTED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_distributed, Uint128::from(230000u128)); +} + +#[test] +fn test_distribute_zero_to_reserve() { + let mut deps = mock_dependencies(&[coin(1000000, DENOM)]); + init_base_contract(deps.as_mut(), "1"); + let msg = ExecuteMsg::Distribute {}; + let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); + assert!(res.is_ok()); + let messages = res.unwrap().messages; + assert_eq!(messages.len(), 1); + assert_eq!( + messages[0].msg, + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "distribution_contract".to_string(), + funds: vec![Coin { + denom: DENOM.to_string(), + amount: Uint128::from(1000000u128) + }], + msg: to_binary(&DistributeMsg::Fund {}).unwrap(), + }) + ); + + let total_received = TOTAL_RECEIVED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_received, Uint128::from(1000000u128)); + let total_reserved = TOTAL_RESERVED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_reserved, Uint128::from(0u128)); + let total_distributed = TOTAL_DISTRIBUTED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_distributed, Uint128::from(1000000u128)); +} + +#[test] +fn test_distribute_zero_to_distribution_contract() { + let mut deps = mock_dependencies(&[coin(1000000, DENOM)]); + init_base_contract(deps.as_mut(), "0"); + let msg = ExecuteMsg::Distribute {}; + let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); + assert!(res.is_ok()); + let messages = res.unwrap().messages; + assert_eq!(messages.len(), 1); + assert_eq!( + messages[0].msg, + CosmosMsg::Bank(BankMsg::Send { + to_address: "reserve_contract".to_string(), + amount: vec![Coin { + denom: DENOM.to_string(), + amount: Uint128::from(1000000u128) + }] + }) + ); + let total_received = TOTAL_RECEIVED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_received, Uint128::from(1000000u128)); + let total_reserved = TOTAL_RESERVED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_reserved, Uint128::from(1000000u128)); + let total_distributed = TOTAL_DISTRIBUTED.load(deps.as_ref().storage).unwrap(); + assert_eq!(total_distributed, Uint128::from(0u128)); +} + +#[test] +fn test_update_config_unauthorized() { + let mut deps = mock_dependencies(&[]); + init_base_contract(deps.as_mut(), "1"); + let msg = ExecuteMsg::UpdateConfig { + distribution_contract: None, + reserve_contract: None, + distribution_rate: None, + min_period: None, + }; + let res = execute(deps.as_mut(), mock_env(), mock_info("not_owner", &[]), msg); + assert!(res.is_err()); + assert_eq!(res.unwrap_err().to_string(), "Generic error: unauthorized"); +} + +#[test] +fn test_update_config_success() { + let mut deps = mock_dependencies(&[]); + init_base_contract(deps.as_mut(), "1"); + let msg = ExecuteMsg::UpdateConfig { + distribution_contract: Some("new_contract".to_string()), + reserve_contract: Some("new_reserve_contract".to_string()), + distribution_rate: Some(Decimal::from_str("0.11").unwrap()), + min_period: Some(3000), + }; + let res = execute(deps.as_mut(), mock_env(), mock_info("owner", &[]), msg); + assert!(res.is_ok()); + let config = CONFIG.load(deps.as_ref().storage).unwrap(); + assert_eq!(config.distribution_contract, "new_contract"); + assert_eq!(config.reserve_contract, "new_reserve_contract"); + assert_eq!(config.distribution_rate, Decimal::from_str("0.11").unwrap()); + assert_eq!(config.min_period, 3000); +} + +#[test] +fn test_update_distribution_rate_below_the_limit() { + let mut deps = mock_dependencies(&[]); + init_base_contract(deps.as_mut(), "1"); + let msg = ExecuteMsg::UpdateConfig { + distribution_contract: None, + reserve_contract: None, + distribution_rate: Some(Decimal::from_str("2").unwrap()), + min_period: None, + }; + let res = execute(deps.as_mut(), mock_env(), mock_info("owner", &[]), msg); + assert!(res.is_err()); +} From 6413f495a6ff14064c108ab8a428499f45a165fc Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 12 Jan 2023 13:04:19 +0200 Subject: [PATCH 02/53] wip --- .../src/contract.rs | 40 +--- .../src/msg.rs | 38 +++ contracts/dao/subdao-registry/.cargo/config | 6 - .../.cargo/schema/execute_msg.json | 82 ------- .../.cargo/schema/instantiate_msg.json | 49 ---- .../.cargo/schema/query_msg.json | 31 --- contracts/dao/subdao-registry/Cargo.toml | 22 -- contracts/dao/subdao-registry/README.md | 1 - .../dao/subdao-registry/examples/schema.rs | 31 --- .../examples/schema/execute_msg.json | 82 ------- .../examples/schema/instantiate_msg.json | 49 ---- .../examples/schema/query_msg.json | 31 --- .../subdao-registry/schema/execute_msg.json | 82 ------- .../schema/instantiate_msg.json | 49 ---- .../dao/subdao-registry/schema/query_msg.json | 31 --- .../schema/schema/execute_msg.json | 82 ------- .../schema/schema/instantiate_msg.json | 49 ---- .../schema/schema/query_msg.json | 31 --- contracts/dao/subdao-registry/src/contract.rs | 216 ------------------ contracts/dao/subdao-registry/src/lib.rs | 5 - contracts/dao/subdao-registry/src/msg.rs | 57 ----- .../src/schema/execute_msg.json | 82 ------- .../src/schema/instantiate_msg.json | 49 ---- .../subdao-registry/src/schema/query_msg.json | 31 --- contracts/dao/subdao-registry/src/state.rs | 26 --- .../src/testing/mock_querier.rs | 22 -- .../dao/subdao-registry/src/testing/mod.rs | 2 - .../dao/subdao-registry/src/testing/tests.rs | 195 ---------------- 28 files changed, 42 insertions(+), 1429 deletions(-) create mode 100644 contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs delete mode 100644 contracts/dao/subdao-registry/.cargo/config delete mode 100644 contracts/dao/subdao-registry/.cargo/schema/execute_msg.json delete mode 100644 contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json delete mode 100644 contracts/dao/subdao-registry/.cargo/schema/query_msg.json delete mode 100644 contracts/dao/subdao-registry/Cargo.toml delete mode 100644 contracts/dao/subdao-registry/README.md delete mode 100644 contracts/dao/subdao-registry/examples/schema.rs delete mode 100644 contracts/dao/subdao-registry/examples/schema/execute_msg.json delete mode 100644 contracts/dao/subdao-registry/examples/schema/instantiate_msg.json delete mode 100644 contracts/dao/subdao-registry/examples/schema/query_msg.json delete mode 100644 contracts/dao/subdao-registry/schema/execute_msg.json delete mode 100644 contracts/dao/subdao-registry/schema/instantiate_msg.json delete mode 100644 contracts/dao/subdao-registry/schema/query_msg.json delete mode 100644 contracts/dao/subdao-registry/schema/schema/execute_msg.json delete mode 100644 contracts/dao/subdao-registry/schema/schema/instantiate_msg.json delete mode 100644 contracts/dao/subdao-registry/schema/schema/query_msg.json delete mode 100644 contracts/dao/subdao-registry/src/contract.rs delete mode 100644 contracts/dao/subdao-registry/src/lib.rs delete mode 100644 contracts/dao/subdao-registry/src/msg.rs delete mode 100644 contracts/dao/subdao-registry/src/schema/execute_msg.json delete mode 100644 contracts/dao/subdao-registry/src/schema/instantiate_msg.json delete mode 100644 contracts/dao/subdao-registry/src/schema/query_msg.json delete mode 100644 contracts/dao/subdao-registry/src/state.rs delete mode 100644 contracts/dao/subdao-registry/src/testing/mock_querier.rs delete mode 100644 contracts/dao/subdao-registry/src/testing/mod.rs delete mode 100644 contracts/dao/subdao-registry/src/testing/tests.rs diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 9e7f4d9a..db81b99a 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -11,6 +11,10 @@ use serde::{Deserialize, Serialize}; use error::PreProposeOverruleError; use crate::error; +use crate::msg::{ + ExecuteMsg, InstantiateMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, + TimelockExecuteMsg, +}; use cwd_pre_propose_base::{ error::PreProposeError, msg::{ExecuteMsg as ExecuteBase, InstantiateMsg as InstantiateBase, QueryMsg as QueryBase}, @@ -20,42 +24,6 @@ use cwd_pre_propose_base::{ pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); -#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum ProposeMessage { - ProposeOverrule { - timelock_contract: String, - proposal_id: u64, - }, -} - -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum TimelockExecuteMsg { - OverruleProposal { proposal_id: u64 }, -} - -pub type ExecuteMsg = ExecuteBase; -pub type QueryMsg = QueryBase; - -#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub struct InstantiateMsg {} - -/// Internal version of the propose message that includes the -/// `proposer` field. The module will fill this in based on the sender -/// of the external message. -#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum ProposeMessageInternal { - Propose { - title: String, - description: String, - msgs: Vec>, - proposer: Option, - }, -} - type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs new file mode 100644 index 00000000..f787c5b3 --- /dev/null +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs @@ -0,0 +1,38 @@ +use cosmwasm_std::CosmosMsg; +use neutron_bindings::bindings::msg::NeutronMsg; + +#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum ProposeMessage { + ProposeOverrule { + timelock_contract: String, + proposal_id: u64, + }, +} + +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum TimelockExecuteMsg { + OverruleProposal { proposal_id: u64 }, +} + +pub type ExecuteMsg = ExecuteBase; +pub type QueryMsg = QueryBase; + +#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct InstantiateMsg {} + +/// Internal version of the propose message that includes the +/// `proposer` field. The module will fill this in based on the sender +/// of the external message. +#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum ProposeMessageInternal { + Propose { + title: String, + description: String, + msgs: Vec>, + proposer: Option, + }, +} diff --git a/contracts/dao/subdao-registry/.cargo/config b/contracts/dao/subdao-registry/.cargo/config deleted file mode 100644 index 7c115322..00000000 --- a/contracts/dao/subdao-registry/.cargo/config +++ /dev/null @@ -1,6 +0,0 @@ -[alias] -wasm = "build --release --target wasm32-unknown-unknown" -wasm-debug = "build --target wasm32-unknown-unknown" -unit-test = "test --lib --features backtraces" -integration-test = "test --test integration" -schema = "run --example schema" diff --git a/contracts/dao/subdao-registry/.cargo/schema/execute_msg.json b/contracts/dao/subdao-registry/.cargo/schema/execute_msg.json deleted file mode 100644 index 991dcceb..00000000 --- a/contracts/dao/subdao-registry/.cargo/schema/execute_msg.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Transfer the contract's ownership to another account", - "type": "object", - "required": [ - "transfer_ownership" - ], - "properties": { - "transfer_ownership": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Distribute pending funds between Bank and Distribution accounts", - "type": "object", - "required": [ - "distribute" - ], - "properties": { - "distribute": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_config" - ], - "properties": { - "update_config": { - "type": "object", - "properties": { - "distribution_contract": { - "type": [ - "string", - "null" - ] - }, - "distribution_rate": { - "anyOf": [ - { - "$ref": "#/definitions/Decimal" - }, - { - "type": "null" - } - ] - }, - "min_period": { - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "reserve_contract": { - "type": [ - "string", - "null" - ] - } - } - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json b/contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json deleted file mode 100644 index cdd51d4c..00000000 --- a/contracts/dao/subdao-registry/.cargo/schema/instantiate_msg.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "denom", - "distribution_contract", - "distribution_rate", - "min_period", - "owner", - "reserve_contract" - ], - "properties": { - "denom": { - "type": "string" - }, - "distribution_contract": { - "description": "Address of distribution contract", - "type": "string" - }, - "distribution_rate": { - "description": "Distribution rate (0-1) which goes to distribution contract", - "allOf": [ - { - "$ref": "#/definitions/Decimal" - } - ] - }, - "min_period": { - "description": "Minimum period between distribution calls", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "reserve_contract": { - "description": "Address of reserve contract", - "type": "string" - } - }, - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/.cargo/schema/query_msg.json b/contracts/dao/subdao-registry/.cargo/schema/query_msg.json deleted file mode 100644 index 967b89ed..00000000 --- a/contracts/dao/subdao-registry/.cargo/schema/query_msg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "The contract's configurations; returns [`ConfigResponse`]", - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "stats" - ], - "properties": { - "stats": { - "type": "object" - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/dao/subdao-registry/Cargo.toml b/contracts/dao/subdao-registry/Cargo.toml deleted file mode 100644 index 15c45822..00000000 --- a/contracts/dao/subdao-registry/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "neutron-subdao-registry" -version = "0.1.0" -authors = ["oldremez"] -edition = "2021" -license = "Apache-2.0" -repository = "https://github.com/neutron/neutron-dao" - -[lib] -crate-type = ["cdylib", "rlib"] - -[features] -backtraces = ["cosmwasm-std/backtraces"] - -[dependencies] -cosmwasm-std = { version = "1.0" } -cw-storage-plus = "1.0.1" -schemars = "0.8.1" -serde = { version = "1.0.103", default-features = false, features = ["derive"] } - -[dev-dependencies] -cosmwasm-schema = { version = "1.0.0", default-features = false } diff --git a/contracts/dao/subdao-registry/README.md b/contracts/dao/subdao-registry/README.md deleted file mode 100644 index 7ea2d5e1..00000000 --- a/contracts/dao/subdao-registry/README.md +++ /dev/null @@ -1 +0,0 @@ -# Neutron subdao registry diff --git a/contracts/dao/subdao-registry/examples/schema.rs b/contracts/dao/subdao-registry/examples/schema.rs deleted file mode 100644 index 7fa49979..00000000 --- a/contracts/dao/subdao-registry/examples/schema.rs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2022 Neutron -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use std::env::current_dir; -use std::fs::create_dir_all; - -use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; - -use neutron_treasury::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; - -fn main() { - let mut out_dir = current_dir().unwrap(); - out_dir.push("schema"); - create_dir_all(&out_dir).unwrap(); - remove_schemas(&out_dir).unwrap(); - - export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); -} diff --git a/contracts/dao/subdao-registry/examples/schema/execute_msg.json b/contracts/dao/subdao-registry/examples/schema/execute_msg.json deleted file mode 100644 index 991dcceb..00000000 --- a/contracts/dao/subdao-registry/examples/schema/execute_msg.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Transfer the contract's ownership to another account", - "type": "object", - "required": [ - "transfer_ownership" - ], - "properties": { - "transfer_ownership": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Distribute pending funds between Bank and Distribution accounts", - "type": "object", - "required": [ - "distribute" - ], - "properties": { - "distribute": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_config" - ], - "properties": { - "update_config": { - "type": "object", - "properties": { - "distribution_contract": { - "type": [ - "string", - "null" - ] - }, - "distribution_rate": { - "anyOf": [ - { - "$ref": "#/definitions/Decimal" - }, - { - "type": "null" - } - ] - }, - "min_period": { - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "reserve_contract": { - "type": [ - "string", - "null" - ] - } - } - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/examples/schema/instantiate_msg.json b/contracts/dao/subdao-registry/examples/schema/instantiate_msg.json deleted file mode 100644 index cdd51d4c..00000000 --- a/contracts/dao/subdao-registry/examples/schema/instantiate_msg.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "denom", - "distribution_contract", - "distribution_rate", - "min_period", - "owner", - "reserve_contract" - ], - "properties": { - "denom": { - "type": "string" - }, - "distribution_contract": { - "description": "Address of distribution contract", - "type": "string" - }, - "distribution_rate": { - "description": "Distribution rate (0-1) which goes to distribution contract", - "allOf": [ - { - "$ref": "#/definitions/Decimal" - } - ] - }, - "min_period": { - "description": "Minimum period between distribution calls", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "reserve_contract": { - "description": "Address of reserve contract", - "type": "string" - } - }, - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/examples/schema/query_msg.json b/contracts/dao/subdao-registry/examples/schema/query_msg.json deleted file mode 100644 index 967b89ed..00000000 --- a/contracts/dao/subdao-registry/examples/schema/query_msg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "The contract's configurations; returns [`ConfigResponse`]", - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "stats" - ], - "properties": { - "stats": { - "type": "object" - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/dao/subdao-registry/schema/execute_msg.json b/contracts/dao/subdao-registry/schema/execute_msg.json deleted file mode 100644 index 991dcceb..00000000 --- a/contracts/dao/subdao-registry/schema/execute_msg.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Transfer the contract's ownership to another account", - "type": "object", - "required": [ - "transfer_ownership" - ], - "properties": { - "transfer_ownership": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Distribute pending funds between Bank and Distribution accounts", - "type": "object", - "required": [ - "distribute" - ], - "properties": { - "distribute": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_config" - ], - "properties": { - "update_config": { - "type": "object", - "properties": { - "distribution_contract": { - "type": [ - "string", - "null" - ] - }, - "distribution_rate": { - "anyOf": [ - { - "$ref": "#/definitions/Decimal" - }, - { - "type": "null" - } - ] - }, - "min_period": { - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "reserve_contract": { - "type": [ - "string", - "null" - ] - } - } - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/schema/instantiate_msg.json b/contracts/dao/subdao-registry/schema/instantiate_msg.json deleted file mode 100644 index cdd51d4c..00000000 --- a/contracts/dao/subdao-registry/schema/instantiate_msg.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "denom", - "distribution_contract", - "distribution_rate", - "min_period", - "owner", - "reserve_contract" - ], - "properties": { - "denom": { - "type": "string" - }, - "distribution_contract": { - "description": "Address of distribution contract", - "type": "string" - }, - "distribution_rate": { - "description": "Distribution rate (0-1) which goes to distribution contract", - "allOf": [ - { - "$ref": "#/definitions/Decimal" - } - ] - }, - "min_period": { - "description": "Minimum period between distribution calls", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "reserve_contract": { - "description": "Address of reserve contract", - "type": "string" - } - }, - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/schema/query_msg.json b/contracts/dao/subdao-registry/schema/query_msg.json deleted file mode 100644 index 967b89ed..00000000 --- a/contracts/dao/subdao-registry/schema/query_msg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "The contract's configurations; returns [`ConfigResponse`]", - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "stats" - ], - "properties": { - "stats": { - "type": "object" - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/dao/subdao-registry/schema/schema/execute_msg.json b/contracts/dao/subdao-registry/schema/schema/execute_msg.json deleted file mode 100644 index 991dcceb..00000000 --- a/contracts/dao/subdao-registry/schema/schema/execute_msg.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Transfer the contract's ownership to another account", - "type": "object", - "required": [ - "transfer_ownership" - ], - "properties": { - "transfer_ownership": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Distribute pending funds between Bank and Distribution accounts", - "type": "object", - "required": [ - "distribute" - ], - "properties": { - "distribute": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_config" - ], - "properties": { - "update_config": { - "type": "object", - "properties": { - "distribution_contract": { - "type": [ - "string", - "null" - ] - }, - "distribution_rate": { - "anyOf": [ - { - "$ref": "#/definitions/Decimal" - }, - { - "type": "null" - } - ] - }, - "min_period": { - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "reserve_contract": { - "type": [ - "string", - "null" - ] - } - } - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/schema/schema/instantiate_msg.json b/contracts/dao/subdao-registry/schema/schema/instantiate_msg.json deleted file mode 100644 index cdd51d4c..00000000 --- a/contracts/dao/subdao-registry/schema/schema/instantiate_msg.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "denom", - "distribution_contract", - "distribution_rate", - "min_period", - "owner", - "reserve_contract" - ], - "properties": { - "denom": { - "type": "string" - }, - "distribution_contract": { - "description": "Address of distribution contract", - "type": "string" - }, - "distribution_rate": { - "description": "Distribution rate (0-1) which goes to distribution contract", - "allOf": [ - { - "$ref": "#/definitions/Decimal" - } - ] - }, - "min_period": { - "description": "Minimum period between distribution calls", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "reserve_contract": { - "description": "Address of reserve contract", - "type": "string" - } - }, - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/schema/schema/query_msg.json b/contracts/dao/subdao-registry/schema/schema/query_msg.json deleted file mode 100644 index 967b89ed..00000000 --- a/contracts/dao/subdao-registry/schema/schema/query_msg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "The contract's configurations; returns [`ConfigResponse`]", - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "stats" - ], - "properties": { - "stats": { - "type": "object" - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/dao/subdao-registry/src/contract.rs b/contracts/dao/subdao-registry/src/contract.rs deleted file mode 100644 index cc98b7fb..00000000 --- a/contracts/dao/subdao-registry/src/contract.rs +++ /dev/null @@ -1,216 +0,0 @@ -#[cfg(not(feature = "library"))] -use cosmwasm_std::entry_point; -use cosmwasm_std::{ - coins, to_binary, Addr, BankMsg, Binary, CosmosMsg, Decimal, Deps, DepsMut, Env, MessageInfo, - Response, StdError, StdResult, Uint128, WasmMsg, -}; - -use crate::msg::{DistributeMsg, ExecuteMsg, InstantiateMsg, QueryMsg, StatsResponse}; -use crate::state::{ - Config, CONFIG, LAST_DISTRIBUTION_TIME, TOTAL_DISTRIBUTED, TOTAL_RECEIVED, TOTAL_RESERVED, -}; - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn instantiate( - deps: DepsMut, - _env: Env, - _info: MessageInfo, - msg: InstantiateMsg, -) -> StdResult { - let config = Config { - denom: msg.denom, - min_period: msg.min_period, - distribution_contract: deps.api.addr_validate(msg.distribution_contract.as_str())?, - reserve_contract: deps.api.addr_validate(msg.reserve_contract.as_str())?, - distribution_rate: msg.distribution_rate, - owner: deps.api.addr_validate(&msg.owner)?, - }; - CONFIG.save(deps.storage, &config)?; - TOTAL_RECEIVED.save(deps.storage, &Uint128::zero())?; - TOTAL_DISTRIBUTED.save(deps.storage, &Uint128::zero())?; - TOTAL_RESERVED.save(deps.storage, &Uint128::zero())?; - LAST_DISTRIBUTION_TIME.save(deps.storage, &0)?; - - Ok(Response::new()) -} - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> StdResult { - let api = deps.api; - match msg { - // permissioned - owner - ExecuteMsg::TransferOwnership(new_owner) => { - execute_transfer_ownership(deps, info, api.addr_validate(&new_owner)?) - } - // permissionless - ExecuteMsg::Distribute {} => execute_distribute(deps, env), - - // permissioned - owner - ExecuteMsg::UpdateConfig { - distribution_rate, - min_period, - distribution_contract, - reserve_contract, - } => execute_update_config( - deps, - info, - distribution_rate, - min_period, - distribution_contract, - reserve_contract, - ), - } -} - -pub fn execute_add_subdao( - deps: DepsMut, - info: MessageInfo, - new_owner_addr: Addr, -) -> StdResult { - let config = CONFIG.load(deps.storage)?; - let sender_addr = info.sender; - let old_owner = config.owner; - if sender_addr != old_owner { - return Err(StdError::generic_err("unauthorized")); - } - - CONFIG.update(deps.storage, |mut config| -> StdResult<_> { - config.owner = new_owner_addr.clone(); - Ok(config) - })?; - - Ok(Response::new() - .add_attribute("action", "neutron/treasury/transfer_ownership") - .add_attribute("previous_owner", old_owner) - .add_attribute("new_owner", new_owner_addr)) -} - -pub fn execute_update_config( - deps: DepsMut, - info: MessageInfo, - distribution_rate: Option, - min_period: Option, - distribution_contract: Option, - reserve_contract: Option, -) -> StdResult { - let mut config: Config = CONFIG.load(deps.storage)?; - if info.sender != config.owner { - return Err(StdError::generic_err("unauthorized")); - } - - if let Some(min_period) = min_period { - config.min_period = min_period; - } - if let Some(distribution_contract) = distribution_contract { - config.distribution_contract = deps.api.addr_validate(distribution_contract.as_str())?; - } - if let Some(reserve_contract) = reserve_contract { - config.reserve_contract = deps.api.addr_validate(reserve_contract.as_str())?; - } - if let Some(distribution_rate) = distribution_rate { - if (distribution_rate > Decimal::one()) || (distribution_rate < Decimal::zero()) { - return Err(StdError::generic_err( - "distribution_rate must be between 0 and 1", - )); - } - config.distribution_rate = distribution_rate; - } - - CONFIG.save(deps.storage, &config)?; - - Ok(Response::new() - .add_attribute("action", "neutron/treasury/update_config") - .add_attribute("denom", config.denom) - .add_attribute("min_period", config.min_period.to_string()) - .add_attribute("distribution_contract", config.distribution_contract) - .add_attribute("distribution_rate", config.distribution_rate.to_string()) - .add_attribute("owner", config.owner)) -} - -pub fn execute_distribute(deps: DepsMut, env: Env) -> StdResult { - let config: Config = CONFIG.load(deps.storage)?; - let denom = config.denom; - let current_time = env.block.time.seconds(); - if current_time - LAST_DISTRIBUTION_TIME.load(deps.storage)? < config.min_period { - return Err(StdError::generic_err("too soon to distribute")); - } - LAST_DISTRIBUTION_TIME.save(deps.storage, ¤t_time)?; - let current_balance = deps - .querier - .query_balance(env.contract.address, &denom)? - .amount; - - if current_balance.is_zero() { - return Err(StdError::GenericErr { - msg: "no new funds to distribute".to_string(), - }); - } - - let to_distribute = current_balance * config.distribution_rate; - let to_reserve = current_balance.checked_sub(to_distribute)?; - // update stats - let total_received = TOTAL_RECEIVED.load(deps.storage)?; - TOTAL_RECEIVED.save( - deps.storage, - &(total_received.checked_add(current_balance)?), - )?; - let total_distributed = TOTAL_DISTRIBUTED.load(deps.storage)?; - TOTAL_DISTRIBUTED.save( - deps.storage, - &(total_distributed.checked_add(to_distribute)?), - )?; - let total_reserved = TOTAL_RESERVED.load(deps.storage)?; - TOTAL_RESERVED.save(deps.storage, &(total_reserved.checked_add(to_reserve)?))?; - - let mut resp = Response::default(); - if !to_distribute.is_zero() { - let msg = CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: config.distribution_contract.to_string(), - funds: coins(to_distribute.u128(), denom.clone()), - msg: to_binary(&DistributeMsg::Fund {})?, - }); - resp = resp.add_message(msg) - } - - if !to_reserve.is_zero() { - let msg = CosmosMsg::Bank(BankMsg::Send { - to_address: config.reserve_contract.to_string(), - amount: coins(to_reserve.u128(), denom), - }); - resp = resp.add_message(msg); - } - - Ok(resp - .add_attribute("action", "neutron/treasury/distribute") - .add_attribute("reserved", to_reserve) - .add_attribute("distributed", to_distribute)) -} - -//-------------------------------------------------------------------------------------------------- -// Queries -//-------------------------------------------------------------------------------------------------- - -#[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { - match msg { - QueryMsg::Config {} => to_binary(&query_config(deps)?), - QueryMsg::Stats {} => to_binary(&query_stats(deps)?), - } -} - -pub fn query_config(deps: Deps) -> StdResult { - let config = CONFIG.load(deps.storage)?; - Ok(config) -} - -pub fn query_stats(deps: Deps) -> StdResult { - let total_received = TOTAL_RECEIVED.load(deps.storage)?; - let total_distributed = TOTAL_DISTRIBUTED.load(deps.storage)?; - let total_reserved = TOTAL_RESERVED.load(deps.storage)?; - - Ok(StatsResponse { - total_received, - total_distributed, - total_reserved, - }) -} diff --git a/contracts/dao/subdao-registry/src/lib.rs b/contracts/dao/subdao-registry/src/lib.rs deleted file mode 100644 index 2a287a05..00000000 --- a/contracts/dao/subdao-registry/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod contract; -pub mod msg; -pub mod state; -#[cfg(test)] -mod testing; diff --git a/contracts/dao/subdao-registry/src/msg.rs b/contracts/dao/subdao-registry/src/msg.rs deleted file mode 100644 index 58db1887..00000000 --- a/contracts/dao/subdao-registry/src/msg.rs +++ /dev/null @@ -1,57 +0,0 @@ -use cosmwasm_std::{Decimal, Uint128}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -pub struct InstantiateMsg { - pub owner: String, - pub denom: String, - /// Distribution rate (0-1) which goes to distribution contract - pub distribution_rate: Decimal, - /// Minimum period between distribution calls - pub min_period: u64, - /// Address of distribution contract - pub distribution_contract: String, - /// Address of reserve contract - pub reserve_contract: String, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum ExecuteMsg { - /// Transfer the contract's ownership to another account - TransferOwnership(String), - - /// Distribute pending funds between Bank and Distribution accounts - Distribute {}, - - // //Update config - UpdateConfig { - distribution_rate: Option, - min_period: Option, - distribution_contract: Option, - reserve_contract: Option, - }, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum QueryMsg { - /// The contract's configurations; returns [`ConfigResponse`] - Config {}, - Stats {}, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub struct StatsResponse { - pub total_received: Uint128, - pub total_distributed: Uint128, - pub total_reserved: Uint128, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum DistributeMsg { - Fund {}, -} diff --git a/contracts/dao/subdao-registry/src/schema/execute_msg.json b/contracts/dao/subdao-registry/src/schema/execute_msg.json deleted file mode 100644 index 991dcceb..00000000 --- a/contracts/dao/subdao-registry/src/schema/execute_msg.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ExecuteMsg", - "oneOf": [ - { - "description": "Transfer the contract's ownership to another account", - "type": "object", - "required": [ - "transfer_ownership" - ], - "properties": { - "transfer_ownership": { - "type": "string" - } - }, - "additionalProperties": false - }, - { - "description": "Distribute pending funds between Bank and Distribution accounts", - "type": "object", - "required": [ - "distribute" - ], - "properties": { - "distribute": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "update_config" - ], - "properties": { - "update_config": { - "type": "object", - "properties": { - "distribution_contract": { - "type": [ - "string", - "null" - ] - }, - "distribution_rate": { - "anyOf": [ - { - "$ref": "#/definitions/Decimal" - }, - { - "type": "null" - } - ] - }, - "min_period": { - "type": [ - "integer", - "null" - ], - "format": "uint64", - "minimum": 0.0 - }, - "reserve_contract": { - "type": [ - "string", - "null" - ] - } - } - } - }, - "additionalProperties": false - } - ], - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/src/schema/instantiate_msg.json b/contracts/dao/subdao-registry/src/schema/instantiate_msg.json deleted file mode 100644 index cdd51d4c..00000000 --- a/contracts/dao/subdao-registry/src/schema/instantiate_msg.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "InstantiateMsg", - "type": "object", - "required": [ - "denom", - "distribution_contract", - "distribution_rate", - "min_period", - "owner", - "reserve_contract" - ], - "properties": { - "denom": { - "type": "string" - }, - "distribution_contract": { - "description": "Address of distribution contract", - "type": "string" - }, - "distribution_rate": { - "description": "Distribution rate (0-1) which goes to distribution contract", - "allOf": [ - { - "$ref": "#/definitions/Decimal" - } - ] - }, - "min_period": { - "description": "Minimum period between distribution calls", - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "owner": { - "type": "string" - }, - "reserve_contract": { - "description": "Address of reserve contract", - "type": "string" - } - }, - "definitions": { - "Decimal": { - "description": "A fixed-point decimal value with 18 fractional digits, i.e. Decimal(1_000_000_000_000_000_000) == 1.0\n\nThe greatest possible value that can be represented is 340282366920938463463.374607431768211455 (which is (2^128 - 1) / 10^18)", - "type": "string" - } - } -} diff --git a/contracts/dao/subdao-registry/src/schema/query_msg.json b/contracts/dao/subdao-registry/src/schema/query_msg.json deleted file mode 100644 index 967b89ed..00000000 --- a/contracts/dao/subdao-registry/src/schema/query_msg.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", - "oneOf": [ - { - "description": "The contract's configurations; returns [`ConfigResponse`]", - "type": "object", - "required": [ - "config" - ], - "properties": { - "config": { - "type": "object" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "stats" - ], - "properties": { - "stats": { - "type": "object" - } - }, - "additionalProperties": false - } - ] -} diff --git a/contracts/dao/subdao-registry/src/state.rs b/contracts/dao/subdao-registry/src/state.rs deleted file mode 100644 index 9c18d4bd..00000000 --- a/contracts/dao/subdao-registry/src/state.rs +++ /dev/null @@ -1,26 +0,0 @@ -use cosmwasm_std::{Addr, Decimal, Uint128}; -use cw_storage_plus::Item; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -pub struct Config { - /// Distribution rate (0-1) which goes to distribution contract - pub distribution_rate: Decimal, - /// Address of distribution contract, which will receive funds defined but distribution_rate % - pub distribution_contract: Addr, - /// Address of reserve contract, which will receive funds defined by 100-distribution_rate % - pub reserve_contract: Addr, - /// Minimum period between distribution calls - pub min_period: u64, - pub denom: String, - pub owner: Addr, -} - -pub const TOTAL_RECEIVED: Item = Item::new("total_received"); -pub const TOTAL_DISTRIBUTED: Item = Item::new("total_distributed"); -pub const TOTAL_RESERVED: Item = Item::new("total_reserved"); - -pub const LAST_DISTRIBUTION_TIME: Item = Item::new("last_grab_time"); - -pub const CONFIG: Item = Item::new("config"); diff --git a/contracts/dao/subdao-registry/src/testing/mock_querier.rs b/contracts/dao/subdao-registry/src/testing/mock_querier.rs deleted file mode 100644 index df2eaa1f..00000000 --- a/contracts/dao/subdao-registry/src/testing/mock_querier.rs +++ /dev/null @@ -1,22 +0,0 @@ -use std::marker::PhantomData; - -use cosmwasm_std::{ - testing::{MockApi, MockQuerier, MockStorage}, - Coin, OwnedDeps, -}; - -const MOCK_CONTRACT_ADDR: &str = "cosmos2contract"; - -pub fn mock_dependencies( - contract_balance: &[Coin], -) -> OwnedDeps { - let contract_addr = MOCK_CONTRACT_ADDR; - let custom_querier = MockQuerier::new(&[(contract_addr, contract_balance)]); - - OwnedDeps { - storage: MockStorage::default(), - api: MockApi::default(), - querier: custom_querier, - custom_query_type: PhantomData, - } -} diff --git a/contracts/dao/subdao-registry/src/testing/mod.rs b/contracts/dao/subdao-registry/src/testing/mod.rs deleted file mode 100644 index a1e507b6..00000000 --- a/contracts/dao/subdao-registry/src/testing/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod mock_querier; -mod tests; diff --git a/contracts/dao/subdao-registry/src/testing/tests.rs b/contracts/dao/subdao-registry/src/testing/tests.rs deleted file mode 100644 index 22b7e6c0..00000000 --- a/contracts/dao/subdao-registry/src/testing/tests.rs +++ /dev/null @@ -1,195 +0,0 @@ -use std::str::FromStr; - -use cosmwasm_std::{ - coin, coins, - testing::{mock_env, mock_info}, - to_binary, BankMsg, Coin, CosmosMsg, Decimal, DepsMut, Empty, Uint128, WasmMsg, -}; - -use crate::{ - contract::{execute, instantiate}, - msg::{DistributeMsg, ExecuteMsg, InstantiateMsg}, - state::{CONFIG, TOTAL_DISTRIBUTED, TOTAL_RECEIVED, TOTAL_RESERVED}, - testing::mock_querier::mock_dependencies, -}; - -const DENOM: &str = "denom"; - -pub fn init_base_contract(deps: DepsMut, distribution_rate: &str) { - let msg = InstantiateMsg { - denom: DENOM.to_string(), - min_period: 1000, - distribution_contract: "distribution_contract".to_string(), - reserve_contract: "reserve_contract".to_string(), - distribution_rate: Decimal::from_str(distribution_rate).unwrap(), - owner: "owner".to_string(), - }; - let info = mock_info("creator", &coins(2, DENOM)); - instantiate(deps, mock_env(), info, msg).unwrap(); -} - -#[test] -fn test_transfer_ownership() { - let mut deps = mock_dependencies(&[]); - init_base_contract(deps.as_mut(), "0.23"); - let msg = ExecuteMsg::TransferOwnership("new_owner".to_string()); - let res = execute(deps.as_mut(), mock_env(), mock_info("owner", &[]), msg); - assert!(res.is_ok()); - let config = CONFIG.load(deps.as_ref().storage).unwrap(); - assert_eq!(config.owner.to_string(), "new_owner".to_string()); -} - -#[test] -fn test_collect_with_no_money() { - let mut deps = mock_dependencies(&[]); - init_base_contract(deps.as_mut(), "1"); - let msg = ExecuteMsg::Distribute {}; - let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); - assert!(res.is_err()); - assert_eq!( - res.unwrap_err().to_string(), - "Generic error: no new funds to distribute" - ); -} - -#[test] -fn test_distribute_success() { - let mut deps = mock_dependencies(&[coin(1000000, DENOM)]); - init_base_contract(deps.as_mut(), "0.23"); - let msg = ExecuteMsg::Distribute {}; - let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); - assert!(res.is_ok()); - let messages = res.unwrap().messages; - assert_eq!(messages.len(), 2); - assert_eq!( - messages[0].msg, - CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: "distribution_contract".to_string(), - funds: vec![Coin { - denom: DENOM.to_string(), - amount: Uint128::from(230000u128) - }], - msg: to_binary(&DistributeMsg::Fund {}).unwrap(), - }) - ); - assert_eq!( - messages[1].msg, - CosmosMsg::Bank(BankMsg::Send { - to_address: "reserve_contract".to_string(), - amount: vec![Coin { - denom: DENOM.to_string(), - amount: Uint128::from(770000u128) - }] - }) - ); - let total_received = TOTAL_RECEIVED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_received, Uint128::from(1000000u128)); - let total_reserved = TOTAL_RESERVED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_reserved, Uint128::from(770000u128)); - let total_distributed = TOTAL_DISTRIBUTED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_distributed, Uint128::from(230000u128)); -} - -#[test] -fn test_distribute_zero_to_reserve() { - let mut deps = mock_dependencies(&[coin(1000000, DENOM)]); - init_base_contract(deps.as_mut(), "1"); - let msg = ExecuteMsg::Distribute {}; - let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); - assert!(res.is_ok()); - let messages = res.unwrap().messages; - assert_eq!(messages.len(), 1); - assert_eq!( - messages[0].msg, - CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: "distribution_contract".to_string(), - funds: vec![Coin { - denom: DENOM.to_string(), - amount: Uint128::from(1000000u128) - }], - msg: to_binary(&DistributeMsg::Fund {}).unwrap(), - }) - ); - - let total_received = TOTAL_RECEIVED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_received, Uint128::from(1000000u128)); - let total_reserved = TOTAL_RESERVED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_reserved, Uint128::from(0u128)); - let total_distributed = TOTAL_DISTRIBUTED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_distributed, Uint128::from(1000000u128)); -} - -#[test] -fn test_distribute_zero_to_distribution_contract() { - let mut deps = mock_dependencies(&[coin(1000000, DENOM)]); - init_base_contract(deps.as_mut(), "0"); - let msg = ExecuteMsg::Distribute {}; - let res = execute(deps.as_mut(), mock_env(), mock_info("anyone", &[]), msg); - assert!(res.is_ok()); - let messages = res.unwrap().messages; - assert_eq!(messages.len(), 1); - assert_eq!( - messages[0].msg, - CosmosMsg::Bank(BankMsg::Send { - to_address: "reserve_contract".to_string(), - amount: vec![Coin { - denom: DENOM.to_string(), - amount: Uint128::from(1000000u128) - }] - }) - ); - let total_received = TOTAL_RECEIVED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_received, Uint128::from(1000000u128)); - let total_reserved = TOTAL_RESERVED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_reserved, Uint128::from(1000000u128)); - let total_distributed = TOTAL_DISTRIBUTED.load(deps.as_ref().storage).unwrap(); - assert_eq!(total_distributed, Uint128::from(0u128)); -} - -#[test] -fn test_update_config_unauthorized() { - let mut deps = mock_dependencies(&[]); - init_base_contract(deps.as_mut(), "1"); - let msg = ExecuteMsg::UpdateConfig { - distribution_contract: None, - reserve_contract: None, - distribution_rate: None, - min_period: None, - }; - let res = execute(deps.as_mut(), mock_env(), mock_info("not_owner", &[]), msg); - assert!(res.is_err()); - assert_eq!(res.unwrap_err().to_string(), "Generic error: unauthorized"); -} - -#[test] -fn test_update_config_success() { - let mut deps = mock_dependencies(&[]); - init_base_contract(deps.as_mut(), "1"); - let msg = ExecuteMsg::UpdateConfig { - distribution_contract: Some("new_contract".to_string()), - reserve_contract: Some("new_reserve_contract".to_string()), - distribution_rate: Some(Decimal::from_str("0.11").unwrap()), - min_period: Some(3000), - }; - let res = execute(deps.as_mut(), mock_env(), mock_info("owner", &[]), msg); - assert!(res.is_ok()); - let config = CONFIG.load(deps.as_ref().storage).unwrap(); - assert_eq!(config.distribution_contract, "new_contract"); - assert_eq!(config.reserve_contract, "new_reserve_contract"); - assert_eq!(config.distribution_rate, Decimal::from_str("0.11").unwrap()); - assert_eq!(config.min_period, 3000); -} - -#[test] -fn test_update_distribution_rate_below_the_limit() { - let mut deps = mock_dependencies(&[]); - init_base_contract(deps.as_mut(), "1"); - let msg = ExecuteMsg::UpdateConfig { - distribution_contract: None, - reserve_contract: None, - distribution_rate: Some(Decimal::from_str("2").unwrap()), - min_period: None, - }; - let res = execute(deps.as_mut(), mock_env(), mock_info("owner", &[]), msg); - assert!(res.is_err()); -} From 7d40f0c2dffd5003c15534a40f242c5ab5a892e0 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 12 Jan 2023 13:06:52 +0200 Subject: [PATCH 03/53] wip --- .../dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs index 26cc40dc..de8165d6 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs @@ -1,5 +1,6 @@ pub mod contract; pub mod error; +pub mod msg; #[cfg(test)] pub mod testing; From ee32d0ad1e08bb9240aa5449c18c8144901c9baf Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 12 Jan 2023 13:13:46 +0200 Subject: [PATCH 04/53] messages refactoring --- .../src/contract.rs | 14 ++++---------- .../cwd-pre-propose-single-overrule/src/msg.rs | 3 +++ .../src/testing/tests.rs | 7 ++++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index db81b99a..f4da5d00 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -4,9 +4,6 @@ use cosmwasm_std::{ to_binary, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Response, StdResult, WasmMsg, }; use cw2::set_contract_version; -use neutron_bindings::bindings::msg::NeutronMsg; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; use error::PreProposeOverruleError; @@ -17,7 +14,7 @@ use crate::msg::{ }; use cwd_pre_propose_base::{ error::PreProposeError, - msg::{ExecuteMsg as ExecuteBase, InstantiateMsg as InstantiateBase, QueryMsg as QueryBase}, + msg::{ExecuteMsg as ExecuteBase, InstantiateMsg as InstantiateBase}, state::PreProposeContract, }; @@ -87,12 +84,9 @@ pub fn execute( }, }; - let result = PrePropose::default().execute(deps, env, info, internal_msg); - - match result { - Ok(response) => Ok(response), - Err(error) => Err(PreProposeOverruleError::PreProposeBase(error)), - } + PrePropose::default() + .execute(deps, env, info, internal_msg) + .map_err(|e| PreProposeOverruleError::PreProposeBase(e)) } _ => Err(PreProposeOverruleError::MessageUnsupported {}), } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs index f787c5b3..3ecd6c9e 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs @@ -1,5 +1,8 @@ use cosmwasm_std::CosmosMsg; +use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; use neutron_bindings::bindings::msg::NeutronMsg; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; #[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] #[serde(rename_all = "snake_case")] diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 619466a0..986f6efb 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -5,9 +5,10 @@ use cosmwasm_std::{ }; use crate::{ - contract::{ - execute, instantiate, query, ExecuteMsg, InstantiateMsg, ProposeMessage, - ProposeMessageInternal, QueryMsg, TimelockExecuteMsg, + contract::{execute, instantiate, query}, + msg::{ + ExecuteMsg, InstantiateMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, + TimelockExecuteMsg, }, testing::mock_querier::{mock_dependencies, MOCK_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT}, }; From b73035f8c212718955af578fb91fce9af3ded6a6 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Fri, 13 Jan 2023 12:33:49 +0200 Subject: [PATCH 05/53] temp commit --- artifacts/checksums.txt | 16 +-- artifacts/checksums_intermediate.txt | 16 +-- artifacts/cwd_core.wasm | Bin 388265 -> 388265 bytes artifacts/cwd_pre_propose_overrule.wasm | Bin 257902 -> 259060 bytes artifacts/cwd_pre_propose_single.wasm | Bin 336360 -> 336360 bytes artifacts/cwd_proposal_single.wasm | Bin 479517 -> 479517 bytes artifacts/cwd_subdao_core.wasm | Bin 388355 -> 388355 bytes artifacts/cwd_subdao_pre_propose_single.wasm | Bin 361254 -> 361254 bytes artifacts/cwd_subdao_proposal_single.wasm | Bin 479661 -> 479661 bytes artifacts/cwd_subdao_timelock_single.wasm | Bin 293959 -> 293959 bytes .../src/contract.rs | 126 +++++++++++++++++- .../src/lib.rs | 3 + .../src/msg.rs | 4 +- .../src/state.rs | 11 ++ .../src/testing/mock_querier.rs | 39 +++++- .../src/testing/tests.rs | 9 +- 16 files changed, 200 insertions(+), 24 deletions(-) create mode 100644 contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs diff --git a/artifacts/checksums.txt b/artifacts/checksums.txt index 0704b7af..6852e783 100644 --- a/artifacts/checksums.txt +++ b/artifacts/checksums.txt @@ -1,14 +1,14 @@ bf7f02637a176f6e0b363969312a2d25fc3c4104645c7533e3c207ede3fbf33b cw4_group.wasm 187c5a1e98b14384bf2e1bbbfddde4214f7e10e00dd5369c68f4dc3363a8a7bf cw4_voting.wasm -376d1b53afddeda6e57a0907dbd790e71822c7dfbecd185354652eddafa56896 cwd_core.wasm -206a97c9fef5eedf69a48bc1015a923f3745a2610a077798f5096d908f26b4e1 cwd_pre_propose_overrule.wasm -c33b583b61ec1890fcd00cc7b5ece08de2c30d93e39038680e480f4fa3de58ce cwd_pre_propose_single.wasm -01bf6a347ec95b6c501ade61d6128d0fbd0b2d34639ae97d893cefe1cec71f36 cwd_proposal_single.wasm -dc3dea39ec18ff703c3f7211da1c191816bb6c36395653418ae575c6c6f9e195 cwd_subdao_core.wasm +3b35b1b8c3ca55cf8a128dc55cc1c4a3a6a5102481c35c04f98a8621b2673683 cwd_core.wasm +a4656bcef49d4576e44825f2a2c7f27699809d2768a249df5003e9456da9765b cwd_pre_propose_overrule.wasm +017bf4dc71e5c9f8486ff96668221277cc168e857ea33c9464a2506128177ef0 cwd_pre_propose_single.wasm +a663a3df7864d49d03891b60d73cfda0de92bfd32d21cac224f929de0e6cf929 cwd_proposal_single.wasm +fbe8b3b9078888ee8d5552e3e2a48608c085b6bfcc2062dbc950ce92a0e42b37 cwd_subdao_core.wasm bdddd6ea8f7dc36e1b73d97c7caf20f59a3f2e3544a307098fbd02d838f260bd cwd_subdao_pre_propose_overrule.wasm -6e3ebc6a45823e7261b057e3df5bfc263285351254b4a58e8d67b241121593e9 cwd_subdao_pre_propose_single.wasm -3117255502cc3c1e523fafa89ce1b949b1d3a3e6b15ffb0f6b26a9225c0a867c cwd_subdao_proposal_single.wasm -341fce8e9437a4f3475d331e54acd12ef092450a39bff804543f9ee4c87e6556 cwd_subdao_timelock_single.wasm +c0da28280d38f031b242f8b211883f3f52a434f3695b76c609f90adb195355fc cwd_subdao_pre_propose_single.wasm +eb728794019bcebfa952b22854d518993d93a141613c85cff16173d82606f448 cwd_subdao_proposal_single.wasm +1b5719e0b0ae4920d652ffa1fec24c9c372a185da3f44b92afb2f4cfa95dc2f5 cwd_subdao_timelock_single.wasm 5f4303155a3c9e88b80f0e8805ffbd73fccd9afd82e5de442f33f8aa659bb3d3 neutron_distribution.wasm 0fb4675c3ef58d7745fbc05941c0aecc7f44aad1aa3f21edafa147cef917cc44 neutron_reserve.wasm 7bc1f2351e096157d89887c240f2bef5493ce1b208e23c9b31ce7848921acaf8 neutron_timelock_single.wasm diff --git a/artifacts/checksums_intermediate.txt b/artifacts/checksums_intermediate.txt index 886983a9..61bab04d 100644 --- a/artifacts/checksums_intermediate.txt +++ b/artifacts/checksums_intermediate.txt @@ -1,16 +1,16 @@ db51ae910c7c49d1db455e4ad31e9f1c7c6d53f31f9d1fe72a57e9bc73759bae target/wasm32-unknown-unknown/release/neutron_timelock_single.wasm d9cbab7b3d840171dec1c45cbc6a8ebbf55183759c6d0baba07d32a712680f6f target/wasm32-unknown-unknown/release/cw4_voting.wasm -d125e4bffb0973e8ea8ba4f0cd765aa77d190ddd08b8395d900c717462580c0d target/wasm32-unknown-unknown/release/cwd_core.wasm -2c9cafdd3fcb12b1cfaa2022437c99d64cd2a136d98905833d6c46bf7a3e343a target/wasm32-unknown-unknown/release/cwd_pre_propose_single.wasm -1b66ee6db36f84efebb6a93c384721d369da348ed485aee7bc486dface362280 target/wasm32-unknown-unknown/release/cwd_proposal_single.wasm -48d688a9cf6416802d21a2e34ef0a8dbd2200f86f173385dfac7b20b2298ef40 target/wasm32-unknown-unknown/release/cwd_subdao_core.wasm f4adb71665ef06ec933921ae7667fe73e11863956d4d6b9bb1ddd083c66c424a target/wasm32-unknown-unknown/release/cwd_subdao_pre_propose_overrule.wasm -e766ea0c069acc605b924d5e8ecbc0376026347c275501ad67c391d978ddeaef target/wasm32-unknown-unknown/release/cwd_subdao_pre_propose_single.wasm -05eef2951a1721533c1be74f4ec208885f0106b0d9513fc1aa85f51b7c1bfd7d target/wasm32-unknown-unknown/release/cwd_subdao_proposal_single.wasm -f9affa3dbdd7632bfd2c9b90de9e959cf441f94fdbb5b47068781de94fa4fcce target/wasm32-unknown-unknown/release/cwd_subdao_timelock_single.wasm 5fb0fe9031fb0da6adbe118679b113ccc53d030af9d3633ba5a3401f20744e2b target/wasm32-unknown-unknown/release/neutron_distribution.wasm e6d9cd6968b342f983397a7e4b5a0a8fa22889f0eba5ac846a93b23092eeb2a8 target/wasm32-unknown-unknown/release/neutron_reserve.wasm 3a6c80bbb6d664e2e804d362580d98ab148af288471c8ecdd4b06217a3fc2706 target/wasm32-unknown-unknown/release/neutron_treasury.wasm 73aaf0fa117ca17398d16ad525c3afc8528706a77b9a0993a8543024760cc2ba target/wasm32-unknown-unknown/release/neutron_vault.wasm ddd6b29b9c1cf9ae6c90ab731dd7b3ea4a2c360b656835e93cd0dd3c080e406a target/wasm32-unknown-unknown/release/neutron_voting_registry.wasm -6b9b64b073e1db50593505b910b7bf038a6e39fbef328128327797858a733d29 target/wasm32-unknown-unknown/release/cwd_pre_propose_overrule.wasm +7702a4c34490f8ea74368355f44323c673f4ea78bb6abf1e406bdf007fe4b25c target/wasm32-unknown-unknown/release/cwd_core.wasm +bbfa05dd8f74b163a6dba1df5bff96cb53efb5be866a3ffa6725fd424bdea8c4 target/wasm32-unknown-unknown/release/cwd_pre_propose_overrule.wasm +e0cdbea9ba83c143c06cd2a80d61526ba9a5402810520109fdf5da732ff7107a target/wasm32-unknown-unknown/release/cwd_pre_propose_single.wasm +7f00c5ba112762a1cf244637e50960bd728954e620d7a68eb4c2e23a24e20c67 target/wasm32-unknown-unknown/release/cwd_proposal_single.wasm +944835db515693cd857ccbddab798d3129ef5568f2a6f36c239fd4600a53eba6 target/wasm32-unknown-unknown/release/cwd_subdao_core.wasm +e7dc5bdc623e694b9307abc07b928b4b8b2eaa3b3a05b5d30477b8d3019f3409 target/wasm32-unknown-unknown/release/cwd_subdao_pre_propose_single.wasm +19f705d44f9ac1cc553662f50aafa8debdc8e965a9c46654bbb4226eb556fdf4 target/wasm32-unknown-unknown/release/cwd_subdao_proposal_single.wasm +e47a0c9e058572197e205ef2a6a7c55a2abf393b5f45f09275263b9226630a90 target/wasm32-unknown-unknown/release/cwd_subdao_timelock_single.wasm diff --git a/artifacts/cwd_core.wasm b/artifacts/cwd_core.wasm index 757b13748a251f7db60064fcc01a3db461aa12d6..61465350f12de9288103a1910c3bfe9196b74803 100644 GIT binary patch delta 5197 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 k9$ligdMs;6&sap>XGRG23Htlwg3PC delta 5295 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 P;_bc+;4S6yi4p$|;$?@w diff --git a/artifacts/cwd_pre_propose_overrule.wasm b/artifacts/cwd_pre_propose_overrule.wasm index 93bc68e699ce0af98099c1833beb1e84a2f3d0e1..b16bf0a095b95515f521fe451f42bc6dad7a9dad 100644 GIT binary patch delta 90446 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�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 Z;`ruT0($DElE6=VuH=dzZz|t<{s+9bKO+DD delta 7861 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 MoFd<~S(o+tAN+FXBLDyZ diff --git a/artifacts/cwd_subdao_core.wasm b/artifacts/cwd_subdao_core.wasm index 2861d9f55a48456dff3253c57bbda0b4808e48af..77b80935aded081a271d79be136ba900129d9a79 100644 GIT binary patch delta 8503 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 diff --git a/artifacts/cwd_subdao_pre_propose_single.wasm b/artifacts/cwd_subdao_pre_propose_single.wasm index a52bd165e981e0cc9d917921fdf1554189cb2958..86b9424b1a7861ea72ad4789b4c5e74f74ed9816 100644 GIT binary patch delta 5076 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 gulRpZ(qi;{Sc#-}~}B-0sfK&d$uv&dkm?8{bIW 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

3_Fke58* z=+&tZEeQS{6BQ}dQdyyVxFu|j4)&1i%Cc%v13pw=w>d4iz6ICYa_!GwYs68Vl*fyBXVo*GUqgNJzhEpc{C{D5*Yf|4 zp|DFkK|5qpF@GK`)Evws<>q2&%q@Q}=6$hsN+<4A&z0~SygV7$YbkYV2iH%I?ZS03 zaIg!nhUQ8aj*ok?M^~OA>vlCk=nsK2@#_9XhbYWI^oTvw?6JDLPq6BRgs zyLFs{3iT5kYKxR*gLx*(1^Wi`lycA?gZT@fJZ=cDstp&|nex!nd{7uF1R3ltYpTr? z)gqM2O1M+@8p;=;Ao1r=en?PXW6JFWb#5e23q_a~Q}}LHURq#gg4I|Zp2}^kav4F5 z*QqpB=M4W?OC4qMrkCk=HD%I4;|vuFm9PmZI4Yp+e`T(<_cab#lcq zvZcG*AM7GLpnAQ+SYDpVQ`Mlkd`l4ALi{4`$}fSp=D>4ELcn95KWD=Sz=b;=H7B&J z0K>yv&}9SLgNaMXjmqSNMSKF{>3gmZ=`u0Dpo| zF!^n+iysT#=AY;{ORr5_KldhW;u*FM`l)3@l=AH0iR$ns{w$-8vguadiW1Z-TlrC< zj;e>3pVbQ+Z2#XY6IFvw9n!b$^F)A#u{qW0?U9==68 z)^&TiE3gFFJvpTOaxWZWi3;1tHxSj4yFcWg!T?{|&vPv_K<+rii?EV^!Uu8cte!s1 z2jZ)@Y;~MZmEDi=Z&*%pLS`c3{Btnw!w_yDQer3Xk~sjHXy zN#>iH!?78Nu6syt;T?`YUg#@-xeK2>KzZ)*DRwsZBlVF*6bWQ1;lW~Bs6Q(X@MP$8 zd3CTr`L&HKv5Ut-{U5iXOC6qe*+p^?g#J28JPKW8M~fG=7QHdTm8R`bcn(=iLxe*A zZHU4%8S%DE-j5LzL103xxP@j!oR|Y^WAWl`Xk2Yh5YTB~6`LfU=7@sRQp7os@0TjF zaW3;y#aG;MQ5O`eJ3~BkExr&p-X$9A5Vt#B1OL+DEOfga+THskGmL_Nw=SNn(s@E!7}Qc)1!)=6d# zbb*GX=pvAy&^OC?vh`#d7G_fLdp?*c;Z@skFZLDUzEOv*4y{qX~b=rJ% zRk0zKqbenDED*iJrs%Y+Ht@ILb~IMK$^_g(j@)n@{?jYPZfd87E)-1&?WWg7FYef` zH*h-xbwZp<5G!#hZbE_lYpK`~en-2u&-Gt(O~)(;tNWLM)%x<8uLj!##CP<0=I-bKw^A)eJ&iB^e6^i`_+hBmJ>8MH>| zXU~ZvB0_dpgUjfW6W0ixynL`mOryQB#afYsrr%oe3T3F9YxRxHRW;X%?kLl!SsR7Y z!KLYD5oCcb+ier$8C3hp4zUiykxI-ChB}J3i#n>_hvFlAdX|436!?P)IrkHhBnKVB z5j^ZW)S*LSz0Nj(+)mlf*Rl2WUI4X|l%LgR=&E<`g zCh`1J!X;x*3H_W#e;8%Rji;N-C}jrFZHMoz`p*R5LxPom;3A{ z#uK5Irocy&qfUfcnsM5sqQfl>b+sLZ(M~+@~ zDC2KigY_^&Hn?L=koW$u#>fe_z=$fXhxQ*<(r@JOVM9mudumMIUIT{>8$2>Eua$1( z9$R3vTz1DA$eRy+R&Kdtts*n-;^&|(FjUU@!x|(H-nM4@dP{FxBO}Jt%FAmyZ0M*F zPd+uOOTQ5#2Mrr4@7}TYlFN8t6-^+;Ry?}jh_UTP4v?N(VD8O3)^ts?lC7Kx>AY>t zm0RyvowEBKYnXhM2WHEex2(^}s&}k4wKSn}ie?{MH<9n$u_ntge^_g)A$P59g5(%G guy;^ksb(K9RaAm9i0SMFs)c^nh delta 11145 zcma)i2V7J~*EeV8-lgs05@~|K0tyR)sKknGQLtgbZZttnM8$?B)!1TUjiO#bQmP8+8jfpWPvDXy+{&N?UJn#2D-}mFkopQ>YIdkUBnKQfLgUAgZ zL~d@(x-yH!!U7lyA1^O2jae9DUJNy~REMrw_|v^ufQ5M}Fk`_Xzyp+d>0TfQMQEik zi`~b^i&X-yF^6?{Mp2`#fGE|!`v!ZCRhmynd2Zh#evSP_LxvhgFTIcNd^*A|(-ks| z-FgbmH-6KTfOm-PX2Dd)5;&jkvPE>C-D7jvd@}fa_h`!lokESF)_v|u zRWlg1aCeRxOB7`Ejf*vIM2A1A1sLfL8-H)$xqKYnu3Gu_AO|^F zL8dLppqOams^cXJGdjl1#P|D{X};yq06-&*fH+@cPHgWoP62Uhyu`R^W;@>K6sH?! zg4)PIt{YzY_+IeJcU_)}dD_b6 zX^cs70DD1FBBx0AXDK&`+8CQtQ}FGZ5Ie6{T>$IVs>i{1SXwj%xo4$isR2*ajm7uA z`30i8alJ`QKHf!@$tbDfYqV|N!(GyFI=R1U5=j&~FTJH<57&)d4LXC$-f**fQ&=9k zyH~!-pi);z1V(v2h=p)t$y{*Z>+JdU)2iGU-~`e@U*75=Td@E(m#WoMy*i^M$(IwDAC>M#qkWp+XtlJ z`?L8C&TBwPMu)sE_^!-rhVKt~$snpUux@3im8p4@`sBOLPQt=)yVK|~a5We|8u;Q< zA>3~d>c^;taXJ5GeESS(Qa0wEAuTD{$SrUhHHS7T>zgz5X`ioQ8CJWjKX+IHaHkI2 z^#o7%#<&i$r+`DMv1WLD8RYKpaa7Y7Jz_#xJG`JJ+PMY2%GwtSDp9I&qhKSZvTS5m zvp30z8Wm{P>iO1ka3?GE(V8103ql~7#h5v&SsCrEQLj;L_mI&o2*su`y;xa)tyc${ z(~UBUUyY(V#<#ED!S~>6#{#au54|*kk~U+{q`B9=>iN{1fDgIDMun zYsTxVNW4>3uWf{NDsnd%%b9IEseR>zU8mW%i{B&lLgVDP5mZMsUCBa?7sgk2Kj_+$ z+>^&&A=+yUooLYBd6Sk=im`msVycgCxVy(&tH9m;*W1ZNZX}~&3##FJXF)2s zR4dBDcSw<1sU<~qH7AVQ_+?In`({x%QG(mLu(3BaG}qy$l;3Z=M<-Tl?FRVj`HtbVbQ zXGQVLe#s8zWSavrZOo{>Jj&fvCaH<4vF7cJGHV^kId4~6bFg@0NDUhpub?*BzXxzv@7Enhel>jY!ez6|5Y zuf9h1zCqAJ>95ho?w$U|`F-sv*`4xbs)u2cF?Ih+&oIgE?gzGddJ~Phhk9X{qlZ$A zorlzbM-OG1!zLN7!@V%c_YY^(c3Q3e4!hRe!Ca?&^Iex_!Z>xi*=zQozce7<-cae{ zly9cZ&!}}gLX^%RAEWj+;gC4{o16fr)!*O40KTiDm=@#vZze+@xksj&lS_2lOD}PB zL>;f`jy=)K+mt5^6Y@6R|31Q$G1<8Ez1q2IDWlFzFRSf5^RcJqo_zKMm5~*k?`$f& zhH>qDAtp5bLemNi&s@mykj&fUZM3=A6)IbLal2aSosbht@@1O)wcjRqq)akmuNjo!F1~h;n{1rM zx3`qv-LlhZMBc7pGOTV4zwKdI-PnG6J9vz~Qw)ERbay4SqVPd!y&>(Gs^06 zhmGo#5rqqHJN2bx0j@QKVJEDbhzq3V<#ZU?TTBR~&Ys=3-f>7WcK=GhoJ2yY}G$I@vSl{j6U-Uh$icp8b`qwy4|dM`Pt zCz_2DiLm^lX)?9(6iMRaWU8ewlBpqz$P`t`9x0^kM0BW4*sQ8Z6uWAhV%@53A|}_N zcEEqF4vohAeyc-opct4&Z$YN3X;fJ$=}}!e56w3 zCbhuerJ0z4Q-oyEd^m`36&Aq5I0Eb`Vp|rq28dcwNSMDL8mEb0Q^&Be@Ep^o29J#?|0DcZ+FTut!RW&fGL};ZMkeQqE%b! zgNgrIb!;{x4ZDJJCe6TIA5{ zlp=TK&?61ao!tp;OPuOX*oq>f2fYm7wjNX$9zD%GDV90UG!hgk zV&p)WMS|Ehkj8;)U^!Q%?$(1S3tS5anF_Tb5YM!Emuc>Z3ZFHP!?$PJ^s?@Ks@o3= zJu!$jz>%rZ!^EO|WpgrM2q6qk7Rf_tDGD^J%Ns-KJxEzJilW8Zk;*<$O%y+mR7-$r z6Z4xS28~jZn`rNkqI^hf8Ex80_Gr^if|cOg5XLFNuZ^axET{DuQ(|8az_oN*nZ%eQ z>_$xl_^#=yI~WtOn+BsMqPjiT15D(NF;oc4Fr`X+)ii+TCSlFLcvY>rP<7e;HH!62 zB3R6RQ^_n2y@}o96pnF(b6yqkV(vKF2`zLOk3B>Q^5O(~4cd_4FvD}6C5nLQ%D1Qp zMf8|XDW;E)7we}}A~h7>PA5c0INe3f8Kx&0IYar11UdO#+Qz7kY+OhIs%$rxek9Q^ zMDHcO{*0{R%Mg9M=vYGGGS#3g78$ROT^|>3<=F?g3~8fW_hy^wi5LBf$RR#n01uxe zPA;IXR97SyQ8YqyZW;&BPr8AN(_X$%1UHJc7$az1z}m&=O@#hVc_Ba*$qQ*VZIhoa zBrBoZ{~irj=2(9z;eH`TEG3+>V$V`S_#%E;3LABbt4k?bc3wsgm7Qm=fVISn{1r3| zBb-`6-Jz`1mDEUa$@vgwHDnz5mnsoeGn4gKGMqERtbZPZLf zY_)96L(E)XtN}5{rCF_NkO#=ifvYwH80VlAuL1UEat=ZdvfW*YzC;tlo-U6_>cA*M zxXxi$J5G@__^#=sA;Cwa zBrxHu0(|L04Cn*+wx@7j0sfw{R;z=MKCp+$mAB~-rzT>=eQH3J<%jpFokq>%oj+me za&QSvAEVRGAEcq+Yx)z{x4`hG!GjNjq|#XI}xn;bKR!Bi%}!5zBGI>eL4 zc-rGL#FNVSM~|7#sMw=Y8hVP#XNXl_QU|B0;E81Og8n8FF7+y7;VPPr8R!n(9<1~~ z5pGyC{ferJdSB6QY9opcP@;_5Pj@JwZ8-vgG+Ff9#6xBMgH)A8m2yA0BrlAoA$66aTl`0P8Zdl_)TNvc92^1YMhC}LIw3m5UH zamEJ~9j6F6M~G?aPNgzOzP*YmstUba$0=4c zI}VDpb2JbvV$Q>(m7XJ8d41+d^3y;QqCn|XMLvI?nwO8e{o>Pc&t4=SG4=-v1m&zB zo=#)VC9;X2iEfOHH2lX zkPFz(a+w;&GAI)6ORX%Guk1x7ncDP7$OX&URoEjW64m-Z>0(G#_NJI*Vbd^OKW}yi z#ba;g0&ABK8wACPb$+aBsA+Is%8_76;5@*sYQDX)JnP3&^~xEhe}esew;Dsir0f|o z+Rm!zL1hrV976UCe^FSOg~? zBl%1!tI4UFbk$*d2qk}(P0&CxxdFQ*rnF`+cYOF%2Ewj!-KyAzj8`kRA>$7f+mP{e z#rCnqqHP;Cg$9VDZCD%)kayd#Y!>Zw_#sGF5r;Qy0l^iS$Lfz0)w0{;Mc-_uBH)AB zOr7sB?b*L^u*yF>u|NuVa@;A;o+iUPvoA>GHDm)iF8QFu3vRO!v~5bh0PQjbkqeT~ zs@R6)?^J9<^1re8Pw?-ql;Mq72(u6LWK*}Xe20!a*+9{}F>8+yVRmCy(^G_s6OCCY z>ergEP{Erp+{neXrYuopHvwvbSk#0ye8vnWx$6NOICqsm_C)bh6IQo|8C_UitQGPm zCfGGa9iZx7g0SPC1er})eFQY)nzAs^L483Pyz>*fS(8EM3pxNQ(xr-$rVJ@p37N)o z8YG5guwoR|TCk~5??)|I4GJhbp-nod^{1As3DK7#E{heSaA)B`0Wowd7AE?(VzWH; zh2mTnHZkC~+Fa^zH8+hM+Lbk9^sM}-J6o;FF1^@H8#Ho04~AeCPBD8Rn~mr-au9Q& z$n_K}2C-Dk?&u)a0!8p())U3>!R(BODn<;=XNM_4HX6c0RlIk$0Mg`-U@B4YuMw;+ z9P9TZ7?Pos2h8a*H{jUwXb1uoTB;bteS|x$5TH8 zjYPh|kZ?(mOUAPMmC=2)kOhggg-ivLsIR2@a?BitOh&xeG#@f_GT;uJqQn5&Lc>Hu zJs(P{F`tb_v1~resDSJ(XaQS=0ah#n0>&@yRdjb#YQc13N^IZEP;>kiTqW zIt6}8>P-eIJmt0#cYG=zZ)dYq#5-#jn_jEHM~jI#QfG0o_S??*u~%Izi4n>5(GxG*j1x^wUgT8`hp? zuVR&BzQ^Mmn$^xiM5o9*%SNL2)LAx82Wj_9?1~N*?77V*$rZaX>oBH8zXw%W&_3bsqB@2J*3{S zJel`BBeQd>`(i zsfc>O7T{j@$phAnVMcy`vi2-swt6Y32_ZdhbHLxMzz3)EcRH_2R8LsF`6tvs?(yag zRmSK~KOTWAVJOnME|z6_m{M-~=rZRNFVg&ZDllL4=Py8spZjy=;!KYPOekhQS1!(G z<;~EKJOLhZp7d`OFIaga^dnzfu|H9)1Aa?0krAK4a?BKh8u-UekUkKu4MBJHa-XLF zPkbH#6*;BK6dNzl1B#b|5O001Ik%(`WxYdUv+b%zP zo(C$u?(WM~HV>MQ77zP!ymTq`*AOH6p`Idl^y7gl>G$8!1kjpE?}0o~op?}TCy+pG zL852~Pr{{T&k!C{-gSQne+!)77|P?6-2yvF>>tJl2P7z;^r0oz#}%AqqoU5-A##WF zMK}-s7|!==lqYCD?pEhU^XfL7*xDq%gO#Ulm>I03%R`g74|_(a>%a}lk5ysYV@tkW zh|BNrHh~Mu`_)A-G~Zq%n@{0KRNQZ$&SU+89KKGrA9qwH#!u(bviEe}g_=z(eiAMt zTaxdZh<1gD*7aa(g*F1T8x`AEw#wgU@BqET=BHGe3Ru@wY=i5{ifx2_iz>Fkbza5x z4Ds6x*yP|je6uecL--;d-=rHHHCMNug@l8Tx&BaDF?er#R}-LSi*ERs3o0$*^8|1O zL7ouf7V&X7VgFpjyW+r=ofh+B>Hv;g&i9gUo}$w8W0*moSC#%N`F)KRNWO-*QL4NC zA+IUMuH_;4Sq08MAEZ=8;Cdb>cCF>30k6G|pQ6eNElEDR9v%hGf8s|xh?>d;AMpd~ zdX~G9b{Lk@C<+{tBaP(P9g4O;zQ)TlhCb*|N8rpH+knxBe%E zn6ed)s;a!OmAfe5pmK!{XagAuIM!6jD_iI#*j-2l!x4o#n7Y9QVc=qID^sEP5T` zr&$euaea^;EFw}=H5?`s$F@4bW;9)l^vBZLa_u2TykDiPKsEt8dyn3O?r@|7eF4-5%1FGZWD%7>}i zEmi(j$5WoK>nV>l@Ra+~wI9@J_hC~_d9;U3wMkIc*k;;xJUAdUVy=aje22}RA~Tw6 z#VSUA=+asOv(Tm06Js*85x(Y=`YKC|kJwXR3zfWuh6l@d5s{@e@f1m7a+ZeIU*Tx2 zMT-Mj8s0}e^`KT-N6(|+LW{}=ool6qh{>(A9C*)fTWPPV@p3wAaHVZDtbKxPpRKvo zX-XY6yxOWFNaS?X)Sc*ZN9`Aom3Go5syhS7HvJFGZXV2T9?b4#m_4;u73P8GG<8lK z=?x*Z-kLfmI`-Do)6c%%+I3~dTl;JEsj>XMzqSCbLtM_+num9EkQtU;prJ9im%=^8 zaE=?Ky@qH$M0+gH4Agx8KaeGm$5W-dxWbiPoi*3(MdI*KtqtZDI!t?~+;~alm(#@B z|LjVa>BF_I>Y_KNKwHcM3RMavRYhFNF$e&gC+#LWd- z-+(hKOwQ!mjNOqgbBi>%g&JagDg38fXgjEb9KKL%MkqJFr{!|{d&E zMJ~Zk$Pj-m(TW3qPzlcyUVu&mlta|LOCf4KF>;wUEgX+0W){8Fr2JbYvT*N(fBQ^S zUak$aPgAng@boIya>jD)6}5k8rH1#?da~XJ%BJFl?`lome~up3DvOS*u>+lA{Ax|b zET65`rqJgiYmF9#V!#^hT}qa>)~IcmB5SYJdLd&YXKv7>I#60{(tLF&u>B|6SO$F_ zDAv}ZIa+G7{h))Kty*1K|8wmN^=ALqSDJdCo^wEp5`*_c?@#M?xqrX5P6Zi2!h`l< zj2$mJ9n*qE>0vDcnDPh=w9Ypsm8#3PzR?b=9S5Y&C_Xr5GH-HRix*+XHFcjxeFP=_}Qd zik^okVyt?SFf4i%)Hhi4#o*A^TYp|1d>{Jg@kq-a@zHluq^yXV|< zzter;r~ASWcY)2Kpv8jdL<|kwg?G%TprQl|@g7*pPvU#HtTa$4azjen;UJU;j)*LG z`E{tg2{(YCyaTV}LxwHp*Pu689~B9KL9ug!mqV67(Cn#$pcdK=FgVx~77O4EI&70f z@O*f>C8#-<0Yn78at-6}Px_Z!#Sj;8g`Wt{HLr!>)+o*x9MB?127ZiA2riAi8jT&h zgVWOzJ=onCET7$UZ%{4Rg-umdP=%`&=+j;(ku@`+I|Tc7%8FOvoB$_f=0gfN<%)cW z1*~b7JKuyH3*(pP!!U5m`|}~w1YgRuMesf{d~ylH5p-nJ#n8x*x|*R?C14MWQcX!XF~=dOtQbbn)e11nqa~27 z3*BGF3QmJdt}KOFI%W|6S#A(>J4WjncG_P74#H|k*3APPX1HROLnvicf}oD&;P@YE z(;n7zDq4t&no3#;j3qrma>9%!O8ee@sf= z^g|VtfTzFi(p8YBpDe|3rjEtTEEeN;Mf5wHO)CN0UY{g-A&Wq-|P;-(eIp4HGA#@US|MvkV+4Yy|izGD?E+VwH=!KW0UF74v6CYxgF5*7}_3yXx_I6;0`ao1{hCg z8(=8U%(Vtspf@p_AdY);rxoI`TnR^O$#kw}})!VqPtRmH{T3nlC z?-l48$9=nOMQ)#bV8wBO!4?{8$2l&$qAE$qM{->Sn@3S;{C?BWVNcOpXbXQ7!f}G* zuAw|{$C#nil8i_2u!-V&`O&Wn!6h<(6ix(7jTy~r#Tx3#Hbu%wNw^g0_DJlZ+5}ud z)|pUERf*UlUm1f%R%|8NF&R_z>-{SQhxNadK5&?5Ybr)lYAViT*IVg0T<%T9<21m`-!S7@l1FoKo51=enfo#}+u)MCk&k5pHq+|`7!R9ebpf{JVSS5CY{yep zxF~N+{1speojS(;E%L@OoafRnd+IqH>Bir8$+xdyQW$>GBm+0`5MUF#ZsT_X0y4B4 zzZnOoKRD?z$&(&oi=&JjF^B?Q5kX}>F_q#oL^%E86H)Z7R}7~+>0%_Md4+>gePWt( z!J)~J;^p7TB5 z^OHg6CxcFnfxnM}MnnumqtSI2KJ-!)1<_rI_rX}!hug5C)Kw^Qyi2>`B$T;&g*~`z z6gJ<0>p)P}kE1xnw9)Hz_crUN;J)Hr0PcR@Zh+bD5`PdQO96siMV3fj z8?}|pB@pd8Z#n1gH>Vh}(cl{No#W2+sRTDfaNulLlx?MZofqRG+ekS6)#_fEyvTw> z@e>OR{n;TohoXj66sLtK5AnJ{gK4+`-h*KILLt~Sk-B1Lt@M?)S%}$i`n4GLGBsEO&r?SUn3(S_ zfmWu}txVNy1e32tHN@c3>;OUKB`}vpD#1&h-UwM*q6ej%!K!P?sxnxuak}uI6}m7t zW3d)tq7#)60AX5pbfS|T^>f4~@FDwV5Y)ekJ^s(ma!fT0Dh_WI9jeo8c@iTzCU+*? z@sFOQ+fW4-)~T)1>(G;YQVju=Qw?kQ23%h(JuC)4x?Bw#siJZk`cQEVyvBC!MJ5f@ zKq4jAa`o1k>L*HIA#JLKA{N)Xv%8ub7N(sux!Jj!Sx9RRadYzJovm=pmpxl|fXXi? zcfc|O@8dhc&x`7tA(@smb6d32tb6rbqL&JeKNPLTv}Q=6vyZJb#V3w5?S)~UI~v;u zhqbUc>e&xgCNA!W_Gx0D3&NS`cEN4l(pw;bF0?=>56HC^*q}8liy)e>eES&8r=0}r zn7T=j1ao9m8x(0CO^5XRb{>LC0|ZLjmv92v{6h!i8lv@PtPcRypk0;MrB26q9bev` zFCXSKTjeuHVT&fyd5jZT>5{%l&UY6V>(Od}f#XyyILztzcRL3gRN*i==L&O})@xPR zslE%s<$^9q_bL6nZBSXFD5;9VBf#kz7%x_oL>F0yoX=bpX;(0t6r+nyhlz9!&p4`?W!Mg`{YAEj0YTTqo+;yw!xyP zlyJfj8W*IfN(}0YP{Di+{Y{S;FyHh9BOouCFd~$OV(<>0GEnpci`RK$fs9;$OMzN) zVau%DU=sc+m#PZ$ZlEI*{4IK8v0biSh>b|M=3%dVB@T=Iu)S6GKZl9h1K&%;$m!29 z2>}NBA_>DODG67x>D?5Jl1G#9ERU;X5TuQ5c`B~p?My0m`RRi&3E2T56rGHVWJ?;Z z)_g|OF%AMLFav+~3)E&o^9i2z33*}KM-!**cKmu;a|w0Z(G&nPqlD%#Dsy1hV{?ZC zO(AR^YSJf-&5wmmx-hviv7VhzX5zDylZA8mx8!Hxn_l?aA$d9n_X_-}UFN)uhy9^W zUeCjF0ZsHqKF)_GS(}etYjE;_T-1#Ne(;aHCGi)4T{Lip?YrdlGx&~Kd+y~Iab7Ui zk^Ep7V|;O-Rl06q4`6efTz(6`7tkYp#__v&=xXe<7-XMC_(#)7x>!h6sbVhmqzRR5 zX(EIo(nTCyNfS@eg%sx45KeiiB8tkg#ac3Cuyra$B+$p%!j~?mi(qO<6ED$; +// EXTERNAL TYPES SECTION BEGIN + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum MainDaoQueryMsg { + ListSubDaos { + start_after: Option, + limit: Option, + }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct SubDao { + /// The contract address of the SubDAO + pub addr: String, + /// The purpose/constitution for the SubDAO + pub charter: Option, +} + +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum TimelockQueryMsg { + /// Gets the config. Returns `state::Config`. + Config {}, + + /// Gets information about a proposal. Returns + /// `proposals::Proposal`. + Proposal { proposal_id: u64 }, +} + +#[derive(Serialize, Deserialize, Clone, JsonSchema, Debug, Eq, PartialEq)] +pub struct SingleChoiceProposal { + /// The ID of the proposal being returned. + pub id: u64, + + /// The timestamp at which the proposal was submitted to the timelock contract. + pub timelock_ts: Timestamp, + + /// The messages that will be executed should this proposal be executed. + pub msgs: Vec>, + + pub status: ProposalStatus, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Copy)] +#[serde(rename_all = "snake_case")] +#[repr(u8)] +pub enum ProposalStatus { + /// The proposal is open for voting. + Timelocked, + /// The proposal has been overruled. + Overruled, + /// The proposal has been executed. + Executed, + /// The proposal's execution failed. + ExecutionFailed, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] +pub struct TimelockConfig { + pub owner: Addr, + pub timelock_duration: u64, + // subDAO core module can timelock proposals. + pub subdao: Addr, +} + +// EXTERNAL TYPES SECTION END + #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( mut deps: DepsMut, env: Env, info: MessageInfo, - _msg: InstantiateMsg, + msg: InstantiateMsg, ) -> Result { // the contract has no info for instantiation so far, so it just calls the init function of base // deposit is set to zero because it makes no sense for overrule proposals @@ -42,6 +114,13 @@ pub fn instantiate( open_proposal_submission: true, }, )?; + + let config = Config { + main_dao: deps.api.addr_validate(msg.main_dao.as_str())?, + }; + + CONFIG.save(deps.storage, &config)?; + set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; Ok(resp) } @@ -84,6 +163,47 @@ pub fn execute( }, }; + let query_msg_1 = TimelockQueryMsg::Config {}; + let timelock_config_bin = + deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: timelock_contract.to_string(), + msg: to_binary(&query_msg_1)?, + }))?; + let timelock_config: TimelockConfig = from_binary(&timelock_config_bin).unwrap(); + + let config = CONFIG.load(deps.storage)?; + + let query_msg_2 = MainDaoQueryMsg::ListSubDaos { + start_after: None, + limit: Some(10), + }; + let subdao_list_bin = deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: config.main_dao.to_string(), + msg: to_binary(&query_msg_2)?, + }))?; + let subdao_list: Vec = from_binary(&subdao_list_bin).unwrap(); + + //todo pagination handling + + if subdao_list + .into_iter() + .find(|x1| x1.addr == timelock_config.subdao) + .is_none() + { + return Err(PreProposeOverruleError::MessageUnsupported {}); + }; + + let query_msg_3 = TimelockQueryMsg::Proposal { proposal_id }; + let proposal_bin = deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: timelock_contract.to_string(), + msg: to_binary(&query_msg_3)?, + }))?; + let proposal_from_timelock: SingleChoiceProposal = from_binary(&proposal_bin).unwrap(); + + if proposal_from_timelock.status != ProposalStatus::Timelocked { + return Err(PreProposeOverruleError::MessageUnsupported {}); + }; + PrePropose::default() .execute(deps, env, info, internal_msg) .map_err(|e| PreProposeOverruleError::PreProposeBase(e)) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs index de8165d6..3969bfbc 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs @@ -1,6 +1,9 @@ +extern crate core; + pub mod contract; pub mod error; pub mod msg; +pub mod state; #[cfg(test)] pub mod testing; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs index 3ecd6c9e..843fa804 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs @@ -24,7 +24,9 @@ pub type QueryMsg = QueryBase; #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -pub struct InstantiateMsg {} +pub struct InstantiateMsg { + pub main_dao: String, +} /// Internal version of the propose message that includes the /// `proposer` field. The module will fill this in based on the sender diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs new file mode 100644 index 00000000..890057a3 --- /dev/null +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs @@ -0,0 +1,11 @@ +use cosmwasm_std::Addr; +use cw_storage_plus::{Item, Map}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] +pub struct Config { + pub main_dao: Addr, +} + +pub const CONFIG: Item = Item::new("config"); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 235d5938..4b1a7915 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -1,16 +1,20 @@ use std::marker::PhantomData; +use crate::contract::{ + MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg, +}; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, - to_binary, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, - SystemResult, WasmQuery, + to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, + SystemError, SystemResult, WasmQuery, }; use cwd_pre_propose_base::msg::QueryMsg as PreProposeQuery; pub const MOCK_CORE_MODULE: &str = "neutron1dao_core_contract"; pub const MOCK_PROPOSE_MODULE: &str = "neutron1propose_module"; pub const MOCK_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract"; +pub const MOCK_SUBDAO_CORE: &str = "neutron1subdao_core"; pub fn mock_dependencies() -> OwnedDeps { let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[])); @@ -56,6 +60,37 @@ impl WasmMockQuerier { }; return SystemResult::Ok(ContractResult::from(to_binary(addr))); } + if contract_addr == MOCK_CORE_MODULE { + let q: MainDaoQueryMsg = from_binary(msg).unwrap(); + return match q { + MainDaoQueryMsg::ListSubDaos { start_after, limit } => { + SystemResult::Ok(ContractResult::from(to_binary(&vec![SubDao { + addr: MOCK_SUBDAO_CORE.to_string(), + charter: None, + }]))) + } + }; + } + if contract_addr == MOCK_TIMELOCK_CONTRACT { + let q: TimelockQueryMsg = from_binary(msg).unwrap(); + return match q { + TimelockQueryMsg::Config {} => { + SystemResult::Ok(ContractResult::from(to_binary(&TimelockConfig { + owner: Addr::unchecked(MOCK_CORE_MODULE), + timelock_duration: 0, + subdao: Addr::unchecked(MOCK_SUBDAO_CORE), + }))) + } + TimelockQueryMsg::Proposal { proposal_id } => SystemResult::Ok( + ContractResult::from(to_binary(&SingleChoiceProposal { + id: proposal_id, + timelock_ts: Default::default(), + msgs: vec![], + status: ProposalStatus::Timelocked, + })), + ), + }; + } SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.to_string(), }) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 986f6efb..202ba7b7 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -10,14 +10,18 @@ use crate::{ ExecuteMsg, InstantiateMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, TimelockExecuteMsg, }, - testing::mock_querier::{mock_dependencies, MOCK_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT}, + testing::mock_querier::{ + mock_dependencies, MOCK_CORE_MODULE, MOCK_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT, + }, }; use crate::error::PreProposeOverruleError; use cwd_pre_propose_base::state::Config; pub fn init_base_contract(deps: DepsMut) { - let msg = InstantiateMsg {}; + let msg = InstantiateMsg { + main_dao: MOCK_CORE_MODULE.to_string(), + }; let info = mock_info(MOCK_PROPOSE_MODULE, &[]); instantiate(deps, mock_env(), info, msg).unwrap(); } @@ -40,6 +44,7 @@ fn test_create_overrule_proposal() { mock_info(PROPOSER_ADDR, &[]), msg, ); + println!("{:?}", res); assert!(res.is_ok()); assert_eq!( res.unwrap().messages, From 99603e3341e78b7eecf44a3a3e3720645e8cd99e Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:07:35 +0200 Subject: [PATCH 06/53] query and config fixes --- .../src/contract.rs | 23 ++++++++----------- .../src/state.rs | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 1c971406..420d73bf 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -163,12 +163,9 @@ pub fn execute( }, }; - let query_msg_1 = TimelockQueryMsg::Config {}; - let timelock_config_bin = - deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { - contract_addr: timelock_contract.to_string(), - msg: to_binary(&query_msg_1)?, - }))?; + let timelock_config_bin = deps + .querier + .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; let timelock_config: TimelockConfig = from_binary(&timelock_config_bin).unwrap(); let config = CONFIG.load(deps.storage)?; @@ -177,10 +174,9 @@ pub fn execute( start_after: None, limit: Some(10), }; - let subdao_list_bin = deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { - contract_addr: config.main_dao.to_string(), - msg: to_binary(&query_msg_2)?, - }))?; + let subdao_list_bin = deps + .querier + .query_wasm_smart(config.main_dao.to_string(), &query_msg_2)?; let subdao_list: Vec = from_binary(&subdao_list_bin).unwrap(); //todo pagination handling @@ -194,10 +190,9 @@ pub fn execute( }; let query_msg_3 = TimelockQueryMsg::Proposal { proposal_id }; - let proposal_bin = deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { - contract_addr: timelock_contract.to_string(), - msg: to_binary(&query_msg_3)?, - }))?; + let proposal_bin = deps + .querier + .query_wasm_smart(timelock_contract.to_string(), &query_msg_3)?; let proposal_from_timelock: SingleChoiceProposal = from_binary(&proposal_bin).unwrap(); if proposal_from_timelock.status != ProposalStatus::Timelocked { diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs index 890057a3..e3cc4ccd 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs @@ -8,4 +8,4 @@ pub struct Config { pub main_dao: Addr, } -pub const CONFIG: Item = Item::new("config"); +pub const CONFIG: Item = Item::new("config_overrule"); From 959bd601af80fcbadc2a3975ea294535913d38b8 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 14 Mar 2023 01:02:36 +0200 Subject: [PATCH 07/53] wip --- .../src/contract.rs | 118 ++++++++++++------ .../src/state.rs | 2 +- .../src/testing/mock_querier.rs | 2 +- .../Cargo.toml | 18 +++ .../src/lib.rs | 2 + .../src/msg.rs | 31 +++++ .../src/types.rs | 14 +++ 7 files changed, 147 insertions(+), 40 deletions(-) create mode 100644 packages/neutron-dao-pre-propose-overrule/Cargo.toml create mode 100644 packages/neutron-dao-pre-propose-overrule/src/lib.rs create mode 100644 packages/neutron-dao-pre-propose-overrule/src/msg.rs create mode 100644 packages/neutron-dao-pre-propose-overrule/src/types.rs diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 420d73bf..51a3f774 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -1,14 +1,16 @@ +use std::ops::Add; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - from_binary, to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, QueryRequest, - Response, StdResult, Timestamp, WasmMsg, WasmQuery, + from_binary, to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, + Response, StdResult, Timestamp, WasmMsg, }; use cw2::set_contract_version; use error::PreProposeOverruleError; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use serde::de::Unexpected::Map; use crate::error; use crate::msg::{ @@ -147,6 +149,21 @@ pub fn execute( } => { let timelock_contract_addr = deps.api.addr_validate(&timelock_contract)?; + let subdao_address = getSubdaoFromTimelock(timelock_contract, &deps)?; + + // we need this check since the timelock contract might be an impostor + if getTimelockFromSubdao(&subdao_address, &deps) != timelock_contract { + return Err(PreProposeOverruleError::MessageUnsupported {}) + } + + if !checkIfSubdaoLegit(&subdao_address, &deps) { + return Err(PreProposeOverruleError::MessageUnsupported {}) + } + + if !checkIsProposalTimelocked(&subdao_address, &deps) { + return Err(PreProposeOverruleError::MessageUnsupported {}) + } + let overrule_msg = CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: timelock_contract_addr.to_string(), msg: to_binary(&TimelockExecuteMsg::OverruleProposal { proposal_id })?, @@ -158,55 +175,80 @@ pub fn execute( // Fill in proposer based on message sender. proposer: Some(info.sender.to_string()), title: "Overrule proposal".to_string(), - description: "Reject the decision made by subdao".to_string(), + description: "Reject the decision made by the subdao".to_string(), msgs: vec![overrule_msg], }, }; - let timelock_config_bin = deps - .querier - .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; - let timelock_config: TimelockConfig = from_binary(&timelock_config_bin).unwrap(); + PrePropose::default() + .execute(deps, env, info, internal_msg) + .map_err(|e| PreProposeOverruleError::PreProposeBase(e)) + } + _ => Err(PreProposeOverruleError::MessageUnsupported {}), + } +} - let config = CONFIG.load(deps.storage)?; +fn getSubdaoFromTimelock(timelock_contract: String, deps: &DepsMut) -> Result{ + let timelock_config: TimelockConfig = deps + .querier + .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; + Ok(timelock_config.subdao) +} - let query_msg_2 = MainDaoQueryMsg::ListSubDaos { - start_after: None, - limit: Some(10), - }; - let subdao_list_bin = deps - .querier - .query_wasm_smart(config.main_dao.to_string(), &query_msg_2)?; - let subdao_list: Vec = from_binary(&subdao_list_bin).unwrap(); - - //todo pagination handling - - if subdao_list - .into_iter() - .find(|x1| x1.addr == timelock_config.subdao) - .is_none() - { - return Err(PreProposeOverruleError::MessageUnsupported {}); - }; +fn getTimelockFromSubdao(subdao_core: &Addr, deps: &DepsMut) -> Result{ + // let timelock_config: TimelockConfig = deps + // .querier + // .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; + // Ok(timelock_config.subdao) + Ok(Addr::unchecked("bla")) +} - let query_msg_3 = TimelockQueryMsg::Proposal { proposal_id }; - let proposal_bin = deps - .querier - .query_wasm_smart(timelock_contract.to_string(), &query_msg_3)?; - let proposal_from_timelock: SingleChoiceProposal = from_binary(&proposal_bin).unwrap(); +fn checkIfSubdaoLegit(subdao_core: &Addr, deps: &DepsMut) -> bool { + let config = CONFIG.load(deps.storage)?; - if proposal_from_timelock.status != ProposalStatus::Timelocked { - return Err(PreProposeOverruleError::MessageUnsupported {}); - }; + let mut start_after: Option<&SubDao> = None; - PrePropose::default() - .execute(deps, env, info, internal_msg) - .map_err(|e| PreProposeOverruleError::PreProposeBase(e)) + loop { + let query_msg_2 = MainDaoQueryMsg::ListSubDaos { + start_after: start_after.map(|subdao| subdao.addr), + limit: Some(10), + }; + + let subdao_list: Vec = deps + .querier + .query_wasm_smart(config.main_dao.to_string(), &query_msg_2)?; + + if subdao_list.is_empty() { + return false } - _ => Err(PreProposeOverruleError::MessageUnsupported {}), + + if subdao_list + .into_iter() + .find(|x1| x1.addr == subdao_core.into_string()) + .is_some() + { + return true; + }; + start_after = subdao_list.last(); } } +fn checkIsProposalTimelocked(subdao_core: &Addr, deps: &DepsMut) -> Result{ + // let query_msg_3 = TimelockQueryMsg::Proposal { proposal_id }; + // let proposal_bin = deps + // .querier + // .query_wasm_smart(timelock_contract.to_string(), &query_msg_3)?; + // let proposal_from_timelock: SingleChoiceProposal = from_binary(&proposal_bin).unwrap(); + // + // if proposal_from_timelock.status != ProposalStatus::Timelocked { + // return Err(PreProposeOverruleError::MessageUnsupported {}); + // }; +} + +fn getSubdaoName() -> Result{ + Ok("Subdao".to_string()) +} + #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { PrePropose::default().query(deps, env, msg) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs index e3cc4ccd..8ec62fdf 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs @@ -1,5 +1,5 @@ use cosmwasm_std::Addr; -use cw_storage_plus::{Item, Map}; +use cw_storage_plus::{Item}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 4b1a7915..4751f020 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -63,7 +63,7 @@ impl WasmMockQuerier { if contract_addr == MOCK_CORE_MODULE { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); return match q { - MainDaoQueryMsg::ListSubDaos { start_after, limit } => { + MainDaoQueryMsg::ListSubDaos { start_after: _, limit: _ } => { SystemResult::Ok(ContractResult::from(to_binary(&vec![SubDao { addr: MOCK_SUBDAO_CORE.to_string(), charter: None, diff --git a/packages/neutron-dao-pre-propose-overrule/Cargo.toml b/packages/neutron-dao-pre-propose-overrule/Cargo.toml new file mode 100644 index 00000000..28f8ff8b --- /dev/null +++ b/packages/neutron-dao-pre-propose-overrule/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "neutron-dao-pre-propose-overrule" +version = "0.1.0" +authors = ["oldremez"] +edition = "2021" +license = "Apache-2.0" +repository = "https://github.com/neutron/neutron-dao" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +cwd-pre-propose-base = { version = "*", path = "../cwd-pre-propose-base" } +schemars = "0.8" +serde = { version = "1.0.147", default-features = false, features = ["derive"] } +cosmwasm-std = "1.0.0" +neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron-org/neutron-sdk.git", rev = "c19b40c024eeaa8733af9ddee94a52798d78f469" } +cwd-voting = { path = "../cwd-voting" } +cwd-interface = { path = "../cwd-interface" } diff --git a/packages/neutron-dao-pre-propose-overrule/src/lib.rs b/packages/neutron-dao-pre-propose-overrule/src/lib.rs new file mode 100644 index 00000000..c413ff51 --- /dev/null +++ b/packages/neutron-dao-pre-propose-overrule/src/lib.rs @@ -0,0 +1,2 @@ +pub mod msg; +pub mod types; diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs new file mode 100644 index 00000000..c2fb3899 --- /dev/null +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -0,0 +1,31 @@ +use crate::types::ProposeMessage; +use cwd_interface::ModuleInstantiateInfo; +use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; +use cwd_voting::deposit::UncheckedDepositInfo; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct InstantiateMsg { + /// Information about the deposit requirements for this + /// module. None if no deposit. + pub deposit_info: Option, + /// If false, only members (addresses with voting power) may create + /// proposals in the DAO. Otherwise, any address may create a + /// proposal so long as they pay the deposit. + pub open_proposal_submission: bool, + + /// Instantiate information for timelock module. + pub timelock_module_instantiate_info: ModuleInstantiateInfo, +} + +pub type ExecuteMsg = ExecuteBase; + +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg { + QueryBase(QueryBase), + /// Gets the address of the timelock contract. + TimelockAddress {}, +} diff --git a/packages/neutron-dao-pre-propose-overrule/src/types.rs b/packages/neutron-dao-pre-propose-overrule/src/types.rs new file mode 100644 index 00000000..e5f10708 --- /dev/null +++ b/packages/neutron-dao-pre-propose-overrule/src/types.rs @@ -0,0 +1,14 @@ +use cosmwasm_std::CosmosMsg; +use neutron_bindings::bindings::msg::NeutronMsg; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum ProposeMessage { + Propose { + title: String, + description: String, + msgs: Vec>, + }, +} From fb4ba6553fd6589e887dd8218274098e00fdc569 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 14 Mar 2023 14:04:25 +0200 Subject: [PATCH 08/53] most of the code is written --- Cargo.lock | 16 +++ .../Cargo.toml | 3 + .../src/contract.rs | 117 ++++++++++++------ .../src/state.rs | 10 +- 4 files changed, 99 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 17ccafe8..61c5079c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -741,6 +741,9 @@ dependencies = [ "cwd-proposal-single", "cwd-voting", "neutron-sdk", + "neutron-subdao-core", + "neutron-subdao-proposal-single", + "neutron-subdao-timelock-single", "schemars", "serde", "thiserror", @@ -1287,6 +1290,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "neutron-dao-pre-propose-overrule" +version = "0.1.0" +dependencies = [ + "cosmwasm-std", + "cwd-interface", + "cwd-pre-propose-base", + "cwd-voting", + "neutron-sdk", + "schemars", + "serde", +] + [[package]] name = "neutron-distribution" version = "0.1.0" diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml index e4d2186f..56275d16 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml @@ -25,6 +25,9 @@ cwd-voting = { path = "../../../../packages/cwd-voting" } neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron-org/neutron-sdk.git", rev = "c19b40c024eeaa8733af9ddee94a52798d78f469" } schemars = "0.8.8" thiserror = { version = "1.0.31" } +neutron-subdao-core = { version = "*", path = "../../../../packages/neutron-subdao-core" } +neutron-subdao-timelock-single = { version = "*", path = "../../../../packages/neutron-subdao-timelock-single" } +neutron-subdao-proposal-single = { version = "*", path = "../../../../packages/neutron-subdao-proposal-single" } [dev-dependencies] cosmwasm-schema = "1.0.0" diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 51a3f774..b3379dbd 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -17,13 +17,21 @@ use crate::msg::{ ExecuteMsg, InstantiateMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, TimelockExecuteMsg, }; -use crate::state::{Config, CONFIG}; +// use crate::state::{Config, CONFIG}; use cwd_pre_propose_base::{ error::PreProposeError, msg::{ExecuteMsg as ExecuteBase, InstantiateMsg as InstantiateBase}, state::PreProposeContract, }; +use neutron_subdao_core::msg::QueryMsg as SubdaoQueryMsg; +use neutron_subdao_core::types as SubdaoTypes; +use neutron_subdao_timelock_single::msg as TimelockMsg; +use neutron_subdao_timelock_single::types as TimelockTypes; +use neutron_subdao_proposal_single::types as SubdaoProposalTypes; +use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; +use cwd_voting::pre_propose::ProposalCreationPolicy; + pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -95,6 +103,12 @@ pub struct TimelockConfig { pub subdao: Addr, } +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum DaoProposalQueryMsg { + Dao {} +} + // EXTERNAL TYPES SECTION END #[cfg_attr(not(feature = "library"), entry_point)] @@ -102,7 +116,7 @@ pub fn instantiate( mut deps: DepsMut, env: Env, info: MessageInfo, - msg: InstantiateMsg, + _msg: InstantiateMsg, ) -> Result { // the contract has no info for instantiation so far, so it just calls the init function of base // deposit is set to zero because it makes no sense for overrule proposals @@ -117,12 +131,6 @@ pub fn instantiate( }, )?; - let config = Config { - main_dao: deps.api.addr_validate(msg.main_dao.as_str())?, - }; - - CONFIG.save(deps.storage, &config)?; - set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; Ok(resp) } @@ -149,18 +157,18 @@ pub fn execute( } => { let timelock_contract_addr = deps.api.addr_validate(&timelock_contract)?; - let subdao_address = getSubdaoFromTimelock(timelock_contract, &deps)?; + let subdao_address = get_subdao_from_timelock(&timelock_contract, &deps)?; // we need this check since the timelock contract might be an impostor - if getTimelockFromSubdao(&subdao_address, &deps) != timelock_contract { + if get_timelock_from_subdao(&subdao_address, &deps)? != timelock_contract { return Err(PreProposeOverruleError::MessageUnsupported {}) } - if !checkIfSubdaoLegit(&subdao_address, &deps) { + if !check_if_subdao_legit(&subdao_address, &deps)? { return Err(PreProposeOverruleError::MessageUnsupported {}) } - if !checkIsProposalTimelocked(&subdao_address, &deps) { + if !check_is_proposal_timelocked(&subdao_address, proposal_id, &deps)? { return Err(PreProposeOverruleError::MessageUnsupported {}) } @@ -170,12 +178,16 @@ pub fn execute( funds: vec![], }); + let subdao_name = get_subdao_name(&subdao_address, &deps)?; + let prop_desc: String = format!("Reject the decision made by the {} subdao", subdao_name); + let prop_name: String = format!("Overrule proposal {} of {}", proposal_id, subdao_name); + let internal_msg = ExecuteInternal::Propose { msg: ProposeMessageInternal::Propose { // Fill in proposer based on message sender. proposer: Some(info.sender.to_string()), - title: "Overrule proposal".to_string(), - description: "Reject the decision made by the subdao".to_string(), + title: prop_name, + description: prop_desc, msgs: vec![overrule_msg], }, }; @@ -188,65 +200,88 @@ pub fn execute( } } -fn getSubdaoFromTimelock(timelock_contract: String, deps: &DepsMut) -> Result{ +fn get_subdao_from_timelock(timelock_contract: &String, deps: &DepsMut) -> Result{ let timelock_config: TimelockConfig = deps .querier .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; Ok(timelock_config.subdao) } -fn getTimelockFromSubdao(subdao_core: &Addr, deps: &DepsMut) -> Result{ - // let timelock_config: TimelockConfig = deps - // .querier - // .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; - // Ok(timelock_config.subdao) - Ok(Addr::unchecked("bla")) +fn get_timelock_from_subdao(subdao_core: &Addr, deps: &DepsMut) -> Result{ + let proposal_modules: Vec = deps + .querier + .query_wasm_smart(subdao_core, &SubdaoQueryMsg::ProposalModules { start_after: None, limit: Some(1) })?; + + if proposal_modules.is_empty(){ + return Err(PreProposeOverruleError::MessageUnsupported {}); + } + + let prop_policy: cwd_voting::pre_propose::ProposalCreationPolicy = deps + .querier + .query_wasm_smart(proposal_modules.first().unwrap().address.clone(), &SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy{})?; + match prop_policy { + ProposalCreationPolicy::Anyone {} => { + Err(PreProposeOverruleError::MessageUnsupported {}) + } + ProposalCreationPolicy::Module { addr } => { + Ok(addr) + } + } } -fn checkIfSubdaoLegit(subdao_core: &Addr, deps: &DepsMut) -> bool { - let config = CONFIG.load(deps.storage)?; +fn check_if_subdao_legit(subdao_core: &Addr, deps: &DepsMut) -> Result { + let main_dao = get_main_dao_address(&deps)?; let mut start_after: Option<&SubDao> = None; loop { let query_msg_2 = MainDaoQueryMsg::ListSubDaos { - start_after: start_after.map(|subdao| subdao.addr), + start_after: match start_after { + None => {None} + Some(a) => {Some(a.clone().addr)} + }, limit: Some(10), }; let subdao_list: Vec = deps .querier - .query_wasm_smart(config.main_dao.to_string(), &query_msg_2)?; + .query_wasm_smart(main_dao.clone(), &query_msg_2)?; if subdao_list.is_empty() { - return false + return Ok(false) } + // start_after = subdao_list.last(); + if subdao_list .into_iter() - .find(|x1| x1.addr == subdao_core.into_string()) + .find(|x1| x1.addr == subdao_core.clone().into_string()) .is_some() { - return true; + return Ok(true); }; - start_after = subdao_list.last(); } } -fn checkIsProposalTimelocked(subdao_core: &Addr, deps: &DepsMut) -> Result{ - // let query_msg_3 = TimelockQueryMsg::Proposal { proposal_id }; - // let proposal_bin = deps - // .querier - // .query_wasm_smart(timelock_contract.to_string(), &query_msg_3)?; - // let proposal_from_timelock: SingleChoiceProposal = from_binary(&proposal_bin).unwrap(); - // - // if proposal_from_timelock.status != ProposalStatus::Timelocked { - // return Err(PreProposeOverruleError::MessageUnsupported {}); - // }; +fn get_main_dao_address(deps: &DepsMut) -> Result{ + let dao: Addr = deps + .querier + .query_wasm_smart(PrePropose::default().proposal_module.load(deps.storage)?, &DaoProposalQueryMsg::Dao {})?; + Ok(dao) +} + +fn check_is_proposal_timelocked(subdao_core: &Addr, proposal_id: u64, deps: &DepsMut) -> Result{ + let proposal: TimelockTypes::SingleChoiceProposal = deps + .querier + .query_wasm_smart(subdao_core, &TimelockQueryMsg::Proposal { proposal_id })?; + return Ok(proposal.status == TimelockTypes::ProposalStatus::Timelocked); } -fn getSubdaoName() -> Result{ - Ok("Subdao".to_string()) +fn get_subdao_name(subdao: &Addr, deps: &DepsMut) -> Result { + let subdao_config: SubdaoTypes::Config = deps + .querier + .query_wasm_smart(subdao, &SubdaoQueryMsg::Config {})?; + Ok(subdao_config.name) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs index 8ec62fdf..ad89d9b2 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs @@ -3,9 +3,7 @@ use cw_storage_plus::{Item}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] -pub struct Config { - pub main_dao: Addr, -} - -pub const CONFIG: Item = Item::new("config_overrule"); +// #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] +// pub struct Config {} +// +// pub const CONFIG: Item = Item::new("config_overrule"); From 09f4917fdb7c22baa61686b64de6c9a46f6c1e4c Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 14 Mar 2023 18:01:55 +0200 Subject: [PATCH 09/53] positive test scenario pass --- Cargo.lock | 1 + .../Cargo.toml | 1 + .../src/contract.rs | 112 ++++-------------- .../src/error.rs | 9 ++ .../src/msg.rs | 76 +++++++++++- .../src/testing/mock_querier.rs | 73 ++++++++++-- .../src/testing/tests.rs | 15 ++- .../src/contract.rs | 2 + 8 files changed, 179 insertions(+), 110 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 61c5079c..2a4aa021 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -742,6 +742,7 @@ dependencies = [ "cwd-voting", "neutron-sdk", "neutron-subdao-core", + "neutron-subdao-pre-propose-single", "neutron-subdao-proposal-single", "neutron-subdao-timelock-single", "schemars", diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml index 56275d16..cb057a59 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml @@ -28,6 +28,7 @@ thiserror = { version = "1.0.31" } neutron-subdao-core = { version = "*", path = "../../../../packages/neutron-subdao-core" } neutron-subdao-timelock-single = { version = "*", path = "../../../../packages/neutron-subdao-timelock-single" } neutron-subdao-proposal-single = { version = "*", path = "../../../../packages/neutron-subdao-proposal-single" } +neutron-subdao-pre-propose-single = { version = "*", path = "../../../../packages/neutron-subdao-pre-propose-single" } [dev-dependencies] cosmwasm-schema = "1.0.0" diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index b3379dbd..275d45e2 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -13,10 +13,7 @@ use serde::{Deserialize, Serialize}; use serde::de::Unexpected::Map; use crate::error; -use crate::msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, - TimelockExecuteMsg, -}; +use crate::msg::{DaoProposalQueryMsg, ExecuteMsg, InstantiateMsg, MainDaoQueryMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, SubDao, TimelockConfig, TimelockExecuteMsg, TimelockQueryMsg}; // use crate::state::{Config, CONFIG}; use cwd_pre_propose_base::{ error::PreProposeError, @@ -31,86 +28,13 @@ use neutron_subdao_timelock_single::types as TimelockTypes; use neutron_subdao_proposal_single::types as SubdaoProposalTypes; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use cwd_voting::pre_propose::ProposalCreationPolicy; +use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); type PrePropose = PreProposeContract; -// EXTERNAL TYPES SECTION BEGIN - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum MainDaoQueryMsg { - ListSubDaos { - start_after: Option, - limit: Option, - }, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -pub struct SubDao { - /// The contract address of the SubDAO - pub addr: String, - /// The purpose/constitution for the SubDAO - pub charter: Option, -} - -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum TimelockQueryMsg { - /// Gets the config. Returns `state::Config`. - Config {}, - - /// Gets information about a proposal. Returns - /// `proposals::Proposal`. - Proposal { proposal_id: u64 }, -} - -#[derive(Serialize, Deserialize, Clone, JsonSchema, Debug, Eq, PartialEq)] -pub struct SingleChoiceProposal { - /// The ID of the proposal being returned. - pub id: u64, - - /// The timestamp at which the proposal was submitted to the timelock contract. - pub timelock_ts: Timestamp, - - /// The messages that will be executed should this proposal be executed. - pub msgs: Vec>, - - pub status: ProposalStatus, -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Copy)] -#[serde(rename_all = "snake_case")] -#[repr(u8)] -pub enum ProposalStatus { - /// The proposal is open for voting. - Timelocked, - /// The proposal has been overruled. - Overruled, - /// The proposal has been executed. - Executed, - /// The proposal's execution failed. - ExecutionFailed, -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] -pub struct TimelockConfig { - pub owner: Addr, - pub timelock_duration: u64, - // subDAO core module can timelock proposals. - pub subdao: Addr, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum DaoProposalQueryMsg { - Dao {} -} - -// EXTERNAL TYPES SECTION END - #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( mut deps: DepsMut, @@ -161,15 +85,15 @@ pub fn execute( // we need this check since the timelock contract might be an impostor if get_timelock_from_subdao(&subdao_address, &deps)? != timelock_contract { - return Err(PreProposeOverruleError::MessageUnsupported {}) + return Err(PreProposeOverruleError::SudaoMisconfured {}) } if !check_if_subdao_legit(&subdao_address, &deps)? { - return Err(PreProposeOverruleError::MessageUnsupported {}) + return Err(PreProposeOverruleError::ForbiddenSubdao {}) } - if !check_is_proposal_timelocked(&subdao_address, proposal_id, &deps)? { - return Err(PreProposeOverruleError::MessageUnsupported {}) + if !check_is_proposal_timelocked(&Addr::unchecked(timelock_contract_addr.clone()), proposal_id, &deps)? { + return Err(PreProposeOverruleError::ProposalWrongState {}) } let overrule_msg = CosmosMsg::Wasm(WasmMsg::Execute { @@ -213,18 +137,21 @@ fn get_timelock_from_subdao(subdao_core: &Addr, deps: &DepsMut) -> Result { - Err(PreProposeOverruleError::MessageUnsupported {}) + Err(PreProposeOverruleError::SudaoMisconfured {}) } ProposalCreationPolicy::Module { addr } => { - Ok(addr) + let timelock: Addr = deps + .querier + .query_wasm_smart(addr, &SubdaoPreProposeQueryMsg::TimelockAddress{})?; + Ok(timelock) } } } @@ -233,6 +160,7 @@ fn check_if_subdao_legit(subdao_core: &Addr, deps: &DepsMut) -> Result = None; + let query_limit = 10; loop { let query_msg_2 = MainDaoQueryMsg::ListSubDaos { @@ -240,7 +168,7 @@ fn check_if_subdao_legit(subdao_core: &Addr, deps: &DepsMut) -> Result {None} Some(a) => {Some(a.clone().addr)} }, - limit: Some(10), + limit: Some(query_limit), }; let subdao_list: Vec = deps @@ -258,8 +186,12 @@ fn check_if_subdao_legit(subdao_core: &Addr, deps: &DepsMut) -> Result Result Ok(dao) } -fn check_is_proposal_timelocked(subdao_core: &Addr, proposal_id: u64, deps: &DepsMut) -> Result{ +fn check_is_proposal_timelocked(timelock: &Addr, proposal_id: u64, deps: &DepsMut) -> Result{ let proposal: TimelockTypes::SingleChoiceProposal = deps .querier - .query_wasm_smart(subdao_core, &TimelockQueryMsg::Proposal { proposal_id })?; + .query_wasm_smart(timelock, &TimelockQueryMsg::Proposal { proposal_id })?; return Ok(proposal.status == TimelockTypes::ProposalStatus::Timelocked); } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index d351fa83..d9878043 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -12,4 +12,13 @@ pub enum PreProposeOverruleError { #[error("Base pre propose messages aren't supported.")] MessageUnsupported {}, + + #[error("Subdao is wrongly configured.")] + SudaoMisconfured {}, + + #[error("Subdao isn't in the list.")] + ForbiddenSubdao {}, + + #[error("")] + ProposalWrongState {}, } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs index 843fa804..a105cd36 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::CosmosMsg; +use cosmwasm_std::{Addr, CosmosMsg, Timestamp}; use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; @@ -41,3 +41,77 @@ pub enum ProposeMessageInternal { proposer: Option, }, } + +// EXTERNAL TYPES SECTION BEGIN + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum MainDaoQueryMsg { + ListSubDaos { + start_after: Option, + limit: Option, + }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +pub struct SubDao { + /// The contract address of the SubDAO + pub addr: String, + /// The purpose/constitution for the SubDAO + pub charter: Option, +} + +#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum TimelockQueryMsg { + /// Gets the config. Returns `state::Config`. + Config {}, + + /// Gets information about a proposal. Returns + /// `proposals::Proposal`. + Proposal { proposal_id: u64 }, +} + +#[derive(Serialize, Deserialize, Clone, JsonSchema, Debug, Eq, PartialEq)] +pub struct SingleChoiceProposal { + /// The ID of the proposal being returned. + pub id: u64, + + /// The timestamp at which the proposal was submitted to the timelock contract. + pub timelock_ts: Timestamp, + + /// The messages that will be executed should this proposal be executed. + pub msgs: Vec>, + + pub status: ProposalStatus, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Copy)] +#[serde(rename_all = "snake_case")] +#[repr(u8)] +pub enum ProposalStatus { + /// The proposal is open for voting. + Timelocked, + /// The proposal has been overruled. + Overruled, + /// The proposal has been executed. + Executed, + /// The proposal's execution failed. + ExecutionFailed, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] +pub struct TimelockConfig { + pub owner: Addr, + pub timelock_duration: u64, + // subDAO core module can timelock proposals. + pub subdao: Addr, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum DaoProposalQueryMsg { + Dao {} +} + +// EXTERNAL TYPES SECTION END \ No newline at end of file diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 4751f020..e71e9c76 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -1,8 +1,8 @@ use std::marker::PhantomData; -use crate::contract::{ - MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg, -}; +// use crate::contract::{ +// MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg, +// }; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, @@ -10,11 +10,19 @@ use cosmwasm_std::{ SystemError, SystemResult, WasmQuery, }; use cwd_pre_propose_base::msg::QueryMsg as PreProposeQuery; +use crate::msg::{DaoProposalQueryMsg, MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg}; +use neutron_subdao_core::msg::{QueryMsg as SubdaoQueryMsg, QueryMsg}; +use neutron_subdao_core::types as SubdaoTypes; +use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; +use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; -pub const MOCK_CORE_MODULE: &str = "neutron1dao_core_contract"; -pub const MOCK_PROPOSE_MODULE: &str = "neutron1propose_module"; +pub const MOCK_DAO_CORE: &str = "neutron1dao_core_contract"; +pub const MOCK_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module"; +pub const MOCK_SUBDAO_PREPROPOSE_MODULE: &str = "neutron1subdao_prepropose_module"; +pub const MOCK_DAO_PROPOSE_MODULE: &str = "neutron1propose_module"; pub const MOCK_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract"; pub const MOCK_SUBDAO_CORE: &str = "neutron1subdao_core"; +pub const SUBDAO_NAME: &str = "Based DAO"; pub fn mock_dependencies() -> OwnedDeps { let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[])); @@ -50,17 +58,14 @@ impl WasmMockQuerier { pub fn handle_query(&self, request: &QueryRequest) -> QuerierResult { match &request { QueryRequest::Wasm(WasmQuery::Smart { contract_addr, msg }) => { - if contract_addr == MOCK_PROPOSE_MODULE { - let q: PreProposeQuery = from_binary(msg).unwrap(); + if contract_addr == MOCK_SUBDAO_PROPOSE_MODULE { + let q: DaoProposalQueryMsg = from_binary(msg).unwrap(); let addr = match q { - PreProposeQuery::ProposalModule {} => todo!(), - PreProposeQuery::Dao {} => MOCK_CORE_MODULE, - PreProposeQuery::Config {} => todo!(), - PreProposeQuery::DepositInfo { proposal_id: _ } => todo!(), + DaoProposalQueryMsg::Dao {} => MOCK_DAO_CORE, }; return SystemResult::Ok(ContractResult::from(to_binary(addr))); } - if contract_addr == MOCK_CORE_MODULE { + if contract_addr == MOCK_DAO_CORE { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); return match q { MainDaoQueryMsg::ListSubDaos { start_after: _, limit: _ } => { @@ -76,7 +81,7 @@ impl WasmMockQuerier { return match q { TimelockQueryMsg::Config {} => { SystemResult::Ok(ContractResult::from(to_binary(&TimelockConfig { - owner: Addr::unchecked(MOCK_CORE_MODULE), + owner: Addr::unchecked(MOCK_DAO_CORE), timelock_duration: 0, subdao: Addr::unchecked(MOCK_SUBDAO_CORE), }))) @@ -91,6 +96,48 @@ impl WasmMockQuerier { ), }; } + if contract_addr == MOCK_SUBDAO_CORE { + let q: SubdaoQueryMsg = from_binary(msg).unwrap(); + return match q { + SubdaoQueryMsg::ProposalModules { start_after: _, limit: _ } => { + SystemResult::Ok(ContractResult::from(to_binary(&vec![SubdaoTypes::ProposalModule { + address: Addr::unchecked(MOCK_DAO_PROPOSE_MODULE), + prefix: "".to_string(), + status: SubdaoTypes::ProposalModuleStatus::Enabled, + }]))) + } + SubdaoQueryMsg::Config {} => { + SystemResult::Ok(ContractResult::from(to_binary(&SubdaoTypes::Config { + name: SUBDAO_NAME.to_string(), + description: "".to_string(), + dao_uri: None, + main_dao: Addr::unchecked(MOCK_DAO_CORE), + security_dao: Addr::unchecked("111"), + }))) + } + _ => todo!() + }; + } + if contract_addr == MOCK_DAO_PROPOSE_MODULE { + let q: SubdaoProposalMsg::QueryMsg = from_binary(msg).unwrap(); + return match q { + SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy { } => { + SystemResult::Ok(ContractResult::from(to_binary(&cwd_voting::pre_propose::ProposalCreationPolicy::Module { + addr: Addr::unchecked(MOCK_SUBDAO_PREPROPOSE_MODULE) + }))) + } + _ => todo!() + }; + } + if contract_addr == MOCK_SUBDAO_PREPROPOSE_MODULE { + let q: SubdaoPreProposeQueryMsg = from_binary(msg).unwrap(); + return match q { + SubdaoPreProposeQueryMsg::TimelockAddress { } => { + SystemResult::Ok(ContractResult::from(to_binary(&Addr::unchecked(MOCK_TIMELOCK_CONTRACT)))) + } + _ => todo!() + }; + } SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.to_string(), }) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 202ba7b7..936f2d4c 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -11,18 +11,19 @@ use crate::{ TimelockExecuteMsg, }, testing::mock_querier::{ - mock_dependencies, MOCK_CORE_MODULE, MOCK_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT, + mock_dependencies, MOCK_DAO_CORE, MOCK_SUBDAO_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT, }, }; use crate::error::PreProposeOverruleError; use cwd_pre_propose_base::state::Config; +use crate::testing::mock_querier::{MOCK_SUBDAO_CORE, SUBDAO_NAME}; pub fn init_base_contract(deps: DepsMut) { let msg = InstantiateMsg { - main_dao: MOCK_CORE_MODULE.to_string(), + main_dao: MOCK_DAO_CORE.to_string(), }; - let info = mock_info(MOCK_PROPOSE_MODULE, &[]); + let info = mock_info(MOCK_SUBDAO_PROPOSE_MODULE, &[]); instantiate(deps, mock_env(), info, msg).unwrap(); } @@ -46,13 +47,15 @@ fn test_create_overrule_proposal() { ); println!("{:?}", res); assert!(res.is_ok()); + let prop_desc: String = format!("Reject the decision made by the {} subdao", SUBDAO_NAME); + let prop_name: String = format!("Overrule proposal {} of {}", PROPOSAL_ID, SUBDAO_NAME); assert_eq!( res.unwrap().messages, vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: MOCK_PROPOSE_MODULE.to_string(), + contract_addr: MOCK_SUBDAO_PROPOSE_MODULE.to_string(), msg: to_binary(&ProposeMessageInternal::Propose { - title: "Overrule proposal".to_string(), - description: "Reject the decision made by subdao".to_string(), + title: prop_name, + description: prop_desc, msgs: vec![CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: MOCK_TIMELOCK_CONTRACT.to_string(), msg: to_binary(&TimelockExecuteMsg::OverruleProposal { diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 6e21c1e3..05aed561 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -99,6 +99,8 @@ pub fn execute_timelock_proposal( PROPOSALS.save(deps.storage, proposal_id, &proposal)?; + // todo!(oldremez) send overrule creation proposal message + Ok(Response::default() .add_attribute("action", "timelock_proposal") .add_attribute("sender", info.sender) From 779bb0bee06364aaa517f077bac70c1eb6f89539 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 14 Mar 2023 18:42:44 +0200 Subject: [PATCH 10/53] refactoring --- .../src/contract.rs | 123 ++++++++++-------- .../src/error.rs | 2 +- .../src/lib.rs | 1 - .../src/state.rs | 9 -- .../src/testing/mock_querier.rs | 64 +++++---- .../src/testing/tests.rs | 3 +- 6 files changed, 109 insertions(+), 93 deletions(-) delete mode 100644 contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 275d45e2..7f02f954 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -1,19 +1,17 @@ -use std::ops::Add; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - from_binary, to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, - Response, StdResult, Timestamp, WasmMsg, + to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Response, StdResult, + WasmMsg, }; use cw2::set_contract_version; use error::PreProposeOverruleError; -use neutron_bindings::bindings::msg::NeutronMsg; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use serde::de::Unexpected::Map; use crate::error; -use crate::msg::{DaoProposalQueryMsg, ExecuteMsg, InstantiateMsg, MainDaoQueryMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, SubDao, TimelockConfig, TimelockExecuteMsg, TimelockQueryMsg}; +use crate::msg::{ + DaoProposalQueryMsg, ExecuteMsg, InstantiateMsg, MainDaoQueryMsg, ProposeMessage, + ProposeMessageInternal, QueryMsg, SubDao, TimelockConfig, TimelockExecuteMsg, TimelockQueryMsg, +}; // use crate::state::{Config, CONFIG}; use cwd_pre_propose_base::{ error::PreProposeError, @@ -21,14 +19,12 @@ use cwd_pre_propose_base::{ state::PreProposeContract, }; +use cwd_voting::pre_propose::ProposalCreationPolicy; use neutron_subdao_core::msg::QueryMsg as SubdaoQueryMsg; use neutron_subdao_core::types as SubdaoTypes; -use neutron_subdao_timelock_single::msg as TimelockMsg; -use neutron_subdao_timelock_single::types as TimelockTypes; -use neutron_subdao_proposal_single::types as SubdaoProposalTypes; -use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; -use cwd_voting::pre_propose::ProposalCreationPolicy; use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; +use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; +use neutron_subdao_timelock_single::types as TimelockTypes; pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -85,15 +81,19 @@ pub fn execute( // we need this check since the timelock contract might be an impostor if get_timelock_from_subdao(&subdao_address, &deps)? != timelock_contract { - return Err(PreProposeOverruleError::SudaoMisconfured {}) + return Err(PreProposeOverruleError::SubdaoMisconfured {}); } if !check_if_subdao_legit(&subdao_address, &deps)? { - return Err(PreProposeOverruleError::ForbiddenSubdao {}) + return Err(PreProposeOverruleError::ForbiddenSubdao {}); } - if !check_is_proposal_timelocked(&Addr::unchecked(timelock_contract_addr.clone()), proposal_id, &deps)? { - return Err(PreProposeOverruleError::ProposalWrongState {}) + if !check_is_proposal_timelocked( + &Addr::unchecked(timelock_contract_addr.clone()), + proposal_id, + &deps, + )? { + return Err(PreProposeOverruleError::ProposalWrongState {}); } let overrule_msg = CosmosMsg::Wasm(WasmMsg::Execute { @@ -103,7 +103,8 @@ pub fn execute( }); let subdao_name = get_subdao_name(&subdao_address, &deps)?; - let prop_desc: String = format!("Reject the decision made by the {} subdao", subdao_name); + let prop_desc: String = + format!("Reject the decision made by the {} subdao", subdao_name); let prop_name: String = format!("Overrule proposal {} of {}", proposal_id, subdao_name); let internal_msg = ExecuteInternal::Propose { @@ -124,59 +125,70 @@ pub fn execute( } } -fn get_subdao_from_timelock(timelock_contract: &String, deps: &DepsMut) -> Result{ +fn get_subdao_from_timelock( + timelock_contract: &String, + deps: &DepsMut, +) -> Result { let timelock_config: TimelockConfig = deps - .querier - .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; + .querier + .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; Ok(timelock_config.subdao) } -fn get_timelock_from_subdao(subdao_core: &Addr, deps: &DepsMut) -> Result{ - let proposal_modules: Vec = deps - .querier - .query_wasm_smart(subdao_core, &SubdaoQueryMsg::ProposalModules { start_after: None, limit: Some(1) })?; +fn get_timelock_from_subdao( + subdao_core: &Addr, + deps: &DepsMut, +) -> Result { + let proposal_modules: Vec = deps.querier.query_wasm_smart( + subdao_core, + &SubdaoQueryMsg::ProposalModules { + start_after: None, + limit: Some(1), + }, + )?; - if proposal_modules.is_empty(){ - return Err(PreProposeOverruleError::SudaoMisconfured {}); + if proposal_modules.is_empty() { + return Err(PreProposeOverruleError::SubdaoMisconfured {}); } - let prop_policy: ProposalCreationPolicy = deps - .querier - .query_wasm_smart(proposal_modules.first().unwrap().address.clone(), &SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy{})?; + let prop_policy: ProposalCreationPolicy = deps.querier.query_wasm_smart( + proposal_modules.first().unwrap().address.clone(), + &SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {}, + )?; match prop_policy { - ProposalCreationPolicy::Anyone {} => { - Err(PreProposeOverruleError::SudaoMisconfured {}) - } + ProposalCreationPolicy::Anyone {} => Err(PreProposeOverruleError::SubdaoMisconfured {}), ProposalCreationPolicy::Module { addr } => { let timelock: Addr = deps .querier - .query_wasm_smart(addr, &SubdaoPreProposeQueryMsg::TimelockAddress{})?; + .query_wasm_smart(addr, &SubdaoPreProposeQueryMsg::TimelockAddress {})?; Ok(timelock) } } } -fn check_if_subdao_legit(subdao_core: &Addr, deps: &DepsMut) -> Result { +fn check_if_subdao_legit( + subdao_core: &Addr, + deps: &DepsMut, +) -> Result { let main_dao = get_main_dao_address(&deps)?; let mut start_after: Option<&SubDao> = None; let query_limit = 10; loop { - let query_msg_2 = MainDaoQueryMsg::ListSubDaos { - start_after: match start_after { - None => {None} - Some(a) => {Some(a.clone().addr)} + let subdao_list: Vec = deps.querier.query_wasm_smart( + main_dao.clone(), + &MainDaoQueryMsg::ListSubDaos { + start_after: match start_after { + None => None, + Some(a) => Some(a.clone().addr), + }, + limit: Some(query_limit), }, - limit: Some(query_limit), - }; - - let subdao_list: Vec = deps - .querier - .query_wasm_smart(main_dao.clone(), &query_msg_2)?; + )?; if subdao_list.is_empty() { - return Ok(false) + return Ok(false); } // start_after = subdao_list.last(); @@ -186,7 +198,7 @@ fn check_if_subdao_legit(subdao_core: &Addr, deps: &DepsMut) -> Result Result Result{ - let dao: Addr = deps - .querier - .query_wasm_smart(PrePropose::default().proposal_module.load(deps.storage)?, &DaoProposalQueryMsg::Dao {})?; +fn get_main_dao_address(deps: &DepsMut) -> Result { + let dao: Addr = deps.querier.query_wasm_smart( + PrePropose::default().proposal_module.load(deps.storage)?, + &DaoProposalQueryMsg::Dao {}, + )?; Ok(dao) } -fn check_is_proposal_timelocked(timelock: &Addr, proposal_id: u64, deps: &DepsMut) -> Result{ - let proposal: TimelockTypes::SingleChoiceProposal = deps +fn check_is_proposal_timelocked( + timelock: &Addr, + proposal_id: u64, + deps: &DepsMut, +) -> Result { + let proposal: TimelockTypes::SingleChoiceProposal = deps .querier .query_wasm_smart(timelock, &TimelockQueryMsg::Proposal { proposal_id })?; return Ok(proposal.status == TimelockTypes::ProposalStatus::Timelocked); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index d9878043..dc219ac7 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -14,7 +14,7 @@ pub enum PreProposeOverruleError { MessageUnsupported {}, #[error("Subdao is wrongly configured.")] - SudaoMisconfured {}, + SubdaoMisconfured {}, #[error("Subdao isn't in the list.")] ForbiddenSubdao {}, diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs index 3969bfbc..fb5ab0ac 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs @@ -3,7 +3,6 @@ extern crate core; pub mod contract; pub mod error; pub mod msg; -pub mod state; #[cfg(test)] pub mod testing; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs deleted file mode 100644 index ad89d9b2..00000000 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs +++ /dev/null @@ -1,9 +0,0 @@ -use cosmwasm_std::Addr; -use cw_storage_plus::{Item}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -// #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] -// pub struct Config {} -// -// pub const CONFIG: Item = Item::new("config_overrule"); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index e71e9c76..6f321512 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -3,18 +3,20 @@ use std::marker::PhantomData; // use crate::contract::{ // MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg, // }; +use crate::msg::{ + DaoProposalQueryMsg, MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, + TimelockConfig, TimelockQueryMsg, +}; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, }; -use cwd_pre_propose_base::msg::QueryMsg as PreProposeQuery; -use crate::msg::{DaoProposalQueryMsg, MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg}; -use neutron_subdao_core::msg::{QueryMsg as SubdaoQueryMsg, QueryMsg}; +use neutron_subdao_core::msg::QueryMsg as SubdaoQueryMsg; use neutron_subdao_core::types as SubdaoTypes; -use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; +use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; pub const MOCK_DAO_CORE: &str = "neutron1dao_core_contract"; pub const MOCK_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module"; @@ -68,12 +70,13 @@ impl WasmMockQuerier { if contract_addr == MOCK_DAO_CORE { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); return match q { - MainDaoQueryMsg::ListSubDaos { start_after: _, limit: _ } => { - SystemResult::Ok(ContractResult::from(to_binary(&vec![SubDao { - addr: MOCK_SUBDAO_CORE.to_string(), - charter: None, - }]))) - } + MainDaoQueryMsg::ListSubDaos { + start_after: _, + limit: _, + } => SystemResult::Ok(ContractResult::from(to_binary(&vec![SubDao { + addr: MOCK_SUBDAO_CORE.to_string(), + charter: None, + }]))), }; } if contract_addr == MOCK_TIMELOCK_CONTRACT { @@ -99,43 +102,50 @@ impl WasmMockQuerier { if contract_addr == MOCK_SUBDAO_CORE { let q: SubdaoQueryMsg = from_binary(msg).unwrap(); return match q { - SubdaoQueryMsg::ProposalModules { start_after: _, limit: _ } => { - SystemResult::Ok(ContractResult::from(to_binary(&vec![SubdaoTypes::ProposalModule { + SubdaoQueryMsg::ProposalModules { + start_after: _, + limit: _, + } => SystemResult::Ok(ContractResult::from(to_binary(&vec![ + SubdaoTypes::ProposalModule { address: Addr::unchecked(MOCK_DAO_PROPOSE_MODULE), prefix: "".to_string(), status: SubdaoTypes::ProposalModuleStatus::Enabled, - }]))) - } - SubdaoQueryMsg::Config {} => { - SystemResult::Ok(ContractResult::from(to_binary(&SubdaoTypes::Config { + }, + ]))), + SubdaoQueryMsg::Config {} => SystemResult::Ok(ContractResult::from( + to_binary(&SubdaoTypes::Config { name: SUBDAO_NAME.to_string(), description: "".to_string(), dao_uri: None, main_dao: Addr::unchecked(MOCK_DAO_CORE), security_dao: Addr::unchecked("111"), - }))) - } - _ => todo!() + }), + )), + _ => todo!(), }; } if contract_addr == MOCK_DAO_PROPOSE_MODULE { let q: SubdaoProposalMsg::QueryMsg = from_binary(msg).unwrap(); return match q { - SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy { } => { - SystemResult::Ok(ContractResult::from(to_binary(&cwd_voting::pre_propose::ProposalCreationPolicy::Module { - addr: Addr::unchecked(MOCK_SUBDAO_PREPROPOSE_MODULE) - }))) + SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {} => { + SystemResult::Ok(ContractResult::from(to_binary( + &cwd_voting::pre_propose::ProposalCreationPolicy::Module { + addr: Addr::unchecked(MOCK_SUBDAO_PREPROPOSE_MODULE), + }, + ))) } - _ => todo!() + _ => todo!(), }; } if contract_addr == MOCK_SUBDAO_PREPROPOSE_MODULE { let q: SubdaoPreProposeQueryMsg = from_binary(msg).unwrap(); return match q { - SubdaoPreProposeQueryMsg::TimelockAddress { } => { - SystemResult::Ok(ContractResult::from(to_binary(&Addr::unchecked(MOCK_TIMELOCK_CONTRACT)))) + SubdaoPreProposeQueryMsg::TimelockAddress {} => { + SystemResult::Ok(ContractResult::from(to_binary(&Addr::unchecked( + MOCK_TIMELOCK_CONTRACT, + )))) } - _ => todo!() + _ => todo!(), }; } SystemResult::Err(SystemError::NoSuchContract { diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 936f2d4c..1774d3cc 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -16,8 +16,8 @@ use crate::{ }; use crate::error::PreProposeOverruleError; +use crate::testing::mock_querier::SUBDAO_NAME; use cwd_pre_propose_base::state::Config; -use crate::testing::mock_querier::{MOCK_SUBDAO_CORE, SUBDAO_NAME}; pub fn init_base_contract(deps: DepsMut) { let msg = InstantiateMsg { @@ -45,7 +45,6 @@ fn test_create_overrule_proposal() { mock_info(PROPOSER_ADDR, &[]), msg, ); - println!("{:?}", res); assert!(res.is_ok()); let prop_desc: String = format!("Reject the decision made by the {} subdao", SUBDAO_NAME); let prop_name: String = format!("Overrule proposal {} of {}", PROPOSAL_ID, SUBDAO_NAME); From 794ac509f326bc93d9672f580a9063e2ea8fa9bf Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 14 Mar 2023 23:08:29 +0200 Subject: [PATCH 11/53] wip --- Cargo.lock | 1 + .../cwd-pre-propose-single-overrule/src/msg.rs | 14 +++----------- .../src/testing/mock_querier.rs | 9 +++++---- .../cwd-subdao-timelock-single/Cargo.toml | 1 + .../cwd-subdao-timelock-single/src/contract.rs | 16 ++++++++++++++-- .../src/types.rs | 7 +++---- 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a4aa021..cef9834c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -970,6 +970,7 @@ dependencies = [ "cwd-interface", "cwd-macros", "cwd-pre-propose-base", + "neutron-dao-pre-propose-overrule", "neutron-sdk", "neutron-subdao-core", "neutron-subdao-pre-propose-single", diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs index a105cd36..fb469ac8 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs @@ -1,18 +1,10 @@ use cosmwasm_std::{Addr, CosmosMsg, Timestamp}; use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; use neutron_bindings::bindings::msg::NeutronMsg; +use neutron_subdao_pre_propose_single::types::ProposeMessage; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum ProposeMessage { - ProposeOverrule { - timelock_contract: String, - proposal_id: u64, - }, -} - #[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] #[serde(rename_all = "snake_case")] pub enum TimelockExecuteMsg { @@ -111,7 +103,7 @@ pub struct TimelockConfig { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum DaoProposalQueryMsg { - Dao {} + Dao {}, } -// EXTERNAL TYPES SECTION END \ No newline at end of file +// EXTERNAL TYPES SECTION END diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 6f321512..6e23eaa0 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -19,6 +19,7 @@ use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; pub const MOCK_DAO_CORE: &str = "neutron1dao_core_contract"; +pub const MOCK_DAO_CORE_MANY_SUBDAOS: &str = "neutron1dao_core_contract_many_subdaos"; pub const MOCK_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module"; pub const MOCK_SUBDAO_PREPROPOSE_MODULE: &str = "neutron1subdao_prepropose_module"; pub const MOCK_DAO_PROPOSE_MODULE: &str = "neutron1propose_module"; @@ -118,10 +119,10 @@ impl WasmMockQuerier { description: "".to_string(), dao_uri: None, main_dao: Addr::unchecked(MOCK_DAO_CORE), - security_dao: Addr::unchecked("111"), + security_dao: Addr::unchecked(""), }), )), - _ => todo!(), + _ => SystemResult::Err(SystemError::Unknown {}), }; } if contract_addr == MOCK_DAO_PROPOSE_MODULE { @@ -134,7 +135,7 @@ impl WasmMockQuerier { }, ))) } - _ => todo!(), + _ => SystemResult::Err(SystemError::Unknown {}), }; } if contract_addr == MOCK_SUBDAO_PREPROPOSE_MODULE { @@ -145,7 +146,7 @@ impl WasmMockQuerier { MOCK_TIMELOCK_CONTRACT, )))) } - _ => todo!(), + _ => SystemResult::Err(SystemError::Unknown {}), }; } SystemResult::Err(SystemError::NoSuchContract { diff --git a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml index 51f1c4e2..29bccc3a 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml +++ b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml @@ -32,6 +32,7 @@ neutron-subdao-pre-propose-single = { path = "../../../packages/neutron-subdao-p neutron-subdao-timelock-single = { path = "../../../packages/neutron-subdao-timelock-single" } cwd-pre-propose-base = { path = "../../../packages/cwd-pre-propose-base" } neutron-subdao-core = { path = "../../../packages/neutron-subdao-core" } +neutron-dao-pre-propose-overrule = { path = "../../../packages/neutron-dao-pre-propose-overrule" } [dev-dependencies] cosmwasm-schema = { version = "1.0.0" } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 05aed561..a3c6af85 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -2,12 +2,14 @@ use cosmwasm_std::entry_point; use cosmwasm_std::{ to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Reply, Response, - StdResult, SubMsg, + StdResult, SubMsg, WasmMsg, }; use cw2::set_contract_version; use cw_storage_plus::Bound; use cwd_pre_propose_base::msg::QueryMsg as PreProposeQueryBase; use neutron_bindings::bindings::msg::NeutronMsg; +use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; +use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; @@ -99,9 +101,19 @@ pub fn execute_timelock_proposal( PROPOSALS.save(deps.storage, proposal_id, &proposal)?; - // todo!(oldremez) send overrule creation proposal message + let create_overrule_proposal = WasmMsg::Execute { + contract_addr: todo!(oldremes), + msg: to_binary(&OverruleExecuteMsg::Propose { + msg: OverruleProposeMessage::ProposeOverrule { + timelock_contract: env.contract.address.to_string(), + proposal_id, + }, + })?, + funds: vec![], + }; Ok(Response::default() + .add_message(create_overrule_proposal) .add_attribute("action", "timelock_proposal") .add_attribute("sender", info.sender) .add_attribute("proposal_id", proposal_id.to_string()) diff --git a/packages/neutron-dao-pre-propose-overrule/src/types.rs b/packages/neutron-dao-pre-propose-overrule/src/types.rs index e5f10708..beebd85b 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/types.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/types.rs @@ -6,9 +6,8 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] #[serde(rename_all = "snake_case")] pub enum ProposeMessage { - Propose { - title: String, - description: String, - msgs: Vec>, + ProposeOverrule { + timelock_contract: String, + proposal_id: u64, }, } From 7b66d5f67ee5afc2227f8a7f8a047fee293192bd Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Wed, 15 Mar 2023 21:45:12 +0200 Subject: [PATCH 12/53] huge refactoring, overrule creation added, more tests --- Cargo.lock | 8 ++ .../Cargo.toml | 3 + .../src/contract.rs | 77 +++++++++---- .../src/error.rs | 3 + .../src/lib.rs | 2 +- .../src/msg.rs | 109 ------------------ .../src/state.rs | 4 + .../src/testing/mock_querier.rs | 44 ++++--- .../src/testing/tests.rs | 70 ++++++++++- .../src/contract.rs | 57 +++++++-- .../cwd-subdao-timelock-single/src/error.rs | 3 + .../src/testing/mock_querier.rs | 1 + .../Cargo.toml | 6 + .../src/msg.rs | 34 +++--- .../neutron-subdao-timelock-single/Cargo.toml | 3 +- .../neutron-subdao-timelock-single/src/msg.rs | 41 ++++++- .../src/types.rs | 2 +- 17 files changed, 276 insertions(+), 191 deletions(-) delete mode 100644 contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs create mode 100644 contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs diff --git a/Cargo.lock b/Cargo.lock index cef9834c..3304aeaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -740,6 +740,7 @@ dependencies = [ "cwd-proposal-hooks", "cwd-proposal-single", "cwd-voting", + "neutron-dao-pre-propose-overrule", "neutron-sdk", "neutron-subdao-core", "neutron-subdao-pre-propose-single", @@ -1297,12 +1298,18 @@ name = "neutron-dao-pre-propose-overrule" version = "0.1.0" dependencies = [ "cosmwasm-std", + "cwd-core", "cwd-interface", "cwd-pre-propose-base", "cwd-voting", "neutron-sdk", + "neutron-subdao-core", + "neutron-subdao-pre-propose-single", + "neutron-subdao-proposal-single", + "neutron-subdao-timelock-single", "schemars", "serde", + "thiserror", ] [[package]] @@ -1413,6 +1420,7 @@ name = "neutron-subdao-timelock-single" version = "0.1.0" dependencies = [ "cosmwasm-std", + "cw-utils 0.13.4", "neutron-sdk", "schemars", "serde", diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml index cb057a59..f9660ced 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml @@ -26,9 +26,12 @@ neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron- schemars = "0.8.8" thiserror = { version = "1.0.31" } neutron-subdao-core = { version = "*", path = "../../../../packages/neutron-subdao-core" } +cwd-core = { version = "*", path = "../../../../contracts/dao/cwd-core" } neutron-subdao-timelock-single = { version = "*", path = "../../../../packages/neutron-subdao-timelock-single" } neutron-subdao-proposal-single = { version = "*", path = "../../../../packages/neutron-subdao-proposal-single" } neutron-subdao-pre-propose-single = { version = "*", path = "../../../../packages/neutron-subdao-pre-propose-single" } +neutron-dao-pre-propose-overrule = { version = "*", path = "../../../../packages/neutron-dao-pre-propose-overrule" } +cwd-proposal-single = { version = "*", path = "../../../../contracts/dao/proposal/cwd-proposal-single" } [dev-dependencies] cosmwasm-schema = "1.0.0" diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 7f02f954..00f760f4 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -8,9 +8,8 @@ use cw2::set_contract_version; use error::PreProposeOverruleError; use crate::error; -use crate::msg::{ - DaoProposalQueryMsg, ExecuteMsg, InstantiateMsg, MainDaoQueryMsg, ProposeMessage, - ProposeMessageInternal, QueryMsg, SubDao, TimelockConfig, TimelockExecuteMsg, TimelockQueryMsg, +use neutron_dao_pre_propose_overrule::msg::{ + ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, }; // use crate::state::{Config, CONFIG}; use cwd_pre_propose_base::{ @@ -19,12 +18,17 @@ use cwd_pre_propose_base::{ state::PreProposeContract, }; +use crate::state::PROPOSALS; +use cwd_core::{msg::QueryMsg as MainDaoQueryMsg, query::SubDao}; +use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; use cwd_voting::pre_propose::ProposalCreationPolicy; -use neutron_subdao_core::msg::QueryMsg as SubdaoQueryMsg; -use neutron_subdao_core::types as SubdaoTypes; -use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; +use neutron_dao_pre_propose_overrule::types::ProposeMessage; +use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; +use neutron_subdao_pre_propose_single::{ + msg::QueryMsg as SubdaoPreProposeQueryMsg, types::ProposeMessage as SubdaoPreProposeMessage, +}; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; -use neutron_subdao_timelock_single::types as TimelockTypes; +use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -77,32 +81,39 @@ pub fn execute( } => { let timelock_contract_addr = deps.api.addr_validate(&timelock_contract)?; - let subdao_address = get_subdao_from_timelock(&timelock_contract, &deps)?; + if PROPOSALS + .load(deps.storage, (proposal_id, timelock_contract_addr.clone())) + .is_ok() + { + return Err(PreProposeOverruleError::AlreadyExists {}); + } + + let subdao_address = get_subdao_from_timelock(&deps, &timelock_contract)?; // we need this check since the timelock contract might be an impostor - if get_timelock_from_subdao(&subdao_address, &deps)? != timelock_contract { + if get_timelock_from_subdao(&deps, &subdao_address)? != timelock_contract { return Err(PreProposeOverruleError::SubdaoMisconfured {}); } - if !check_if_subdao_legit(&subdao_address, &deps)? { + if !check_if_subdao_legit(&deps, &subdao_address)? { return Err(PreProposeOverruleError::ForbiddenSubdao {}); } if !check_is_proposal_timelocked( + &deps, &Addr::unchecked(timelock_contract_addr.clone()), proposal_id, - &deps, )? { return Err(PreProposeOverruleError::ProposalWrongState {}); } let overrule_msg = CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: timelock_contract_addr.to_string(), - msg: to_binary(&TimelockExecuteMsg::OverruleProposal { proposal_id })?, + msg: to_binary(&TimelockMsg::ExecuteMsg::OverruleProposal { proposal_id })?, funds: vec![], }); - let subdao_name = get_subdao_name(&subdao_address, &deps)?; + let subdao_name = get_subdao_name(&deps, &subdao_address)?; let prop_desc: String = format!("Reject the decision made by the {} subdao", subdao_name); let prop_name: String = format!("Overrule proposal {} of {}", proposal_id, subdao_name); @@ -117,6 +128,14 @@ pub fn execute( }, }; + let next_proposal_id = &get_next_proposal_id(&deps)?; + + PROPOSALS.save( + deps.storage, + (proposal_id, timelock_contract_addr.clone()), + next_proposal_id, + )?; + PrePropose::default() .execute(deps, env, info, internal_msg) .map_err(|e| PreProposeOverruleError::PreProposeBase(e)) @@ -126,23 +145,26 @@ pub fn execute( } fn get_subdao_from_timelock( - timelock_contract: &String, deps: &DepsMut, + timelock_contract: &String, ) -> Result { - let timelock_config: TimelockConfig = deps - .querier - .query_wasm_smart(timelock_contract.to_string(), &TimelockQueryMsg::Config {})?; + let timelock_config: TimelockTypes::Config = deps.querier.query_wasm_smart( + timelock_contract.to_string(), + &TimelockMsg::QueryMsg::Config {}, + )?; Ok(timelock_config.subdao) } fn get_timelock_from_subdao( - subdao_core: &Addr, deps: &DepsMut, + subdao_core: &Addr, ) -> Result { let proposal_modules: Vec = deps.querier.query_wasm_smart( subdao_core, &SubdaoQueryMsg::ProposalModules { start_after: None, + // we assume any subdao proposal module has pre-propose module with timelock + // thus, we need only single module limit: Some(1), }, )?; @@ -155,6 +177,7 @@ fn get_timelock_from_subdao( proposal_modules.first().unwrap().address.clone(), &SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {}, )?; + match prop_policy { ProposalCreationPolicy::Anyone {} => Err(PreProposeOverruleError::SubdaoMisconfured {}), ProposalCreationPolicy::Module { addr } => { @@ -167,8 +190,8 @@ fn get_timelock_from_subdao( } fn check_if_subdao_legit( - subdao_core: &Addr, deps: &DepsMut, + subdao_core: &Addr, ) -> Result { let main_dao = get_main_dao_address(&deps)?; @@ -210,23 +233,31 @@ fn check_if_subdao_legit( fn get_main_dao_address(deps: &DepsMut) -> Result { let dao: Addr = deps.querier.query_wasm_smart( PrePropose::default().proposal_module.load(deps.storage)?, - &DaoProposalQueryMsg::Dao {}, + &ProposalSingleQueryMsg::Dao {}, )?; Ok(dao) } +fn get_next_proposal_id(deps: &DepsMut) -> Result { + let last_proposal_id: u64 = deps.querier.query_wasm_smart( + PrePropose::default().proposal_module.load(deps.storage)?, + &ProposalSingleQueryMsg::ProposalCount {}, + )?; + Ok(last_proposal_id + 1) +} + fn check_is_proposal_timelocked( + deps: &DepsMut, timelock: &Addr, proposal_id: u64, - deps: &DepsMut, ) -> Result { let proposal: TimelockTypes::SingleChoiceProposal = deps .querier - .query_wasm_smart(timelock, &TimelockQueryMsg::Proposal { proposal_id })?; + .query_wasm_smart(timelock, &TimelockMsg::QueryMsg::Proposal { proposal_id })?; return Ok(proposal.status == TimelockTypes::ProposalStatus::Timelocked); } -fn get_subdao_name(subdao: &Addr, deps: &DepsMut) -> Result { +fn get_subdao_name(deps: &DepsMut, subdao: &Addr) -> Result { let subdao_config: SubdaoTypes::Config = deps .querier .query_wasm_smart(subdao, &SubdaoQueryMsg::Config {})?; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index dc219ac7..72ebae4c 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -21,4 +21,7 @@ pub enum PreProposeOverruleError { #[error("")] ProposalWrongState {}, + + #[error("")] + AlreadyExists {}, } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs index fb5ab0ac..e307217b 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs @@ -2,7 +2,7 @@ extern crate core; pub mod contract; pub mod error; -pub mod msg; +pub mod state; #[cfg(test)] pub mod testing; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs deleted file mode 100644 index fb469ac8..00000000 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/msg.rs +++ /dev/null @@ -1,109 +0,0 @@ -use cosmwasm_std::{Addr, CosmosMsg, Timestamp}; -use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; -use neutron_bindings::bindings::msg::NeutronMsg; -use neutron_subdao_pre_propose_single::types::ProposeMessage; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum TimelockExecuteMsg { - OverruleProposal { proposal_id: u64 }, -} - -pub type ExecuteMsg = ExecuteBase; -pub type QueryMsg = QueryBase; - -#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub struct InstantiateMsg { - pub main_dao: String, -} - -/// Internal version of the propose message that includes the -/// `proposer` field. The module will fill this in based on the sender -/// of the external message. -#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum ProposeMessageInternal { - Propose { - title: String, - description: String, - msgs: Vec>, - proposer: Option, - }, -} - -// EXTERNAL TYPES SECTION BEGIN - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum MainDaoQueryMsg { - ListSubDaos { - start_after: Option, - limit: Option, - }, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -pub struct SubDao { - /// The contract address of the SubDAO - pub addr: String, - /// The purpose/constitution for the SubDAO - pub charter: Option, -} - -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum TimelockQueryMsg { - /// Gets the config. Returns `state::Config`. - Config {}, - - /// Gets information about a proposal. Returns - /// `proposals::Proposal`. - Proposal { proposal_id: u64 }, -} - -#[derive(Serialize, Deserialize, Clone, JsonSchema, Debug, Eq, PartialEq)] -pub struct SingleChoiceProposal { - /// The ID of the proposal being returned. - pub id: u64, - - /// The timestamp at which the proposal was submitted to the timelock contract. - pub timelock_ts: Timestamp, - - /// The messages that will be executed should this proposal be executed. - pub msgs: Vec>, - - pub status: ProposalStatus, -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Copy)] -#[serde(rename_all = "snake_case")] -#[repr(u8)] -pub enum ProposalStatus { - /// The proposal is open for voting. - Timelocked, - /// The proposal has been overruled. - Overruled, - /// The proposal has been executed. - Executed, - /// The proposal's execution failed. - ExecutionFailed, -} - -#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] -pub struct TimelockConfig { - pub owner: Addr, - pub timelock_duration: u64, - // subDAO core module can timelock proposals. - pub subdao: Addr, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum DaoProposalQueryMsg { - Dao {}, -} - -// EXTERNAL TYPES SECTION END diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs new file mode 100644 index 00000000..76c76d49 --- /dev/null +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/state.rs @@ -0,0 +1,4 @@ +use cosmwasm_std::Addr; +use cw_storage_plus::Map; + +pub const PROPOSALS: Map<(u64, Addr), u64> = Map::new("overrule_proposals"); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 6e23eaa0..2813160f 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -3,20 +3,23 @@ use std::marker::PhantomData; // use crate::contract::{ // MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg, // }; -use crate::msg::{ - DaoProposalQueryMsg, MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, - TimelockConfig, TimelockQueryMsg, -}; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, }; -use neutron_subdao_core::msg::QueryMsg as SubdaoQueryMsg; -use neutron_subdao_core::types as SubdaoTypes; +use cwd_core::{msg::QueryMsg as MainDaoQueryMsg, query::SubDao}; +use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; + +use neutron_dao_pre_propose_overrule::msg::{ + ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, +}; +use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; +use neutron_subdao_timelock_single::types::{ProposalStatus, SingleChoiceProposal}; +use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; pub const MOCK_DAO_CORE: &str = "neutron1dao_core_contract"; pub const MOCK_DAO_CORE_MANY_SUBDAOS: &str = "neutron1dao_core_contract_many_subdaos"; @@ -62,11 +65,16 @@ impl WasmMockQuerier { match &request { QueryRequest::Wasm(WasmQuery::Smart { contract_addr, msg }) => { if contract_addr == MOCK_SUBDAO_PROPOSE_MODULE { - let q: DaoProposalQueryMsg = from_binary(msg).unwrap(); - let addr = match q { - DaoProposalQueryMsg::Dao {} => MOCK_DAO_CORE, + let q: ProposalSingleQueryMsg = from_binary(msg).unwrap(); + return match q { + ProposalSingleQueryMsg::Dao {} => { + SystemResult::Ok(ContractResult::from(to_binary(MOCK_DAO_CORE))) + } + ProposalSingleQueryMsg::ProposalCount {} => { + SystemResult::Ok(ContractResult::from(to_binary(&(0 as u64)))) + } + _ => SystemResult::Err(SystemError::Unknown {}), }; - return SystemResult::Ok(ContractResult::from(to_binary(addr))); } if contract_addr == MOCK_DAO_CORE { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); @@ -78,19 +86,20 @@ impl WasmMockQuerier { addr: MOCK_SUBDAO_CORE.to_string(), charter: None, }]))), + _ => SystemResult::Err(SystemError::Unknown {}), }; } if contract_addr == MOCK_TIMELOCK_CONTRACT { - let q: TimelockQueryMsg = from_binary(msg).unwrap(); + let q: TimelockMsg::QueryMsg = from_binary(msg).unwrap(); return match q { - TimelockQueryMsg::Config {} => { - SystemResult::Ok(ContractResult::from(to_binary(&TimelockConfig { + TimelockMsg::QueryMsg::Config {} => SystemResult::Ok(ContractResult::from( + to_binary(&TimelockTypes::Config { owner: Addr::unchecked(MOCK_DAO_CORE), - timelock_duration: 0, + overrule_pre_propose: Addr::unchecked(""), subdao: Addr::unchecked(MOCK_SUBDAO_CORE), - }))) - } - TimelockQueryMsg::Proposal { proposal_id } => SystemResult::Ok( + }), + )), + TimelockMsg::QueryMsg::Proposal { proposal_id } => SystemResult::Ok( ContractResult::from(to_binary(&SingleChoiceProposal { id: proposal_id, timelock_ts: Default::default(), @@ -98,6 +107,7 @@ impl WasmMockQuerier { status: ProposalStatus::Timelocked, })), ), + _ => SystemResult::Err(SystemError::Unknown {}), }; } if contract_addr == MOCK_SUBDAO_CORE { diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 1774d3cc..d5e0d0de 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -1,23 +1,24 @@ use cosmwasm_std::{ from_binary, testing::{mock_env, mock_info}, - to_binary, CosmosMsg, DepsMut, Empty, SubMsg, WasmMsg, + to_binary, CosmosMsg, DepsMut, Empty, Response, SubMsg, WasmMsg, }; use crate::{ contract::{execute, instantiate, query}, - msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessage, ProposeMessageInternal, QueryMsg, - TimelockExecuteMsg, - }, testing::mock_querier::{ mock_dependencies, MOCK_DAO_CORE, MOCK_SUBDAO_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT, }, }; +use neutron_dao_pre_propose_overrule::msg::{ + ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, +}; use crate::error::PreProposeOverruleError; use crate::testing::mock_querier::SUBDAO_NAME; use cwd_pre_propose_base::state::Config; +use neutron_dao_pre_propose_overrule::types::ProposeMessage; +use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; pub fn init_base_contract(deps: DepsMut) { let msg = InstantiateMsg { @@ -45,6 +46,7 @@ fn test_create_overrule_proposal() { mock_info(PROPOSER_ADDR, &[]), msg, ); + println!("{:?}", res); assert!(res.is_ok()); let prop_desc: String = format!("Reject the decision made by the {} subdao", SUBDAO_NAME); let prop_name: String = format!("Overrule proposal {} of {}", PROPOSAL_ID, SUBDAO_NAME); @@ -57,7 +59,7 @@ fn test_create_overrule_proposal() { description: prop_desc, msgs: vec![CosmosMsg::Wasm(WasmMsg::Execute { contract_addr: MOCK_TIMELOCK_CONTRACT.to_string(), - msg: to_binary(&TimelockExecuteMsg::OverruleProposal { + msg: to_binary(&TimelockMsg::ExecuteMsg::OverruleProposal { proposal_id: PROPOSAL_ID }) .unwrap(), @@ -106,3 +108,59 @@ fn test_base_prepropose_methods() { PreProposeOverruleError::MessageUnsupported {} ) } + +#[test] +fn test_impostor_subdao() { + // test where timelock contract returns subdao that is not in list +} + +#[test] +fn test_impostor_timelock() { + // test where timelock points to subdao but subdao doesn't point to timelock +} + +#[test] +fn test_proposal_is_not_timelocked() { + // test where the proposal we're to create overrule for isn't timelocked already/yet +} + +#[test] +fn test_long_subdao_list() { + // test where we check if out pagination handling works properly +} + +#[test] +fn test_double_creation() { + let mut deps = mock_dependencies(); + init_base_contract(deps.as_mut()); + const PROPOSAL_ID: u64 = 47; + const PROPOSER_ADDR: &str = "whatever"; + let msg = ExecuteMsg::Propose { + msg: ProposeMessage::ProposeOverrule { + timelock_contract: MOCK_TIMELOCK_CONTRACT.to_string(), + proposal_id: PROPOSAL_ID, + }, + }; + let res_ok = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg.clone(), + ); + assert!(res_ok.is_ok()); + let res_not_ok = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg, + ); + assert!(res_not_ok.is_err()); + match res_not_ok { + Ok(_) => { + assert!(false) + } + Err(err) => { + assert_eq!(err, PreProposeOverruleError::AlreadyExists {}) + } + } +} diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index a3c6af85..024b1c34 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -6,16 +6,21 @@ use cosmwasm_std::{ }; use cw2::set_contract_version; use cw_storage_plus::Bound; +use cw_utils::{Duration, Threshold}; use cwd_pre_propose_base::msg::QueryMsg as PreProposeQueryBase; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; +use neutron_dao_pre_propose_overrule::msg::QueryMsg as OverruleQueryMsg; use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; -use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; +use neutron_subdao_timelock_single::msg::{ + ExecuteMsg, InstantiateMsg, MigrateMsg, ProposalConfig, QueryMsg, +}; use neutron_subdao_timelock_single::types::{ Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, }; +use std::ops::Add; use crate::error::ContractError; use crate::state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}; @@ -41,9 +46,11 @@ pub fn instantiate( .querier .query_wasm_smart(subdao_core.clone(), &SubdaoQuery::MainDao {})?; + let overrule_pre_propose = deps.api.addr_validate(&msg.overrule_pre_propose)?; + let config = Config { owner: main_dao, - timelock_duration: msg.timelock_duration, + overrule_pre_propose, subdao: subdao_core, }; @@ -52,7 +59,10 @@ pub fn instantiate( Ok(Response::new() .add_attribute("action", "instantiate") .add_attribute("owner", config.owner) - .add_attribute("timelock_duration", config.timelock_duration.to_string())) + .add_attribute( + "overrule_pre_propose", + config.overrule_pre_propose.to_string(), + )) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -74,8 +84,8 @@ pub fn execute( } ExecuteMsg::UpdateConfig { owner, - timelock_duration, - } => execute_update_config(deps, info, owner, timelock_duration), + overrule_pre_propose, + } => execute_update_config(deps, info, owner, overrule_pre_propose), } } @@ -102,7 +112,7 @@ pub fn execute_timelock_proposal( PROPOSALS.save(deps.storage, proposal_id, &proposal)?; let create_overrule_proposal = WasmMsg::Execute { - contract_addr: todo!(oldremes), + contract_addr: config.overrule_pre_propose.to_string(), msg: to_binary(&OverruleExecuteMsg::Propose { msg: OverruleProposeMessage::ProposeOverrule { timelock_contract: env.contract.address.to_string(), @@ -112,6 +122,8 @@ pub fn execute_timelock_proposal( funds: vec![], }; + // NOTE: we don't handle an error that might appear during overrule proposal creation. + // Thus, we expect for proposal to get execution error status on proposal module level. Ok(Response::default() .add_message(create_overrule_proposal) .add_attribute("action", "timelock_proposal") @@ -137,8 +149,10 @@ pub fn execute_execute_proposal( }); } + let timelock_duration = get_timelock_duration(&config.overrule_pre_propose, &deps)?; + // Check if timelock has passed - if env.block.time.seconds() < (config.timelock_duration + proposal.timelock_ts.seconds()) { + if env.block.time.seconds() < (timelock_duration + proposal.timelock_ts.seconds()) { return Err(ContractError::TimeLocked {}); } @@ -196,7 +210,7 @@ pub fn execute_update_config( deps: DepsMut, info: MessageInfo, new_owner: Option, - new_timelock_duration: Option, + new_overrule_pre_propose: Option, ) -> Result, ContractError> { let mut config: Config = CONFIG.load(deps.storage)?; if info.sender != config.owner { @@ -211,8 +225,8 @@ pub fn execute_update_config( config.owner = owner; } - if let Some(timelock_duration) = new_timelock_duration { - config.timelock_duration = timelock_duration; + if let Some(overrule_pre_propose) = new_overrule_pre_propose { + config.overrule_pre_propose = deps.api.addr_validate(&overrule_pre_propose)?; } // TODO(oopcode): implement updating the .sudbao parameter. @@ -221,7 +235,10 @@ pub fn execute_update_config( Ok(Response::new() .add_attribute("action", "update_config") .add_attribute("owner", config.owner) - .add_attribute("timelock_duration", config.timelock_duration.to_string())) + .add_attribute( + "overrule_pre_propose", + config.overrule_pre_propose.to_string(), + )) } #[cfg_attr(not(feature = "library"), entry_point)] @@ -265,6 +282,24 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result Result { + let propose: Addr = deps.querier.query_wasm_smart( + overrule_pre_propose, + &OverruleQueryMsg::QueryBase(PreProposeQueryBase::ProposalModule {}), + )?; + let config: ProposalConfig = deps.querier.query_wasm_smart( + overrule_pre_propose, + &OverruleQueryMsg::QueryBase(PreProposeQueryBase::ProposalModule {}), + )?; + match config.max_voting_period { + Duration::Height(_) => Err(ContractError::CantCreateOverrule {}), + Duration::Time(duration) => Ok(duration), + } +} + #[cfg_attr(not(feature = "library"), entry_point)] pub fn reply(deps: DepsMut, _env: Env, msg: Reply) -> Result { let proposal_id = msg.id; diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/error.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/error.rs index 404644cc..7d508820 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/error.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/error.rs @@ -20,4 +20,7 @@ pub enum ContractError { #[error("no such proposal ({id})")] NoSuchProposal { id: u64 }, + + #[error("Can not create overrule proposal for main DAO")] + CantCreateOverrule {}, } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index ac5b2d53..e3ea74a9 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -12,6 +12,7 @@ use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; pub const MOCK_SUBDAO_CORE_ADDR: &str = "neutron1subdao_core_contract"; pub const MOCK_TIMELOCK_INITIALIZER: &str = "neutron1timelock_initializer"; pub const MOCK_MAIN_DAO_ADDR: &str = "neutron1main_dao_core_contract"; +pub const MOCK_OVERRULE_PREPROPOSAL: &str = "neutron1main_dao_overrule_preproposal"; pub fn mock_dependencies() -> OwnedDeps { let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[])); diff --git a/packages/neutron-dao-pre-propose-overrule/Cargo.toml b/packages/neutron-dao-pre-propose-overrule/Cargo.toml index 28f8ff8b..3ebf7989 100644 --- a/packages/neutron-dao-pre-propose-overrule/Cargo.toml +++ b/packages/neutron-dao-pre-propose-overrule/Cargo.toml @@ -16,3 +16,9 @@ cosmwasm-std = "1.0.0" neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron-org/neutron-sdk.git", rev = "c19b40c024eeaa8733af9ddee94a52798d78f469" } cwd-voting = { path = "../cwd-voting" } cwd-interface = { path = "../cwd-interface" } +thiserror = { version = "1.0.31" } +neutron-subdao-core = { version = "*", path = "../neutron-subdao-core" } +cwd-core = { version = "*", path = "../../contracts/dao/cwd-core" } +neutron-subdao-timelock-single = { version = "*", path = "../neutron-subdao-timelock-single" } +neutron-subdao-proposal-single = { version = "*", path = "../neutron-subdao-proposal-single" } +neutron-subdao-pre-propose-single = { version = "*", path = "../neutron-subdao-pre-propose-single" } diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs index c2fb3899..0bd76f9b 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/msg.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -1,31 +1,31 @@ use crate::types::ProposeMessage; +use cosmwasm_std::{Addr, CosmosMsg, Timestamp}; use cwd_interface::ModuleInstantiateInfo; use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; use cwd_voting::deposit::UncheckedDepositInfo; +use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +pub type ExecuteMsg = ExecuteBase; +pub type QueryMsg = QueryBase; + #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct InstantiateMsg { - /// Information about the deposit requirements for this - /// module. None if no deposit. - pub deposit_info: Option, - /// If false, only members (addresses with voting power) may create - /// proposals in the DAO. Otherwise, any address may create a - /// proposal so long as they pay the deposit. - pub open_proposal_submission: bool, - - /// Instantiate information for timelock module. - pub timelock_module_instantiate_info: ModuleInstantiateInfo, + pub main_dao: String, } -pub type ExecuteMsg = ExecuteBase; - -#[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] +/// Internal version of the propose message that includes the +/// `proposer` field. The module will fill this in based on the sender +/// of the external message. +#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] #[serde(rename_all = "snake_case")] -pub enum QueryMsg { - QueryBase(QueryBase), - /// Gets the address of the timelock contract. - TimelockAddress {}, +pub enum ProposeMessageInternal { + Propose { + title: String, + description: String, + msgs: Vec>, + proposer: Option, + }, } diff --git a/packages/neutron-subdao-timelock-single/Cargo.toml b/packages/neutron-subdao-timelock-single/Cargo.toml index d6a3e9eb..86107ae8 100644 --- a/packages/neutron-subdao-timelock-single/Cargo.toml +++ b/packages/neutron-subdao-timelock-single/Cargo.toml @@ -9,4 +9,5 @@ edition = "2021" neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron-org/neutron-sdk.git", rev = "c19b40c024eeaa8733af9ddee94a52798d78f469" } cosmwasm-std = { version = "1.0.0" } schemars = "0.8" -serde = { version = "1.0.147", default-features = false, features = ["derive"] } \ No newline at end of file +serde = { version = "1.0.147", default-features = false, features = ["derive"] } +cw-utils = "0.13" diff --git a/packages/neutron-subdao-timelock-single/src/msg.rs b/packages/neutron-subdao-timelock-single/src/msg.rs index 29cb8b25..2a532906 100644 --- a/packages/neutron-subdao-timelock-single/src/msg.rs +++ b/packages/neutron-subdao-timelock-single/src/msg.rs @@ -1,13 +1,13 @@ -use cosmwasm_std::CosmosMsg; +use cosmwasm_std::{Addr, CosmosMsg}; +use cw_utils::{Duration, Threshold}; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] pub struct InstantiateMsg { - // Timelock duration for all proposals (starts when TimelockProposal message handler is executed). - // In seconds. - pub timelock_duration: u64, + // Overrule pre proposal module from the main DAO + pub overrule_pre_propose: String, } #[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] @@ -25,7 +25,7 @@ pub enum ExecuteMsg { }, UpdateConfig { owner: Option, - timelock_duration: Option, + overrule_pre_propose: Option, }, } @@ -55,3 +55,34 @@ pub enum QueryMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct MigrateMsg {} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct ProposalConfig { + /// 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, + /// 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, + /// The address of the DAO that this governance module is + /// associated with. + pub dao: Addr, + /// If set to true proposals will be closed if their execution + /// fails. Otherwise, proposals will remain open after execution + /// failure. For example, with this enabled a proposal to send 5 + /// tokens out of a DAO's treasury with 4 tokens would be closed when + /// it is executed. With this disabled, that same proposal would + /// remain open until the DAO's treasury was large enough for it to be + /// executed. + pub close_proposal_on_execution_failure: bool, +} diff --git a/packages/neutron-subdao-timelock-single/src/types.rs b/packages/neutron-subdao-timelock-single/src/types.rs index f3181dab..f451751e 100644 --- a/packages/neutron-subdao-timelock-single/src/types.rs +++ b/packages/neutron-subdao-timelock-single/src/types.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] pub struct Config { pub owner: Addr, - pub timelock_duration: u64, + pub overrule_pre_propose: Addr, // subDAO core module can timelock proposals. pub subdao: Addr, } From d3bb5c1dfd40cc0c87465bd36660df0023131ef3 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 16 Mar 2023 18:01:38 +0200 Subject: [PATCH 13/53] massive unit tests refactoring --- .../src/contract.rs | 19 +- .../src/testing/mock_querier.rs | 390 +++++++++++++----- .../src/testing/tests.rs | 121 +++++- .../src/msg.rs | 4 +- .../src/types.rs | 2 - 5 files changed, 400 insertions(+), 136 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 00f760f4..ee0d2193 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -24,9 +24,7 @@ use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; use cwd_voting::pre_propose::ProposalCreationPolicy; use neutron_dao_pre_propose_overrule::types::ProposeMessage; use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; -use neutron_subdao_pre_propose_single::{ - msg::QueryMsg as SubdaoPreProposeQueryMsg, types::ProposeMessage as SubdaoPreProposeMessage, -}; +use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; @@ -163,7 +161,7 @@ fn get_timelock_from_subdao( subdao_core, &SubdaoQueryMsg::ProposalModules { start_after: None, - // we assume any subdao proposal module has pre-propose module with timelock + // we assume any subdao proposal module has pre-propose module with timelock. // thus, we need only single module limit: Some(1), }, @@ -198,11 +196,12 @@ fn check_if_subdao_legit( let mut start_after: Option<&SubDao> = None; let query_limit = 10; + // unfortunately, there is no way to get the total subdao number so we do infinite loop here loop { let subdao_list: Vec = deps.querier.query_wasm_smart( main_dao.clone(), &MainDaoQueryMsg::ListSubDaos { - start_after: match start_after { + start_after: match start_after.clone() { None => None, Some(a) => Some(a.clone().addr), }, @@ -214,19 +213,19 @@ fn check_if_subdao_legit( return Ok(false); } - // start_after = subdao_list.last(); + start_after = subdao_list.last(); if subdao_list .into_iter() - .find(|x1| x1.addr == subdao_core.clone().into_string()) + .find(|subdao| subdao.addr == subdao_core.clone().into_string()) .is_some() { return Ok(true); }; - // if subdao_list.len() < query_limit as usize { - // return Ok(false) - // } + if subdao_list.len() < query_limit as usize { + return Ok(false); + } } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 2813160f..3a34200f 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::marker::PhantomData; // use crate::contract::{ @@ -6,32 +7,47 @@ use std::marker::PhantomData; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, - to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, - SystemError, SystemResult, WasmQuery, + to_binary, Addr, Binary, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, + QueryRequest, SystemError, SystemResult, WasmQuery, }; use cwd_core::{msg::QueryMsg as MainDaoQueryMsg, query::SubDao}; use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; -use neutron_dao_pre_propose_overrule::msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, -}; use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use neutron_subdao_timelock_single::types::{ProposalStatus, SingleChoiceProposal}; use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; +// set of contracts that are set up properly pub const MOCK_DAO_CORE: &str = "neutron1dao_core_contract"; -pub const MOCK_DAO_CORE_MANY_SUBDAOS: &str = "neutron1dao_core_contract_many_subdaos"; pub const MOCK_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module"; pub const MOCK_SUBDAO_PREPROPOSE_MODULE: &str = "neutron1subdao_prepropose_module"; pub const MOCK_DAO_PROPOSE_MODULE: &str = "neutron1propose_module"; pub const MOCK_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract"; pub const MOCK_SUBDAO_CORE: &str = "neutron1subdao_core"; + +pub const MOCK_IMPOSTOR_SUBDAO_CORE: &str = "neutron1subdao_core_impostor"; +pub const MOCK_IMPOSTOR_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module_impostor"; +pub const MOCK_IMPOSTOR_SUBDAO_PRE_PROPOSE_MODULE: &str = + "neutron1subdao_prepropose_module_impostor"; + +pub const MOCK_TIMELOCK_CONTRACT_IMPOSTOR_SUBDAO: &str = "neutron1timelock_contract_wrong_subdao"; + +pub const MOCK_IMPOSTOR_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract_impostor"; + +// the dao core that has so many subdao that pagination is required to process them +pub const MOCK_DAO_CORE_MANY_SUBDAOS: &str = "neutron1dao_core_contract_many_subdaos"; + +// other pub const SUBDAO_NAME: &str = "Based DAO"; +pub const TIMELOCKED_PROPOSAL_ID: u64 = 42; +pub const NON_TIMELOCKED_PROPOSAL_ID: u64 = 24; -pub fn mock_dependencies() -> OwnedDeps { - let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[])); +pub fn mock_dependencies( + contracts: HashMap>, +) -> OwnedDeps { + let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[]), contracts); OwnedDeps { storage: MockStorage::default(), @@ -43,6 +59,7 @@ pub fn mock_dependencies() -> OwnedDeps { pub struct WasmMockQuerier { base: MockQuerier, + contracts: HashMap>, } impl Querier for WasmMockQuerier { @@ -64,104 +81,13 @@ impl WasmMockQuerier { pub fn handle_query(&self, request: &QueryRequest) -> QuerierResult { match &request { QueryRequest::Wasm(WasmQuery::Smart { contract_addr, msg }) => { - if contract_addr == MOCK_SUBDAO_PROPOSE_MODULE { - let q: ProposalSingleQueryMsg = from_binary(msg).unwrap(); - return match q { - ProposalSingleQueryMsg::Dao {} => { - SystemResult::Ok(ContractResult::from(to_binary(MOCK_DAO_CORE))) - } - ProposalSingleQueryMsg::ProposalCount {} => { - SystemResult::Ok(ContractResult::from(to_binary(&(0 as u64)))) - } - _ => SystemResult::Err(SystemError::Unknown {}), - }; - } - if contract_addr == MOCK_DAO_CORE { - let q: MainDaoQueryMsg = from_binary(msg).unwrap(); - return match q { - MainDaoQueryMsg::ListSubDaos { - start_after: _, - limit: _, - } => SystemResult::Ok(ContractResult::from(to_binary(&vec![SubDao { - addr: MOCK_SUBDAO_CORE.to_string(), - charter: None, - }]))), - _ => SystemResult::Err(SystemError::Unknown {}), - }; - } - if contract_addr == MOCK_TIMELOCK_CONTRACT { - let q: TimelockMsg::QueryMsg = from_binary(msg).unwrap(); - return match q { - TimelockMsg::QueryMsg::Config {} => SystemResult::Ok(ContractResult::from( - to_binary(&TimelockTypes::Config { - owner: Addr::unchecked(MOCK_DAO_CORE), - overrule_pre_propose: Addr::unchecked(""), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE), - }), - )), - TimelockMsg::QueryMsg::Proposal { proposal_id } => SystemResult::Ok( - ContractResult::from(to_binary(&SingleChoiceProposal { - id: proposal_id, - timelock_ts: Default::default(), - msgs: vec![], - status: ProposalStatus::Timelocked, - })), - ), - _ => SystemResult::Err(SystemError::Unknown {}), - }; - } - if contract_addr == MOCK_SUBDAO_CORE { - let q: SubdaoQueryMsg = from_binary(msg).unwrap(); - return match q { - SubdaoQueryMsg::ProposalModules { - start_after: _, - limit: _, - } => SystemResult::Ok(ContractResult::from(to_binary(&vec![ - SubdaoTypes::ProposalModule { - address: Addr::unchecked(MOCK_DAO_PROPOSE_MODULE), - prefix: "".to_string(), - status: SubdaoTypes::ProposalModuleStatus::Enabled, - }, - ]))), - SubdaoQueryMsg::Config {} => SystemResult::Ok(ContractResult::from( - to_binary(&SubdaoTypes::Config { - name: SUBDAO_NAME.to_string(), - description: "".to_string(), - dao_uri: None, - main_dao: Addr::unchecked(MOCK_DAO_CORE), - security_dao: Addr::unchecked(""), - }), - )), - _ => SystemResult::Err(SystemError::Unknown {}), - }; - } - if contract_addr == MOCK_DAO_PROPOSE_MODULE { - let q: SubdaoProposalMsg::QueryMsg = from_binary(msg).unwrap(); - return match q { - SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {} => { - SystemResult::Ok(ContractResult::from(to_binary( - &cwd_voting::pre_propose::ProposalCreationPolicy::Module { - addr: Addr::unchecked(MOCK_SUBDAO_PREPROPOSE_MODULE), - }, - ))) - } - _ => SystemResult::Err(SystemError::Unknown {}), - }; - } - if contract_addr == MOCK_SUBDAO_PREPROPOSE_MODULE { - let q: SubdaoPreProposeQueryMsg = from_binary(msg).unwrap(); - return match q { - SubdaoPreProposeQueryMsg::TimelockAddress {} => { - SystemResult::Ok(ContractResult::from(to_binary(&Addr::unchecked( - MOCK_TIMELOCK_CONTRACT, - )))) - } - _ => SystemResult::Err(SystemError::Unknown {}), - }; - } - SystemResult::Err(SystemError::NoSuchContract { - addr: contract_addr.to_string(), - }) + let mock = self.contracts.get(contract_addr); + return match mock { + None => SystemResult::Err(SystemError::NoSuchContract { + addr: contract_addr.to_string(), + }), + Some(m) => m.query(msg), + }; } _ => self.base.handle_query(request), } @@ -169,7 +95,255 @@ impl WasmMockQuerier { } impl WasmMockQuerier { - pub fn new(base: MockQuerier) -> Self { - WasmMockQuerier { base } + pub fn new(base: MockQuerier, contracts: HashMap>) -> Self { + WasmMockQuerier { base, contracts } + } +} + +pub trait ContractQuerier { + fn query(&self, msg: &Binary) -> QuerierResult; +} + +pub struct MockDaoQueries { + pub(crate) sub_dao_list_pages: HashMap, Vec>, +} + +impl ContractQuerier for MockDaoQueries { + fn query(&self, msg: &Binary) -> QuerierResult { + let q: MainDaoQueryMsg = from_binary(msg).unwrap(); + return match q { + MainDaoQueryMsg::ListSubDaos { + start_after, + limit: _, + } => SystemResult::Ok(ContractResult::from(to_binary( + &self.sub_dao_list_pages.get(&start_after).unwrap(), + ))), + _ => SystemResult::Err(SystemError::Unknown {}), + }; + } +} + +pub struct MockTimelockQueries { + pub(crate) owner: String, + pub(crate) subdao: String, +} + +impl ContractQuerier for MockTimelockQueries { + fn query(&self, msg: &Binary) -> QuerierResult { + let q: TimelockMsg::QueryMsg = from_binary(msg).unwrap(); + return match q { + TimelockMsg::QueryMsg::Config {} => { + SystemResult::Ok(ContractResult::from(to_binary(&TimelockTypes::Config { + owner: Addr::unchecked(self.owner.clone()), + overrule_pre_propose: Addr::unchecked(""), + subdao: Addr::unchecked(self.subdao.clone()), + }))) + } + TimelockMsg::QueryMsg::Proposal { proposal_id } => { + SystemResult::Ok(ContractResult::from(to_binary(&SingleChoiceProposal { + id: proposal_id, + timelock_ts: Default::default(), + msgs: vec![], + status: match proposal_id { + TIMELOCKED_PROPOSAL_ID => ProposalStatus::Timelocked, + _ => ProposalStatus::Executed, + }, + }))) + } + _ => SystemResult::Err(SystemError::Unknown {}), + }; + } +} + +pub struct MockDaoProposalQueries { + pub(crate) dao_core: String, +} + +impl ContractQuerier for MockDaoProposalQueries { + fn query(&self, msg: &Binary) -> QuerierResult { + let q: ProposalSingleQueryMsg = from_binary(msg).unwrap(); + return match q { + ProposalSingleQueryMsg::Dao {} => { + SystemResult::Ok(ContractResult::from(to_binary(&self.dao_core))) + } + ProposalSingleQueryMsg::ProposalCount {} => { + SystemResult::Ok(ContractResult::from(to_binary(&(0 as u64)))) + } + _ => SystemResult::Err(SystemError::Unknown {}), + }; + } +} + +pub struct MockSubdaoProposalQueries { + pub(crate) pre_propose: String, +} + +impl ContractQuerier for MockSubdaoProposalQueries { + fn query(&self, msg: &Binary) -> QuerierResult { + let q: SubdaoProposalMsg::QueryMsg = from_binary(msg).unwrap(); + return match q { + SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {} => { + SystemResult::Ok(ContractResult::from(to_binary( + &cwd_voting::pre_propose::ProposalCreationPolicy::Module { + addr: Addr::unchecked(self.pre_propose.clone()), + }, + ))) + } + _ => SystemResult::Err(SystemError::Unknown {}), + }; + } +} + +pub struct MockSubaoPreProposalQueries { + pub(crate) timelock: String, +} + +impl ContractQuerier for MockSubaoPreProposalQueries { + fn query(&self, msg: &Binary) -> QuerierResult { + let q: SubdaoPreProposeQueryMsg = from_binary(msg).unwrap(); + return match q { + SubdaoPreProposeQueryMsg::TimelockAddress {} => SystemResult::Ok(ContractResult::from( + to_binary(&Addr::unchecked(self.timelock.clone())), + )), + _ => SystemResult::Err(SystemError::Unknown {}), + }; } } + +pub struct MockSubdaoCoreQueries { + pub(crate) proposal_module: String, + pub(crate) dao_core: String, +} + +impl ContractQuerier for MockSubdaoCoreQueries { + fn query(&self, msg: &Binary) -> QuerierResult { + let q: SubdaoQueryMsg = from_binary(msg).unwrap(); + return match q { + SubdaoQueryMsg::ProposalModules { + start_after: _, + limit: _, + } => SystemResult::Ok(ContractResult::from(to_binary(&vec![ + SubdaoTypes::ProposalModule { + address: Addr::unchecked(self.proposal_module.clone()), + prefix: "".to_string(), + status: SubdaoTypes::ProposalModuleStatus::Enabled, + }, + ]))), + SubdaoQueryMsg::Config {} => { + SystemResult::Ok(ContractResult::from(to_binary(&SubdaoTypes::Config { + name: SUBDAO_NAME.to_string(), + description: "".to_string(), + dao_uri: None, + main_dao: Addr::unchecked(self.dao_core.clone()), + security_dao: Addr::unchecked(""), + }))) + } + _ => SystemResult::Err(SystemError::Unknown {}), + }; + } +} + +pub fn get_properly_initialized_dao() -> HashMap> { + let mut contracts: HashMap> = HashMap::new(); + contracts.insert( + MOCK_DAO_PROPOSE_MODULE.to_string(), + Box::new(MockDaoProposalQueries { + dao_core: MOCK_DAO_CORE.parse().unwrap(), + }), + ); + contracts.insert( + MOCK_DAO_CORE.to_string(), + Box::new(MockDaoQueries { + sub_dao_list_pages: HashMap::from([( + None, + vec![SubDao { + addr: MOCK_SUBDAO_CORE.to_string(), + charter: None, + }], + )]), + }), + ); + contracts.insert( + MOCK_TIMELOCK_CONTRACT.to_string(), + Box::new(MockTimelockQueries { + owner: MOCK_DAO_CORE.to_string(), + subdao: MOCK_SUBDAO_CORE.to_string(), + }), + ); + contracts.insert( + MOCK_SUBDAO_CORE.to_string(), + Box::new(MockSubdaoCoreQueries { + proposal_module: MOCK_SUBDAO_PROPOSE_MODULE.to_string(), + dao_core: MOCK_DAO_CORE.to_string(), + }), + ); + contracts.insert( + MOCK_SUBDAO_PROPOSE_MODULE.to_string(), + Box::new(MockSubdaoProposalQueries { + pre_propose: MOCK_SUBDAO_PREPROPOSE_MODULE.to_string(), + }), + ); + contracts.insert( + MOCK_SUBDAO_PREPROPOSE_MODULE.to_string(), + Box::new(MockSubaoPreProposalQueries { + timelock: MOCK_TIMELOCK_CONTRACT.to_string(), + }), + ); + return contracts; +} + +pub fn get_dao_with_impostor_timelock() -> HashMap> { + let mut contracts: HashMap> = get_properly_initialized_dao(); + // impostor timelock is the same as regular one but the subdao doesn't point to it + contracts.insert( + MOCK_IMPOSTOR_TIMELOCK_CONTRACT.to_string(), + Box::new(MockTimelockQueries { + owner: MOCK_DAO_CORE.to_string(), + subdao: MOCK_SUBDAO_CORE.to_string(), + }), + ); + return contracts; +} + +pub fn get_dao_with_impostor_subdao() -> HashMap> { + let mut contracts: HashMap> = get_properly_initialized_dao(); + // subdao becomes impostor if it is not in the dao's list, so let's just make it empty + contracts.remove(&MOCK_DAO_CORE.to_string()); + contracts.insert( + MOCK_DAO_CORE.to_string(), + Box::new(MockDaoQueries { + sub_dao_list_pages: HashMap::from([(None, vec![])]), + }), + ); + return contracts; +} + +pub fn get_dao_with_many_subdaos() -> HashMap> { + let mut contracts: HashMap> = get_properly_initialized_dao(); + // subdao becomes impostor if it is not in the dao's list, so let's just make it empty + contracts.remove(&MOCK_DAO_CORE.to_string()); + contracts.insert( + MOCK_DAO_CORE.to_string(), + Box::new(MockDaoQueries { + sub_dao_list_pages: HashMap::from([ + ( + None, + (1..10) + .map(|_| SubDao { + addr: "bla_bla".to_string(), + charter: None, + }) + .collect::>(), + ), + ( + Some("bla_bla".to_string()), + vec![SubDao { + addr: MOCK_SUBDAO_CORE.to_string(), + charter: None, + }], + ), + ]), + }), + ); + return contracts; +} diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index d5e0d0de..34429318 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -1,8 +1,10 @@ use cosmwasm_std::{ from_binary, testing::{mock_env, mock_info}, - to_binary, CosmosMsg, DepsMut, Empty, Response, SubMsg, WasmMsg, + to_binary, CosmosMsg, DepsMut, Empty, SubMsg, WasmMsg, }; +use cwd_core::query::SubDao; +use std::collections::HashMap; use crate::{ contract::{execute, instantiate, query}, @@ -15,24 +17,32 @@ use neutron_dao_pre_propose_overrule::msg::{ }; use crate::error::PreProposeOverruleError; -use crate::testing::mock_querier::SUBDAO_NAME; +use crate::testing::mock_querier::{ + get_dao_with_impostor_subdao, get_dao_with_impostor_timelock, get_dao_with_many_subdaos, + get_properly_initialized_dao, ContractQuerier, MockDaoProposalQueries, MockDaoQueries, + MockSubaoPreProposalQueries, MockSubdaoCoreQueries, MockSubdaoProposalQueries, + MockTimelockQueries, MOCK_DAO_PROPOSE_MODULE, MOCK_IMPOSTOR_TIMELOCK_CONTRACT, + MOCK_SUBDAO_CORE, MOCK_SUBDAO_PREPROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT_IMPOSTOR_SUBDAO, + NON_TIMELOCKED_PROPOSAL_ID, SUBDAO_NAME, TIMELOCKED_PROPOSAL_ID, +}; use cwd_pre_propose_base::state::Config; use neutron_dao_pre_propose_overrule::types::ProposeMessage; -use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; +use neutron_subdao_timelock_single::msg as TimelockMsg; pub fn init_base_contract(deps: DepsMut) { let msg = InstantiateMsg { main_dao: MOCK_DAO_CORE.to_string(), }; - let info = mock_info(MOCK_SUBDAO_PROPOSE_MODULE, &[]); + let info = mock_info(MOCK_DAO_PROPOSE_MODULE, &[]); instantiate(deps, mock_env(), info, msg).unwrap(); } #[test] fn test_create_overrule_proposal() { - let mut deps = mock_dependencies(); + let contracts: HashMap> = get_properly_initialized_dao(); + let mut deps = mock_dependencies(contracts); init_base_contract(deps.as_mut()); - const PROPOSAL_ID: u64 = 47; + const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; const PROPOSER_ADDR: &str = "whatever"; let msg = ExecuteMsg::Propose { msg: ProposeMessage::ProposeOverrule { @@ -53,7 +63,7 @@ fn test_create_overrule_proposal() { assert_eq!( res.unwrap().messages, vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: MOCK_SUBDAO_PROPOSE_MODULE.to_string(), + contract_addr: MOCK_DAO_PROPOSE_MODULE.to_string(), msg: to_binary(&ProposeMessageInternal::Propose { title: prop_name, description: prop_desc, @@ -75,7 +85,8 @@ fn test_create_overrule_proposal() { #[test] fn test_query_config() { - let mut deps = mock_dependencies(); + let contracts: HashMap> = get_properly_initialized_dao(); + let mut deps = mock_dependencies(contracts); init_base_contract(deps.as_mut()); let query_msg = QueryMsg::Config {}; let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); @@ -89,7 +100,8 @@ fn test_query_config() { #[test] fn test_base_prepropose_methods() { - let mut deps = mock_dependencies(); + let contracts: HashMap> = get_properly_initialized_dao(); + let mut deps = mock_dependencies(contracts); init_base_contract(deps.as_mut()); const PROPOSER_ADDR: &str = "whatever"; let msg = ExecuteMsg::UpdateConfig { @@ -111,29 +123,112 @@ fn test_base_prepropose_methods() { #[test] fn test_impostor_subdao() { - // test where timelock contract returns subdao that is not in list + // test where timelock contract points to subdao that doesn't points to this timelock + let contracts: HashMap> = get_dao_with_impostor_subdao(); + let mut deps = mock_dependencies(contracts); + init_base_contract(deps.as_mut()); + const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; + const PROPOSER_ADDR: &str = "whatever"; + let msg = ExecuteMsg::Propose { + msg: ProposeMessage::ProposeOverrule { + timelock_contract: MOCK_TIMELOCK_CONTRACT.to_string(), + proposal_id: PROPOSAL_ID, + }, + }; + let res_not_ok = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg, + ); + assert!(res_not_ok.is_err()); + assert_eq!(res_not_ok, Err(PreProposeOverruleError::ForbiddenSubdao {})); } #[test] fn test_impostor_timelock() { - // test where timelock points to subdao but subdao doesn't point to timelock + // test where timelock contract points to subdao that doesn't points to this timelock + let contracts: HashMap> = get_dao_with_impostor_timelock(); + let mut deps = mock_dependencies(contracts); + init_base_contract(deps.as_mut()); + const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; + const PROPOSER_ADDR: &str = "whatever"; + let msg = ExecuteMsg::Propose { + msg: ProposeMessage::ProposeOverrule { + timelock_contract: MOCK_IMPOSTOR_TIMELOCK_CONTRACT.to_string(), + proposal_id: PROPOSAL_ID, + }, + }; + let res_not_ok = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg, + ); + assert!(res_not_ok.is_err()); + assert_eq!( + res_not_ok, + Err(PreProposeOverruleError::SubdaoMisconfured {}) + ); } #[test] fn test_proposal_is_not_timelocked() { // test where the proposal we're to create overrule for isn't timelocked already/yet + let contracts: HashMap> = HashMap::new(); + let mut deps = mock_dependencies(contracts); + init_base_contract(deps.as_mut()); + const PROPOSAL_ID: u64 = NON_TIMELOCKED_PROPOSAL_ID; + const PROPOSER_ADDR: &str = "whatever"; + let msg = ExecuteMsg::Propose { + msg: ProposeMessage::ProposeOverrule { + timelock_contract: MOCK_TIMELOCK_CONTRACT.to_string(), + proposal_id: PROPOSAL_ID, + }, + }; + let res_not_ok = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg, + ); + assert!(res_not_ok.is_err()); + assert_eq!( + res_not_ok, + Err(PreProposeOverruleError::ProposalWrongState {}) + ); } #[test] fn test_long_subdao_list() { // test where we check if out pagination handling works properly + let contracts: HashMap> = get_dao_with_many_subdaos(); + let mut deps = mock_dependencies(contracts); + init_base_contract(deps.as_mut()); + const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; + const PROPOSER_ADDR: &str = "whatever"; + let msg = ExecuteMsg::Propose { + msg: ProposeMessage::ProposeOverrule { + timelock_contract: MOCK_TIMELOCK_CONTRACT.to_string(), + proposal_id: PROPOSAL_ID, + }, + }; + let res = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg, + ); + println!("{:?}", res); + assert!(res.is_ok()); } #[test] fn test_double_creation() { - let mut deps = mock_dependencies(); + let contracts: HashMap> = get_properly_initialized_dao(); + let mut deps = mock_dependencies(contracts); init_base_contract(deps.as_mut()); - const PROPOSAL_ID: u64 = 47; + const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; const PROPOSER_ADDR: &str = "whatever"; let msg = ExecuteMsg::Propose { msg: ProposeMessage::ProposeOverrule { diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs index 0bd76f9b..83494be8 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/msg.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -1,8 +1,6 @@ use crate::types::ProposeMessage; -use cosmwasm_std::{Addr, CosmosMsg, Timestamp}; -use cwd_interface::ModuleInstantiateInfo; +use cosmwasm_std::CosmosMsg; use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; -use cwd_voting::deposit::UncheckedDepositInfo; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/packages/neutron-dao-pre-propose-overrule/src/types.rs b/packages/neutron-dao-pre-propose-overrule/src/types.rs index beebd85b..3a483ff3 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/types.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/types.rs @@ -1,5 +1,3 @@ -use cosmwasm_std::CosmosMsg; -use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; From 84330239525000165b6387fb247731a487d71088 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 16 Mar 2023 18:37:47 +0200 Subject: [PATCH 14/53] overrule pre propose tests pass --- .../src/contract.rs | 15 +++++++++------ .../src/testing/mock_querier.rs | 14 +------------- .../src/testing/tests.rs | 17 +++++------------ 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index ee0d2193..212621cf 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -31,6 +31,8 @@ use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes} pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); +pub(crate) const SUBDAOS_QUERY_LIMIT: u32 = 10; + type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] @@ -193,8 +195,7 @@ fn check_if_subdao_legit( ) -> Result { let main_dao = get_main_dao_address(&deps)?; - let mut start_after: Option<&SubDao> = None; - let query_limit = 10; + let mut start_after: Option = None; // unfortunately, there is no way to get the total subdao number so we do infinite loop here loop { @@ -203,17 +204,19 @@ fn check_if_subdao_legit( &MainDaoQueryMsg::ListSubDaos { start_after: match start_after.clone() { None => None, - Some(a) => Some(a.clone().addr), + Some(a) => Some(a.addr), }, - limit: Some(query_limit), + limit: Some(SUBDAOS_QUERY_LIMIT), }, )?; + let results_number = subdao_list.len(); + if subdao_list.is_empty() { return Ok(false); } - start_after = subdao_list.last(); + start_after = Some(subdao_list.last().unwrap().clone()); if subdao_list .into_iter() @@ -223,7 +226,7 @@ fn check_if_subdao_legit( return Ok(true); }; - if subdao_list.len() < query_limit as usize { + if results_number < SUBDAOS_QUERY_LIMIT as usize { return Ok(false); } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 3a34200f..0b744daa 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -19,7 +19,6 @@ use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use neutron_subdao_timelock_single::types::{ProposalStatus, SingleChoiceProposal}; use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; -// set of contracts that are set up properly pub const MOCK_DAO_CORE: &str = "neutron1dao_core_contract"; pub const MOCK_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module"; pub const MOCK_SUBDAO_PREPROPOSE_MODULE: &str = "neutron1subdao_prepropose_module"; @@ -27,19 +26,8 @@ pub const MOCK_DAO_PROPOSE_MODULE: &str = "neutron1propose_module"; pub const MOCK_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract"; pub const MOCK_SUBDAO_CORE: &str = "neutron1subdao_core"; -pub const MOCK_IMPOSTOR_SUBDAO_CORE: &str = "neutron1subdao_core_impostor"; -pub const MOCK_IMPOSTOR_SUBDAO_PROPOSE_MODULE: &str = "neutron1subdao_propose_module_impostor"; -pub const MOCK_IMPOSTOR_SUBDAO_PRE_PROPOSE_MODULE: &str = - "neutron1subdao_prepropose_module_impostor"; - -pub const MOCK_TIMELOCK_CONTRACT_IMPOSTOR_SUBDAO: &str = "neutron1timelock_contract_wrong_subdao"; - pub const MOCK_IMPOSTOR_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract_impostor"; -// the dao core that has so many subdao that pagination is required to process them -pub const MOCK_DAO_CORE_MANY_SUBDAOS: &str = "neutron1dao_core_contract_many_subdaos"; - -// other pub const SUBDAO_NAME: &str = "Based DAO"; pub const TIMELOCKED_PROPOSAL_ID: u64 = 42; pub const NON_TIMELOCKED_PROPOSAL_ID: u64 = 24; @@ -328,7 +316,7 @@ pub fn get_dao_with_many_subdaos() -> HashMap> sub_dao_list_pages: HashMap::from([ ( None, - (1..10) + (0..crate::contract::SUBDAOS_QUERY_LIMIT) .map(|_| SubDao { addr: "bla_bla".to_string(), charter: None, diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 34429318..033eb3a8 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -3,14 +3,11 @@ use cosmwasm_std::{ testing::{mock_env, mock_info}, to_binary, CosmosMsg, DepsMut, Empty, SubMsg, WasmMsg, }; -use cwd_core::query::SubDao; use std::collections::HashMap; use crate::{ contract::{execute, instantiate, query}, - testing::mock_querier::{ - mock_dependencies, MOCK_DAO_CORE, MOCK_SUBDAO_PROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT, - }, + testing::mock_querier::{mock_dependencies, MOCK_DAO_CORE, MOCK_TIMELOCK_CONTRACT}, }; use neutron_dao_pre_propose_overrule::msg::{ ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, @@ -19,11 +16,9 @@ use neutron_dao_pre_propose_overrule::msg::{ use crate::error::PreProposeOverruleError; use crate::testing::mock_querier::{ get_dao_with_impostor_subdao, get_dao_with_impostor_timelock, get_dao_with_many_subdaos, - get_properly_initialized_dao, ContractQuerier, MockDaoProposalQueries, MockDaoQueries, - MockSubaoPreProposalQueries, MockSubdaoCoreQueries, MockSubdaoProposalQueries, - MockTimelockQueries, MOCK_DAO_PROPOSE_MODULE, MOCK_IMPOSTOR_TIMELOCK_CONTRACT, - MOCK_SUBDAO_CORE, MOCK_SUBDAO_PREPROPOSE_MODULE, MOCK_TIMELOCK_CONTRACT_IMPOSTOR_SUBDAO, - NON_TIMELOCKED_PROPOSAL_ID, SUBDAO_NAME, TIMELOCKED_PROPOSAL_ID, + get_properly_initialized_dao, ContractQuerier, MOCK_DAO_PROPOSE_MODULE, + MOCK_IMPOSTOR_TIMELOCK_CONTRACT, NON_TIMELOCKED_PROPOSAL_ID, SUBDAO_NAME, + TIMELOCKED_PROPOSAL_ID, }; use cwd_pre_propose_base::state::Config; use neutron_dao_pre_propose_overrule::types::ProposeMessage; @@ -56,7 +51,6 @@ fn test_create_overrule_proposal() { mock_info(PROPOSER_ADDR, &[]), msg, ); - println!("{:?}", res); assert!(res.is_ok()); let prop_desc: String = format!("Reject the decision made by the {} subdao", SUBDAO_NAME); let prop_name: String = format!("Overrule proposal {} of {}", PROPOSAL_ID, SUBDAO_NAME); @@ -175,7 +169,7 @@ fn test_impostor_timelock() { #[test] fn test_proposal_is_not_timelocked() { // test where the proposal we're to create overrule for isn't timelocked already/yet - let contracts: HashMap> = HashMap::new(); + let contracts: HashMap> = get_properly_initialized_dao(); let mut deps = mock_dependencies(contracts); init_base_contract(deps.as_mut()); const PROPOSAL_ID: u64 = NON_TIMELOCKED_PROPOSAL_ID; @@ -219,7 +213,6 @@ fn test_long_subdao_list() { mock_info(PROPOSER_ADDR, &[]), msg, ); - println!("{:?}", res); assert!(res.is_ok()); } From 06e10825e260fef0134b3c8998a6e483e0795623 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 16 Mar 2023 18:41:53 +0200 Subject: [PATCH 15/53] cleaning up some stuff --- .../src/testing/mock_querier.rs | 19 ++++------ .../src/testing/tests.rs | 38 ++++++------------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 0b744daa..4801a9da 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -1,9 +1,6 @@ use std::collections::HashMap; use std::marker::PhantomData; -// use crate::contract::{ -// MainDaoQueryMsg, ProposalStatus, SingleChoiceProposal, SubDao, TimelockConfig, TimelockQueryMsg, -// }; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, @@ -93,7 +90,7 @@ pub trait ContractQuerier { } pub struct MockDaoQueries { - pub(crate) sub_dao_list_pages: HashMap, Vec>, + sub_dao_list_pages: HashMap, Vec>, } impl ContractQuerier for MockDaoQueries { @@ -112,8 +109,8 @@ impl ContractQuerier for MockDaoQueries { } pub struct MockTimelockQueries { - pub(crate) owner: String, - pub(crate) subdao: String, + owner: String, + subdao: String, } impl ContractQuerier for MockTimelockQueries { @@ -144,7 +141,7 @@ impl ContractQuerier for MockTimelockQueries { } pub struct MockDaoProposalQueries { - pub(crate) dao_core: String, + dao_core: String, } impl ContractQuerier for MockDaoProposalQueries { @@ -163,7 +160,7 @@ impl ContractQuerier for MockDaoProposalQueries { } pub struct MockSubdaoProposalQueries { - pub(crate) pre_propose: String, + pre_propose: String, } impl ContractQuerier for MockSubdaoProposalQueries { @@ -183,7 +180,7 @@ impl ContractQuerier for MockSubdaoProposalQueries { } pub struct MockSubaoPreProposalQueries { - pub(crate) timelock: String, + timelock: String, } impl ContractQuerier for MockSubaoPreProposalQueries { @@ -199,8 +196,8 @@ impl ContractQuerier for MockSubaoPreProposalQueries { } pub struct MockSubdaoCoreQueries { - pub(crate) proposal_module: String, - pub(crate) dao_core: String, + proposal_module: String, + dao_core: String, } impl ContractQuerier for MockSubdaoCoreQueries { diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 033eb3a8..4dd4a476 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -109,10 +109,7 @@ fn test_base_prepropose_methods() { msg, ); assert!(res.is_err()); - assert_eq!( - res.err().unwrap(), - PreProposeOverruleError::MessageUnsupported {} - ) + assert_eq!(res, Err(PreProposeOverruleError::MessageUnsupported {})) } #[test] @@ -129,14 +126,14 @@ fn test_impostor_subdao() { proposal_id: PROPOSAL_ID, }, }; - let res_not_ok = execute( + let res = execute( deps.as_mut(), mock_env(), mock_info(PROPOSER_ADDR, &[]), msg, ); - assert!(res_not_ok.is_err()); - assert_eq!(res_not_ok, Err(PreProposeOverruleError::ForbiddenSubdao {})); + assert!(res.is_err()); + assert_eq!(res, Err(PreProposeOverruleError::ForbiddenSubdao {})); } #[test] @@ -153,17 +150,14 @@ fn test_impostor_timelock() { proposal_id: PROPOSAL_ID, }, }; - let res_not_ok = execute( + let res = execute( deps.as_mut(), mock_env(), mock_info(PROPOSER_ADDR, &[]), msg, ); - assert!(res_not_ok.is_err()); - assert_eq!( - res_not_ok, - Err(PreProposeOverruleError::SubdaoMisconfured {}) - ); + assert!(res.is_err()); + assert_eq!(res, Err(PreProposeOverruleError::SubdaoMisconfured {})); } #[test] @@ -180,17 +174,14 @@ fn test_proposal_is_not_timelocked() { proposal_id: PROPOSAL_ID, }, }; - let res_not_ok = execute( + let res = execute( deps.as_mut(), mock_env(), mock_info(PROPOSER_ADDR, &[]), msg, ); - assert!(res_not_ok.is_err()); - assert_eq!( - res_not_ok, - Err(PreProposeOverruleError::ProposalWrongState {}) - ); + assert!(res.is_err()); + assert_eq!(res, Err(PreProposeOverruleError::ProposalWrongState {})); } #[test] @@ -243,12 +234,5 @@ fn test_double_creation() { msg, ); assert!(res_not_ok.is_err()); - match res_not_ok { - Ok(_) => { - assert!(false) - } - Err(err) => { - assert_eq!(err, PreProposeOverruleError::AlreadyExists {}) - } - } + assert_eq!(res_not_ok, Err(PreProposeOverruleError::AlreadyExists {})); } From eb2388f4dcc40fb899d0054c82811f9fec61a55c Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 16 Mar 2023 18:48:04 +0200 Subject: [PATCH 16/53] queries tests --- .../src/testing/tests.rs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 4dd4a476..8e39286e 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -1,7 +1,7 @@ use cosmwasm_std::{ from_binary, testing::{mock_env, mock_info}, - to_binary, CosmosMsg, DepsMut, Empty, SubMsg, WasmMsg, + to_binary, Addr, CosmosMsg, DepsMut, Empty, SubMsg, WasmMsg, }; use std::collections::HashMap; @@ -78,18 +78,31 @@ fn test_create_overrule_proposal() { } #[test] -fn test_query_config() { +fn test_base_queries() { let contracts: HashMap> = get_properly_initialized_dao(); let mut deps = mock_dependencies(contracts); init_base_contract(deps.as_mut()); - let query_msg = QueryMsg::Config {}; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_prop = from_binary(&res).unwrap(); - let expected_prop = Config { + + let res_config = query(deps.as_ref(), mock_env(), QueryMsg::Config {}).unwrap(); + let queried_config = from_binary(&res_config).unwrap(); + let expected_config = Config { deposit_info: None, open_proposal_submission: true, }; - assert_eq!(expected_prop, queried_prop); + assert_eq!(expected_config, queried_config); + + let res_dao = query(deps.as_ref(), mock_env(), QueryMsg::Dao {}).unwrap(); + let queried_dao: Addr = from_binary(&res_dao).unwrap(); + let expected_dao = Addr::unchecked(MOCK_DAO_CORE); + assert_eq!(expected_dao, queried_dao); + + let res_proposal_module = + query(deps.as_ref(), mock_env(), QueryMsg::ProposalModule {}).unwrap(); + let queried_proposal_module: Addr = from_binary(&res_proposal_module).unwrap(); + let expected_proposal_module = Addr::unchecked(MOCK_DAO_PROPOSE_MODULE); + assert_eq!(expected_proposal_module, queried_proposal_module); + + assert_eq!(expected_config, queried_config); } #[test] From 8857a2cccfa71d67b4882e06710eb633df064403 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 16 Mar 2023 23:29:56 +0200 Subject: [PATCH 17/53] QueryBase -> QueryExt --- .../cwd-pre-propose-multiple/src/contract.rs | 6 +-- .../src/contract.rs | 37 +++++++++++++++---- .../src/testing/mock_querier.rs | 12 ++++-- .../cwd-pre-propose-single/src/contract.rs | 8 ++-- .../src/contract.rs | 2 +- .../src/contract.rs | 10 +++-- packages/cwd-pre-propose-base/src/execute.rs | 9 +++-- packages/cwd-pre-propose-base/src/msg.rs | 8 +++- packages/cwd-pre-propose-base/src/state.rs | 8 ++-- .../src/msg.rs | 12 +++++- .../src/msg.rs | 6 +-- 11 files changed, 85 insertions(+), 33 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-multiple/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-multiple/src/contract.rs index fe4d24ef..32de6066 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-multiple/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-multiple/src/contract.rs @@ -1,7 +1,7 @@ use cosmwasm_schema::cw_serde; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; +use cosmwasm_std::{Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult}; use cw2::set_contract_version; use cwd_pre_propose_base::{ @@ -25,7 +25,7 @@ pub enum ProposeMessage { pub type InstantiateMsg = InstantiateBase; pub type ExecuteMsg = ExecuteBase; -pub type QueryMsg = QueryBase; +pub type QueryMsg = QueryBase; /// Internal version of the propose message that includes the /// `proposer` field. The module will fill this in based on the sender @@ -40,7 +40,7 @@ enum ProposeMessageInternal { }, } -type PrePropose = PreProposeContract; +type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 212621cf..dddf47d5 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -9,7 +9,7 @@ use error::PreProposeOverruleError; use crate::error; use neutron_dao_pre_propose_overrule::msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, + ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryExt, QueryMsg, }; // use crate::state::{Config, CONFIG}; use cwd_pre_propose_base::{ @@ -24,7 +24,9 @@ use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; use cwd_voting::pre_propose::ProposalCreationPolicy; use neutron_dao_pre_propose_overrule::types::ProposeMessage; use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; -use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; +use neutron_subdao_pre_propose_single::msg::{ + QueryExt as SubdaoPreProposeQueryExt, QueryMsg as SubdaoPreProposeQueryMsg, +}; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; @@ -33,7 +35,7 @@ pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); pub(crate) const SUBDAOS_QUERY_LIMIT: u32 = 10; -type PrePropose = PreProposeContract; +type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( @@ -181,9 +183,12 @@ fn get_timelock_from_subdao( match prop_policy { ProposalCreationPolicy::Anyone {} => Err(PreProposeOverruleError::SubdaoMisconfured {}), ProposalCreationPolicy::Module { addr } => { - let timelock: Addr = deps - .querier - .query_wasm_smart(addr, &SubdaoPreProposeQueryMsg::TimelockAddress {})?; + let timelock: Addr = deps.querier.query_wasm_smart( + addr, + &SubdaoPreProposeQueryMsg::QueryExtension { + msg: SubdaoPreProposeQueryExt::TimelockAddress {}, + }, + )?; Ok(timelock) } } @@ -268,5 +273,23 @@ fn get_subdao_name(deps: &DepsMut, subdao: &Addr) -> Result StdResult { - PrePropose::default().query(deps, env, msg) + match msg { + QueryMsg::QueryExtension { + msg: + QueryExt::OverruleProposalId { + timelock_address, + subdao_proposal_id, + }, + } => { + let overrule_proposal_id = PROPOSALS.load( + deps.storage, + ( + subdao_proposal_id, + deps.api.addr_validate(&timelock_address)?, + ), + )?; + to_binary(&overrule_proposal_id) + } + _ => PrePropose::default().query(deps, env, msg), + } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 4801a9da..98b7bf16 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -11,7 +11,9 @@ use cwd_core::{msg::QueryMsg as MainDaoQueryMsg, query::SubDao}; use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; -use neutron_subdao_pre_propose_single::msg::QueryMsg as SubdaoPreProposeQueryMsg; +use neutron_subdao_pre_propose_single::msg::{ + QueryExt as SubdaoPreProposeQueryExt, QueryMsg as SubdaoPreProposeQueryMsg, +}; use neutron_subdao_proposal_single::msg as SubdaoProposalMsg; use neutron_subdao_timelock_single::types::{ProposalStatus, SingleChoiceProposal}; use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes}; @@ -187,9 +189,11 @@ impl ContractQuerier for MockSubaoPreProposalQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: SubdaoPreProposeQueryMsg = from_binary(msg).unwrap(); return match q { - SubdaoPreProposeQueryMsg::TimelockAddress {} => SystemResult::Ok(ContractResult::from( - to_binary(&Addr::unchecked(self.timelock.clone())), - )), + SubdaoPreProposeQueryMsg::QueryExtension { + msg: SubdaoPreProposeQueryExt::TimelockAddress {}, + } => SystemResult::Ok(ContractResult::from(to_binary(&Addr::unchecked( + self.timelock.clone(), + )))), _ => SystemResult::Err(SystemError::Unknown {}), }; } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single/src/contract.rs index c791bdde..b0495232 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single/src/contract.rs @@ -1,6 +1,8 @@ #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; -use cosmwasm_std::{Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Response, StdResult}; +use cosmwasm_std::{ + Binary, CosmosMsg, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult, +}; use cw2::set_contract_version; use neutron_bindings::bindings::msg::NeutronMsg; @@ -27,7 +29,7 @@ pub enum ProposeMessage { pub type InstantiateMsg = InstantiateBase; pub type ExecuteMsg = ExecuteBase; -pub type QueryMsg = QueryBase; +pub type QueryMsg = QueryBase; /// Internal version of the propose message that includes the /// `proposer` field. The module will fill this in based on the sender @@ -43,7 +45,7 @@ enum ProposeMessageInternal { }, } -type PrePropose = PreProposeContract; +type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 024b1c34..7ed04759 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -291,7 +291,7 @@ fn get_timelock_duration( &OverruleQueryMsg::QueryBase(PreProposeQueryBase::ProposalModule {}), )?; let config: ProposalConfig = deps.querier.query_wasm_smart( - overrule_pre_propose, + propose, &OverruleQueryMsg::QueryBase(PreProposeQueryBase::ProposalModule {}), )?; match config.max_voting_period { diff --git a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/src/contract.rs b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/src/contract.rs index 8207c42c..c1f7ad4a 100644 --- a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/src/contract.rs +++ b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/src/contract.rs @@ -17,7 +17,7 @@ use cwd_pre_propose_base::{ state::PreProposeContract, }; use neutron_subdao_pre_propose_single::{ - msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, + msg::{ExecuteMsg, InstantiateMsg, QueryExt, QueryMsg}, types::ProposeMessage, }; use neutron_subdao_proposal_single::msg::QueryMsg as ProposalQueryMsg; @@ -42,7 +42,7 @@ enum ProposeMessageInternal { }, } -type PrePropose = PreProposeContract; +type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] pub fn instantiate( @@ -152,8 +152,10 @@ pub fn execute( #[cfg_attr(not(feature = "library"), entry_point)] pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { match msg { - QueryMsg::QueryBase(msg) => PrePropose::default().query(deps, env, msg), - QueryMsg::TimelockAddress {} => query_timelock_address(deps), + QueryMsg::QueryExtension { + msg: QueryExt::TimelockAddress {}, + } => query_timelock_address(deps), + _ => PrePropose::default().query(deps, env, msg), } } diff --git a/packages/cwd-pre-propose-base/src/execute.rs b/packages/cwd-pre-propose-base/src/execute.rs index 9737e49e..4daf4a2f 100644 --- a/packages/cwd-pre-propose-base/src/execute.rs +++ b/packages/cwd-pre-propose-base/src/execute.rs @@ -1,9 +1,10 @@ use cosmwasm_std::{ - to_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult, WasmMsg, + to_binary, Addr, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult, WasmMsg, }; use std::fmt::Debug; use cw2::set_contract_version; +use schemars::JsonSchema; use cw_denom::UncheckedDenom; use cwd_interface::voting::{Query as CwCoreQuery, VotingPowerAtHeightResponse}; @@ -22,9 +23,10 @@ use crate::{ const CONTRACT_NAME: &str = "crates.io::cwd-pre-propose-base"; const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); -impl PreProposeContract +impl PreProposeContract where ProposalMessage: Serialize + Debug, + QueryExt: JsonSchema, { pub fn instantiate( &self, @@ -99,7 +101,7 @@ where } } - pub fn query(&self, deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + pub fn query(&self, deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::ProposalModule {} => to_binary(&self.proposal_module.load(deps.storage)?), QueryMsg::Dao {} => to_binary(&self.dao.load(deps.storage)?), @@ -111,6 +113,7 @@ where proposer, }) } + QueryMsg::QueryExtension { .. } => Ok(Binary::default()), } } diff --git a/packages/cwd-pre-propose-base/src/msg.rs b/packages/cwd-pre-propose-base/src/msg.rs index 943f613c..36444211 100644 --- a/packages/cwd-pre-propose-base/src/msg.rs +++ b/packages/cwd-pre-propose-base/src/msg.rs @@ -85,7 +85,10 @@ pub enum ExecuteMsg { #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -pub enum QueryMsg { +pub enum QueryMsg +where + QueryExt: JsonSchema, +{ /// Gets the proposal module that this pre propose module is /// associated with. Returns `Addr`. ProposalModule {}, @@ -97,6 +100,9 @@ pub enum QueryMsg { /// Gets the deposit info for the proposal identified by /// PROPOSAL_ID. Returns `DepositInfoResponse`. DepositInfo { proposal_id: u64 }, + /// Extension for queries. The default implementation will do + /// nothing if queried for will return `Binary::default()`. + QueryExtension { msg: QueryExt }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] diff --git a/packages/cwd-pre-propose-base/src/state.rs b/packages/cwd-pre-propose-base/src/state.rs index b83bf838..fa8dc251 100644 --- a/packages/cwd-pre-propose-base/src/state.rs +++ b/packages/cwd-pre-propose-base/src/state.rs @@ -17,7 +17,7 @@ pub struct Config { pub open_proposal_submission: bool, } -pub struct PreProposeContract { +pub struct PreProposeContract { /// The proposal module that this module is associated with. pub proposal_module: Item<'static, Addr>, /// The DAO (cw-dao-core module) that this module is associated @@ -32,9 +32,10 @@ pub struct PreProposeContract { // assocaited data. To stop the compiler complaining about unused // generics, we build this phantom data. proposal_type: PhantomData, + query_type: PhantomData, } -impl PreProposeContract { +impl PreProposeContract { const fn new( proposal_key: &'static str, dao_key: &'static str, @@ -47,11 +48,12 @@ impl PreProposeContract { config: Item::new(config_key), deposits: Map::new(deposits_key), proposal_type: PhantomData, + query_type: PhantomData, } } } -impl Default for PreProposeContract { +impl Default for PreProposeContract { fn default() -> Self { // Call into constant function here. Presumably, the compiler // is clever enough to inline this. This gives us diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs index 83494be8..71df8a72 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/msg.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -6,7 +6,6 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; pub type ExecuteMsg = ExecuteBase; -pub type QueryMsg = QueryBase; #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] @@ -27,3 +26,14 @@ pub enum ProposeMessageInternal { proposer: Option, }, } + +#[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryExt { + OverruleProposalId { + timelock_address: String, + subdao_proposal_id: u64, + }, +} + +pub type QueryMsg = QueryBase; diff --git a/packages/neutron-subdao-pre-propose-single/src/msg.rs b/packages/neutron-subdao-pre-propose-single/src/msg.rs index c2fb3899..9b7b9b2d 100644 --- a/packages/neutron-subdao-pre-propose-single/src/msg.rs +++ b/packages/neutron-subdao-pre-propose-single/src/msg.rs @@ -24,8 +24,8 @@ pub type ExecuteMsg = ExecuteBase; #[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] #[serde(rename_all = "snake_case")] -pub enum QueryMsg { - QueryBase(QueryBase), - /// Gets the address of the timelock contract. +pub enum QueryExt { TimelockAddress {}, } + +pub type QueryMsg = QueryBase; From 2c810b4f05f8eb8822e5245ffee58e33aad25943 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 16 Mar 2023 23:55:13 +0200 Subject: [PATCH 18/53] overrule proposal id query test --- .../src/testing/mock_querier.rs | 3 +- .../src/testing/tests.rs | 41 ++++++++++++++++++- packages/cwd-pre-propose-base/src/execute.rs | 2 +- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 98b7bf16..faef43f0 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -30,6 +30,7 @@ pub const MOCK_IMPOSTOR_TIMELOCK_CONTRACT: &str = "neutron1timelock_contract_imp pub const SUBDAO_NAME: &str = "Based DAO"; pub const TIMELOCKED_PROPOSAL_ID: u64 = 42; pub const NON_TIMELOCKED_PROPOSAL_ID: u64 = 24; +pub const PROPOSALS_COUNT: u64 = 61; pub fn mock_dependencies( contracts: HashMap>, @@ -154,7 +155,7 @@ impl ContractQuerier for MockDaoProposalQueries { SystemResult::Ok(ContractResult::from(to_binary(&self.dao_core))) } ProposalSingleQueryMsg::ProposalCount {} => { - SystemResult::Ok(ContractResult::from(to_binary(&(0 as u64)))) + SystemResult::Ok(ContractResult::from(to_binary(&PROPOSALS_COUNT))) } _ => SystemResult::Err(SystemError::Unknown {}), }; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 8e39286e..0a1a48b4 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -10,14 +10,14 @@ use crate::{ testing::mock_querier::{mock_dependencies, MOCK_DAO_CORE, MOCK_TIMELOCK_CONTRACT}, }; use neutron_dao_pre_propose_overrule::msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryMsg, + ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryExt, QueryMsg, }; use crate::error::PreProposeOverruleError; use crate::testing::mock_querier::{ get_dao_with_impostor_subdao, get_dao_with_impostor_timelock, get_dao_with_many_subdaos, get_properly_initialized_dao, ContractQuerier, MOCK_DAO_PROPOSE_MODULE, - MOCK_IMPOSTOR_TIMELOCK_CONTRACT, NON_TIMELOCKED_PROPOSAL_ID, SUBDAO_NAME, + MOCK_IMPOSTOR_TIMELOCK_CONTRACT, NON_TIMELOCKED_PROPOSAL_ID, PROPOSALS_COUNT, SUBDAO_NAME, TIMELOCKED_PROPOSAL_ID, }; use cwd_pre_propose_base::state::Config; @@ -105,6 +105,43 @@ fn test_base_queries() { assert_eq!(expected_config, queried_config); } +#[test] +fn test_proposal_id_query() { + let contracts: HashMap> = get_properly_initialized_dao(); + let mut deps = mock_dependencies(contracts); + init_base_contract(deps.as_mut()); + const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; + const PROPOSER_ADDR: &str = "whatever"; + let msg = ExecuteMsg::Propose { + msg: ProposeMessage::ProposeOverrule { + timelock_contract: MOCK_TIMELOCK_CONTRACT.to_string(), + proposal_id: PROPOSAL_ID, + }, + }; + let res = execute( + deps.as_mut(), + mock_env(), + mock_info(PROPOSER_ADDR, &[]), + msg, + ); + assert!(res.is_ok()); + + let res_id = query( + deps.as_ref(), + mock_env(), + QueryMsg::QueryExtension { + msg: QueryExt::OverruleProposalId { + subdao_proposal_id: PROPOSAL_ID, + timelock_address: MOCK_TIMELOCK_CONTRACT.to_string(), + }, + }, + ) + .unwrap(); + let queried_id: u64 = from_binary(&res_id).unwrap(); + let expected_id = PROPOSALS_COUNT + 1; + assert_eq!(expected_id, queried_id); +} + #[test] fn test_base_prepropose_methods() { let contracts: HashMap> = get_properly_initialized_dao(); diff --git a/packages/cwd-pre-propose-base/src/execute.rs b/packages/cwd-pre-propose-base/src/execute.rs index 4daf4a2f..e3a5ebf1 100644 --- a/packages/cwd-pre-propose-base/src/execute.rs +++ b/packages/cwd-pre-propose-base/src/execute.rs @@ -1,5 +1,5 @@ use cosmwasm_std::{ - to_binary, Addr, Binary, Deps, DepsMut, Empty, Env, MessageInfo, Response, StdResult, WasmMsg, + to_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult, WasmMsg, }; use std::fmt::Debug; From aab8ff0e81c45f6a558deb4fd4ca2dc0a3664304 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Fri, 17 Mar 2023 00:55:21 +0200 Subject: [PATCH 19/53] fixing timelock tests wip --- Cargo.lock | 2 + .../cwd-subdao-timelock-single/Cargo.toml | 2 + .../src/contract.rs | 24 +++--- .../src/testing/mock_querier.rs | 76 +++++++++++++++---- .../src/testing/tests.rs | 35 ++++----- 5 files changed, 97 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3304aeaa..24c71bda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -971,6 +971,8 @@ dependencies = [ "cwd-interface", "cwd-macros", "cwd-pre-propose-base", + "cwd-proposal-single", + "cwd-voting", "neutron-dao-pre-propose-overrule", "neutron-sdk", "neutron-subdao-core", diff --git a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml index 29bccc3a..3b393d39 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml +++ b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml @@ -33,6 +33,8 @@ neutron-subdao-timelock-single = { path = "../../../packages/neutron-subdao-time cwd-pre-propose-base = { path = "../../../packages/cwd-pre-propose-base" } neutron-subdao-core = { path = "../../../packages/neutron-subdao-core" } neutron-dao-pre-propose-overrule = { path = "../../../packages/neutron-dao-pre-propose-overrule" } +cwd-proposal-single = { path = "../../../contracts/dao/proposal/cwd-proposal-single" } +cwd-voting = { path = "../../../packages/cwd-voting" } [dev-dependencies] cosmwasm-schema = { version = "1.0.0" } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 7ed04759..e6aebc05 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -10,7 +10,9 @@ use cw_utils::{Duration, Threshold}; use cwd_pre_propose_base::msg::QueryMsg as PreProposeQueryBase; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; -use neutron_dao_pre_propose_overrule::msg::QueryMsg as OverruleQueryMsg; +use neutron_dao_pre_propose_overrule::msg::{ + QueryExt as OverruleQueryExt, QueryMsg as OverruleQueryMsg, +}; use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; @@ -39,7 +41,7 @@ pub fn instantiate( let subdao_core: Addr = deps.querier.query_wasm_smart( info.sender, // sender is meant to be the pre-propose module - &PreProposeQuery::QueryBase(PreProposeQueryBase::Dao {}), + &PreProposeQuery::Dao {}, )?; let main_dao: Addr = deps @@ -149,7 +151,7 @@ pub fn execute_execute_proposal( }); } - let timelock_duration = get_timelock_duration(&config.overrule_pre_propose, &deps)?; + let timelock_duration = get_timelock_duration(&deps, &config.overrule_pre_propose)?; // Check if timelock has passed if env.block.time.seconds() < (timelock_duration + proposal.timelock_ts.seconds()) { @@ -283,17 +285,15 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result Result { - let propose: Addr = deps.querier.query_wasm_smart( - overrule_pre_propose, - &OverruleQueryMsg::QueryBase(PreProposeQueryBase::ProposalModule {}), - )?; - let config: ProposalConfig = deps.querier.query_wasm_smart( - propose, - &OverruleQueryMsg::QueryBase(PreProposeQueryBase::ProposalModule {}), - )?; + let propose: Addr = deps + .querier + .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::ProposalModule {})?; + let config: ProposalConfig = deps + .querier + .query_wasm_smart(propose, &OverruleQueryMsg::ProposalModule {})?; match config.max_voting_period { Duration::Height(_) => Err(ContractError::CantCreateOverrule {}), Duration::Time(duration) => Ok(duration), diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index e3ea74a9..235ea008 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -3,15 +3,26 @@ use std::marker::PhantomData; use cosmwasm_std::{ from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, - to_binary, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, - SystemResult, WasmQuery, + to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, + SystemError, SystemResult, WasmQuery, +}; +use cw_utils::Duration; +use cwd_proposal_single::{ + msg::{QueryMsg as ProposeQuery, QueryMsg}, + state::Config as OverrulProposalConfig, +}; +use cwd_voting::threshold::Threshold; +use neutron_dao_pre_propose_overrule::msg::{ + QueryExt as PreProposeOverruleQueryExt, QueryMsg as PreProposeOverruleQuery, +}; +use neutron_subdao_pre_propose_single::msg::{ + QueryExt as PreProposeQueryExt, QueryMsg as PreProposeQuery, }; -use cwd_pre_propose_base::msg::QueryMsg as PreProposeQueryBase; -use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; pub const MOCK_SUBDAO_CORE_ADDR: &str = "neutron1subdao_core_contract"; pub const MOCK_TIMELOCK_INITIALIZER: &str = "neutron1timelock_initializer"; pub const MOCK_MAIN_DAO_ADDR: &str = "neutron1main_dao_core_contract"; +pub const MOCK_OVERRULE_PROPOSAL: &str = "neutron1main_dao_overrule_proposal"; pub const MOCK_OVERRULE_PREPROPOSAL: &str = "neutron1main_dao_overrule_preproposal"; pub fn mock_dependencies() -> OwnedDeps { @@ -51,17 +62,15 @@ impl WasmMockQuerier { if contract_addr == MOCK_TIMELOCK_INITIALIZER { let q: PreProposeQuery = from_binary(msg).unwrap(); let addr = match q { - PreProposeQuery::QueryBase(PreProposeQueryBase::ProposalModule {}) => { + PreProposeQuery::ProposalModule {} => { todo!() } - PreProposeQuery::QueryBase(PreProposeQueryBase::Dao {}) => { - MOCK_SUBDAO_CORE_ADDR - } - PreProposeQuery::QueryBase(PreProposeQueryBase::Config {}) => todo!(), - PreProposeQuery::QueryBase(PreProposeQueryBase::DepositInfo { - proposal_id: _, - }) => todo!(), - PreProposeQuery::TimelockAddress {} => todo!(), + PreProposeQuery::Dao {} => MOCK_SUBDAO_CORE_ADDR, + PreProposeQuery::Config {} => todo!(), + PreProposeQuery::DepositInfo { proposal_id: _ } => todo!(), + PreProposeQuery::QueryExtension { + msg: PreProposeQueryExt::TimelockAddress {}, + } => todo!(), }; return SystemResult::Ok(ContractResult::from(to_binary(addr))); } @@ -69,6 +78,47 @@ impl WasmMockQuerier { let addr = { MOCK_MAIN_DAO_ADDR }; return SystemResult::Ok(ContractResult::from(to_binary(addr))); } + if contract_addr == MOCK_OVERRULE_PREPROPOSAL { + let q: PreProposeOverruleQuery = from_binary(msg).unwrap(); + let reply = match q { + PreProposeOverruleQuery::ProposalModule {} => { + todo!() + } + PreProposeOverruleQuery::Dao {} => MOCK_MAIN_DAO_ADDR.to_string(), + PreProposeOverruleQuery::Config {} => todo!(), + PreProposeOverruleQuery::DepositInfo { proposal_id: _ } => todo!(), + PreProposeOverruleQuery::QueryExtension { + msg: PreProposeOverruleQueryExt::OverruleProposalId { .. }, + } => todo!(), + }; + return SystemResult::Ok(ContractResult::from(to_binary(&reply))); + } + if contract_addr == MOCK_OVERRULE_PROPOSAL { + let q: ProposeQuery = from_binary(msg).unwrap(); + let reply = match q { + QueryMsg::Config {} => OverrulProposalConfig { + threshold: Threshold::AbsoluteCount { + threshold: Default::default(), + }, + max_voting_period: Duration::Time(10), + min_voting_period: None, + allow_revoting: false, + dao: Addr::unchecked(MOCK_MAIN_DAO_ADDR), + close_proposal_on_execution_failure: false, + }, + QueryMsg::Proposal { .. } => todo!(), + QueryMsg::ListProposals { .. } => todo!(), + QueryMsg::ReverseProposals { .. } => todo!(), + QueryMsg::ProposalCount { .. } => todo!(), + QueryMsg::GetVote { .. } => todo!(), + QueryMsg::ListVotes { .. } => todo!(), + QueryMsg::ProposalCreationPolicy { .. } => todo!(), + QueryMsg::ProposalHooks { .. } => todo!(), + QueryMsg::VoteHooks { .. } => todo!(), + _ => todo!(), + }; + return SystemResult::Ok(ContractResult::from(to_binary(&reply))); + } SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.to_string(), }) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index d941accf..b2a4065a 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -9,7 +9,7 @@ use neutron_subdao_timelock_single::types::{ Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, }; -use crate::testing::mock_querier::MOCK_MAIN_DAO_ADDR; +use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PROPOSAL}; use crate::{ contract::{execute, instantiate, query, reply}, state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}, @@ -24,7 +24,7 @@ fn test_instantiate_test() { let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); let msg = InstantiateMsg { - timelock_duration: 10, + overrule_pre_propose: MOCK_OVERRULE_PROPOSAL.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info, msg); assert_eq!( @@ -35,7 +35,7 @@ fn test_instantiate_test() { let info = mock_info(MOCK_TIMELOCK_INITIALIZER, &[]); let msg = InstantiateMsg { - timelock_duration: 10, + overrule_pre_propose: MOCK_OVERRULE_PROPOSAL.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg.clone()); let res_ok = res.unwrap(); @@ -48,13 +48,13 @@ fn test_instantiate_test() { let config = CONFIG.load(&deps.storage).unwrap(); let expected_config = Config { owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), - timelock_duration: msg.timelock_duration, + overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; assert_eq!(expected_config, config); let msg = InstantiateMsg { - timelock_duration: 10, + overrule_pre_propose: MOCK_OVERRULE_PROPOSAL.to_string(), }; let res = instantiate(deps.as_mut(), env, info, msg.clone()); let res_ok = res.unwrap(); @@ -67,7 +67,7 @@ fn test_instantiate_test() { let config = CONFIG.load(&deps.storage).unwrap(); let expected_config = Config { owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), - timelock_duration: msg.timelock_duration, + overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; assert_eq!(expected_config, config); @@ -92,7 +92,7 @@ fn test_execute_timelock_proposal() { let config = Config { owner: Addr::unchecked("owner"), - timelock_duration: 10, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -136,7 +136,7 @@ fn test_execute_proposal() { let config = Config { owner: Addr::unchecked("owner"), - timelock_duration: 10, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -216,7 +216,7 @@ fn test_overrule_proposal() { let config = Config { owner: Addr::unchecked("owner"), - timelock_duration: 10, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -276,7 +276,7 @@ fn execute_update_config() { let msg = ExecuteMsg::UpdateConfig { owner: None, - timelock_duration: Some(20), + overrule_pre_propose: Some("neutron1someotheroverrule".to_string()), }; let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); @@ -287,7 +287,7 @@ fn execute_update_config() { let config = Config { owner: Addr::unchecked("owner"), - timelock_duration: 10, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -297,7 +297,7 @@ fn execute_update_config() { let info = mock_info("owner", &[]); let config = Config { owner: Addr::unchecked("none"), - timelock_duration: 10, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -306,7 +306,7 @@ fn execute_update_config() { let config = Config { owner: Addr::unchecked("owner"), - timelock_duration: 10, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -319,18 +319,19 @@ fn execute_update_config() { ]; assert_eq!(expected_attributes, res_ok.attributes); let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); + let some_other_prepropose = "neutron1some_other_prepropose"; assert_eq!( updated_config, Config { owner: Addr::unchecked("owner"), - timelock_duration: 20, + overrule_pre_propose: Addr::unchecked(some_other_prepropose), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) } ); let msg = ExecuteMsg::UpdateConfig { owner: Some("neutron1newowner".to_string()), - timelock_duration: None, + overrule_pre_propose: None, }; let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()).unwrap(); @@ -346,7 +347,7 @@ fn execute_update_config() { updated_config, Config { owner: Addr::unchecked("neutron1newowner"), - timelock_duration: 20, + overrule_pre_propose: Addr::unchecked(some_other_prepropose), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) } ); @@ -361,7 +362,7 @@ fn test_query_config() { let mut deps = mock_dependencies(); let config = Config { owner: Addr::unchecked("owner"), - timelock_duration: 20, + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); From 78159aee5ebcc3cd8c94ef0a76e75600efa92f1e Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Fri, 17 Mar 2023 11:55:48 +0200 Subject: [PATCH 20/53] timelock fixes and tests --- .../src/contract.rs | 10 ++-- .../src/testing/mock_querier.rs | 2 +- .../src/testing/tests.rs | 54 ++++++++++++------- .../neutron-subdao-timelock-single/src/msg.rs | 31 ----------- 4 files changed, 42 insertions(+), 55 deletions(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index e6aebc05..bb3aad86 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -8,6 +8,8 @@ use cw2::set_contract_version; use cw_storage_plus::Bound; use cw_utils::{Duration, Threshold}; use cwd_pre_propose_base::msg::QueryMsg as PreProposeQueryBase; +use cwd_proposal_single::msg::QueryMsg as MainDaoProposalModuleQueryMsg; +use cwd_proposal_single::state::Config as MainDaoProposalModuleConfig; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; use neutron_dao_pre_propose_overrule::msg::{ @@ -16,9 +18,7 @@ use neutron_dao_pre_propose_overrule::msg::{ use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; -use neutron_subdao_timelock_single::msg::{ - ExecuteMsg, InstantiateMsg, MigrateMsg, ProposalConfig, QueryMsg, -}; +use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; use neutron_subdao_timelock_single::types::{ Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, }; @@ -291,9 +291,9 @@ fn get_timelock_duration( let propose: Addr = deps .querier .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::ProposalModule {})?; - let config: ProposalConfig = deps + let config: MainDaoProposalModuleConfig = deps .querier - .query_wasm_smart(propose, &OverruleQueryMsg::ProposalModule {})?; + .query_wasm_smart(propose, &MainDaoProposalModuleQueryMsg::Config {})?; match config.max_voting_period { Duration::Height(_) => Err(ContractError::CantCreateOverrule {}), Duration::Time(duration) => Ok(duration), diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index 235ea008..db450873 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -82,7 +82,7 @@ impl WasmMockQuerier { let q: PreProposeOverruleQuery = from_binary(msg).unwrap(); let reply = match q { PreProposeOverruleQuery::ProposalModule {} => { - todo!() + MOCK_OVERRULE_PROPOSAL.to_string() } PreProposeOverruleQuery::Dao {} => MOCK_MAIN_DAO_ADDR.to_string(), PreProposeOverruleQuery::Config {} => todo!(), diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index b2a4065a..1b4dc01a 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -1,7 +1,8 @@ +use cosmwasm_std::testing::MOCK_CONTRACT_ADDR; use cosmwasm_std::{ from_binary, testing::{mock_env, mock_info}, - Addr, Attribute, Reply, SubMsg, SubMsgResult, + to_binary, Addr, Attribute, CosmosMsg, Reply, SubMsg, SubMsgResult, WasmMsg, }; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; @@ -9,12 +10,14 @@ use neutron_subdao_timelock_single::types::{ Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, }; -use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PROPOSAL}; +use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL}; use crate::{ contract::{execute, instantiate, query, reply}, state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}, testing::mock_querier::MOCK_TIMELOCK_INITIALIZER, }; +use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; +use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; use super::mock_querier::{mock_dependencies, MOCK_SUBDAO_CORE_ADDR}; @@ -24,7 +27,7 @@ fn test_instantiate_test() { let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); let msg = InstantiateMsg { - overrule_pre_propose: MOCK_OVERRULE_PROPOSAL.to_string(), + overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info, msg); assert_eq!( @@ -35,14 +38,14 @@ fn test_instantiate_test() { let info = mock_info(MOCK_TIMELOCK_INITIALIZER, &[]); let msg = InstantiateMsg { - overrule_pre_propose: MOCK_OVERRULE_PROPOSAL.to_string(), + overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg.clone()); let res_ok = res.unwrap(); let expected_attributes = vec![ Attribute::new("action", "instantiate"), Attribute::new("owner", MOCK_MAIN_DAO_ADDR), - Attribute::new("timelock_duration", "10"), + Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), ]; assert_eq!(expected_attributes, res_ok.attributes); let config = CONFIG.load(&deps.storage).unwrap(); @@ -54,14 +57,14 @@ fn test_instantiate_test() { assert_eq!(expected_config, config); let msg = InstantiateMsg { - overrule_pre_propose: MOCK_OVERRULE_PROPOSAL.to_string(), + overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), }; let res = instantiate(deps.as_mut(), env, info, msg.clone()); let res_ok = res.unwrap(); let expected_attributes = vec![ Attribute::new("action", "instantiate"), Attribute::new("owner", MOCK_MAIN_DAO_ADDR), - Attribute::new("timelock_duration", "10"), + Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), ]; assert_eq!(expected_attributes, res_ok.attributes); let config = CONFIG.load(&deps.storage).unwrap(); @@ -92,7 +95,7 @@ fn test_execute_timelock_proposal() { let config = Config { owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -108,7 +111,22 @@ fn test_execute_timelock_proposal() { Attribute::new("status", "timelocked"), ]; assert_eq!(expected_attributes, res_ok.attributes); - assert_eq!(0, res_ok.messages.len()); + assert_eq!(1, res_ok.messages.len()); + + assert_eq!( + res_ok.messages, + vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: MOCK_OVERRULE_PREPROPOSAL.to_string(), + msg: to_binary(&OverruleExecuteMsg::Propose { + msg: OverruleProposeMessage::ProposeOverrule { + timelock_contract: MOCK_CONTRACT_ADDR.to_string(), + proposal_id: 10, + }, + }) + .unwrap(), + funds: vec![], + }))] + ); let expected_proposal = SingleChoiceProposal { id: 10, @@ -136,7 +154,7 @@ fn test_execute_proposal() { let config = Config { owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -216,7 +234,7 @@ fn test_overrule_proposal() { let config = Config { owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -287,7 +305,7 @@ fn execute_update_config() { let config = Config { owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -297,7 +315,7 @@ fn execute_update_config() { let info = mock_info("owner", &[]); let config = Config { owner: Addr::unchecked("none"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -306,7 +324,7 @@ fn execute_update_config() { let config = Config { owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); @@ -315,11 +333,11 @@ fn execute_update_config() { let expected_attributes = vec![ Attribute::new("action", "update_config"), Attribute::new("owner", "owner"), - Attribute::new("timelock_duration", "20"), + Attribute::new("overrule_pre_propose", "neutron1someotheroverrule"), ]; assert_eq!(expected_attributes, res_ok.attributes); let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); - let some_other_prepropose = "neutron1some_other_prepropose"; + let some_other_prepropose = "neutron1someotheroverrule"; assert_eq!( updated_config, Config { @@ -339,7 +357,7 @@ fn execute_update_config() { let expected_attributes = vec![ Attribute::new("action", "update_config"), Attribute::new("owner", "neutron1newowner"), - Attribute::new("timelock_duration", "20"), + Attribute::new("overrule_pre_propose", some_other_prepropose), ]; assert_eq!(expected_attributes, res_ok.attributes); let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); @@ -362,7 +380,7 @@ fn test_query_config() { let mut deps = mock_dependencies(); let config = Config { owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PROPOSAL), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), }; CONFIG.save(deps.as_mut().storage, &config).unwrap(); diff --git a/packages/neutron-subdao-timelock-single/src/msg.rs b/packages/neutron-subdao-timelock-single/src/msg.rs index 2a532906..2b8011d4 100644 --- a/packages/neutron-subdao-timelock-single/src/msg.rs +++ b/packages/neutron-subdao-timelock-single/src/msg.rs @@ -55,34 +55,3 @@ pub enum QueryMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct MigrateMsg {} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct ProposalConfig { - /// 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, - /// 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, - /// The address of the DAO that this governance module is - /// associated with. - pub dao: Addr, - /// If set to true proposals will be closed if their execution - /// fails. Otherwise, proposals will remain open after execution - /// failure. For example, with this enabled a proposal to send 5 - /// tokens out of a DAO's treasury with 4 tokens would be closed when - /// it is executed. With this disabled, that same proposal would - /// remain open until the DAO's treasury was large enough for it to be - /// executed. - pub close_proposal_on_execution_failure: bool, -} From a881fcb2ad09fa37be1d8dfb0f8e68dfd1c292bf Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Fri, 17 Mar 2023 12:10:31 +0200 Subject: [PATCH 21/53] schema fixes --- .../cwd-pre-propose-multiple/examples/schema.rs | 3 ++- .../cwd-pre-propose-single-overrule/examples/schema.rs | 5 +++-- .../cwd-pre-propose-single/examples/schema.rs | 3 ++- contracts/subdaos/cwd-subdao-core/src/contract.rs | 10 +++++++--- .../cwd-subdao-pre-propose-single/examples/schema.rs | 3 ++- packages/neutron-subdao-timelock-single/src/msg.rs | 3 +-- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-multiple/examples/schema.rs b/contracts/dao/pre-propose/cwd-pre-propose-multiple/examples/schema.rs index f07f7d81..e9a121e6 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-multiple/examples/schema.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-multiple/examples/schema.rs @@ -1,3 +1,4 @@ +use cosmwasm_std::Empty; use std::env::current_dir; use std::fs::create_dir_all; @@ -14,7 +15,7 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); export_schema(&schema_for!(DepositInfoResponse), &out_dir); export_schema_with_title(&schema_for!(Addr), &out_dir, "ProposalModuleResponse"); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs index bdf7a0ba..1ee2d192 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs @@ -4,7 +4,8 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cosmwasm_std::Addr; use cwd_pre_propose_base::msg::{DepositInfoResponse, ExecuteMsg, InstantiateMsg, QueryMsg}; -use cwd_pre_propose_overrule::contract::ProposeMessage; +use neutron_dao_pre_propose_overrule::msg::QueryExt; +use neutron_dao_pre_propose_overrule::types::ProposeMessage; fn main() { let mut out_dir = current_dir().unwrap(); @@ -14,7 +15,7 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); export_schema(&schema_for!(DepositInfoResponse), &out_dir); export_schema_with_title(&schema_for!(Addr), &out_dir, "ProposalModuleResponse"); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single/examples/schema.rs b/contracts/dao/pre-propose/cwd-pre-propose-single/examples/schema.rs index c269e8ca..a9526b1a 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single/examples/schema.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single/examples/schema.rs @@ -1,3 +1,4 @@ +use cosmwasm_std::Empty; use std::env::current_dir; use std::fs::create_dir_all; @@ -14,7 +15,7 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); export_schema(&schema_for!(DepositInfoResponse), &out_dir); export_schema_with_title(&schema_for!(Addr), &out_dir, "ProposalModuleResponse"); diff --git a/contracts/subdaos/cwd-subdao-core/src/contract.rs b/contracts/subdaos/cwd-subdao-core/src/contract.rs index bfcc319e..ba5d2386 100644 --- a/contracts/subdaos/cwd-subdao-core/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-core/src/contract.rs @@ -17,6 +17,7 @@ use neutron_subdao_core::msg::{ExecuteMsg, InitialItem, InstantiateMsg, MigrateM use neutron_subdao_core::types::{ Config, DumpStateResponse, GetItemResponse, ProposalModule, ProposalModuleStatus, SubDao, }; +use neutron_subdao_pre_propose_single::msg::QueryExt as PreProposeQueryExt; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQueryMsg; use neutron_subdao_proposal_single::msg::QueryMsg as ProposeQueryMsg; @@ -630,9 +631,12 @@ pub(crate) fn execution_access_check(deps: Deps, sender: Addr) -> Result<(), Con &ProposeQueryMsg::ProposalCreationPolicy {}, )?; if let ProposalCreationPolicy::Module { addr } = policy { - let timelock_contract: Addr = deps - .querier - .query_wasm_smart(&addr, &PreProposeQueryMsg::TimelockAddress {})?; + let timelock_contract: Addr = deps.querier.query_wasm_smart( + &addr, + &PreProposeQueryMsg::QueryExtension { + msg: PreProposeQueryExt::TimelockAddress {}, + }, + )?; if sender == timelock_contract { return Ok(()); } diff --git a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/examples/schema.rs b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/examples/schema.rs index 8923218c..1fb23f13 100644 --- a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/examples/schema.rs +++ b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/examples/schema.rs @@ -4,6 +4,7 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cosmwasm_std::Addr; use cwd_pre_propose_base::msg::{DepositInfoResponse, ExecuteMsg, InstantiateMsg, QueryMsg}; +use neutron_subdao_pre_propose_single::msg::QueryExt; use neutron_subdao_pre_propose_single::types::ProposeMessage; fn main() { @@ -14,7 +15,7 @@ fn main() { export_schema(&schema_for!(InstantiateMsg), &out_dir); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); export_schema(&schema_for!(DepositInfoResponse), &out_dir); export_schema_with_title(&schema_for!(Addr), &out_dir, "ProposalModuleResponse"); diff --git a/packages/neutron-subdao-timelock-single/src/msg.rs b/packages/neutron-subdao-timelock-single/src/msg.rs index 2b8011d4..c493610c 100644 --- a/packages/neutron-subdao-timelock-single/src/msg.rs +++ b/packages/neutron-subdao-timelock-single/src/msg.rs @@ -1,5 +1,4 @@ -use cosmwasm_std::{Addr, CosmosMsg}; -use cw_utils::{Duration, Threshold}; +use cosmwasm_std::CosmosMsg; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; From ff6776f05ac3dac5c5ddacc4f699f7be6db44df5 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:14:42 +0200 Subject: [PATCH 22/53] clippy fixes --- .../src/contract.rs | 11 +++--- .../src/testing/mock_querier.rs | 36 +++++++++---------- .../src/contract.rs | 8 ++--- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index dddf47d5..b15f9511 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -134,13 +134,13 @@ pub fn execute( PROPOSALS.save( deps.storage, - (proposal_id, timelock_contract_addr.clone()), + (proposal_id, timelock_contract_addr), next_proposal_id, )?; PrePropose::default() .execute(deps, env, info, internal_msg) - .map_err(|e| PreProposeOverruleError::PreProposeBase(e)) + .map_err(PreProposeOverruleError::PreProposeBase) } _ => Err(PreProposeOverruleError::MessageUnsupported {}), } @@ -198,7 +198,7 @@ fn check_if_subdao_legit( deps: &DepsMut, subdao_core: &Addr, ) -> Result { - let main_dao = get_main_dao_address(&deps)?; + let main_dao = get_main_dao_address(deps)?; let mut start_after: Option = None; @@ -225,8 +225,7 @@ fn check_if_subdao_legit( if subdao_list .into_iter() - .find(|subdao| subdao.addr == subdao_core.clone().into_string()) - .is_some() + .any(|subdao| subdao.addr == subdao_core.clone().into_string()) { return Ok(true); }; @@ -261,7 +260,7 @@ fn check_is_proposal_timelocked( let proposal: TimelockTypes::SingleChoiceProposal = deps .querier .query_wasm_smart(timelock, &TimelockMsg::QueryMsg::Proposal { proposal_id })?; - return Ok(proposal.status == TimelockTypes::ProposalStatus::Timelocked); + Ok(proposal.status == TimelockTypes::ProposalStatus::Timelocked) } fn get_subdao_name(deps: &DepsMut, subdao: &Addr) -> Result { diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index faef43f0..919ad802 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -70,12 +70,12 @@ impl WasmMockQuerier { match &request { QueryRequest::Wasm(WasmQuery::Smart { contract_addr, msg }) => { let mock = self.contracts.get(contract_addr); - return match mock { + match mock { None => SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.to_string(), }), Some(m) => m.query(msg), - }; + } } _ => self.base.handle_query(request), } @@ -99,7 +99,7 @@ pub struct MockDaoQueries { impl ContractQuerier for MockDaoQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); - return match q { + match q { MainDaoQueryMsg::ListSubDaos { start_after, limit: _, @@ -107,7 +107,7 @@ impl ContractQuerier for MockDaoQueries { &self.sub_dao_list_pages.get(&start_after).unwrap(), ))), _ => SystemResult::Err(SystemError::Unknown {}), - }; + } } } @@ -119,7 +119,7 @@ pub struct MockTimelockQueries { impl ContractQuerier for MockTimelockQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: TimelockMsg::QueryMsg = from_binary(msg).unwrap(); - return match q { + match q { TimelockMsg::QueryMsg::Config {} => { SystemResult::Ok(ContractResult::from(to_binary(&TimelockTypes::Config { owner: Addr::unchecked(self.owner.clone()), @@ -139,7 +139,7 @@ impl ContractQuerier for MockTimelockQueries { }))) } _ => SystemResult::Err(SystemError::Unknown {}), - }; + } } } @@ -150,7 +150,7 @@ pub struct MockDaoProposalQueries { impl ContractQuerier for MockDaoProposalQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: ProposalSingleQueryMsg = from_binary(msg).unwrap(); - return match q { + match q { ProposalSingleQueryMsg::Dao {} => { SystemResult::Ok(ContractResult::from(to_binary(&self.dao_core))) } @@ -158,7 +158,7 @@ impl ContractQuerier for MockDaoProposalQueries { SystemResult::Ok(ContractResult::from(to_binary(&PROPOSALS_COUNT))) } _ => SystemResult::Err(SystemError::Unknown {}), - }; + } } } @@ -169,7 +169,7 @@ pub struct MockSubdaoProposalQueries { impl ContractQuerier for MockSubdaoProposalQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: SubdaoProposalMsg::QueryMsg = from_binary(msg).unwrap(); - return match q { + match q { SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {} => { SystemResult::Ok(ContractResult::from(to_binary( &cwd_voting::pre_propose::ProposalCreationPolicy::Module { @@ -178,7 +178,7 @@ impl ContractQuerier for MockSubdaoProposalQueries { ))) } _ => SystemResult::Err(SystemError::Unknown {}), - }; + } } } @@ -189,14 +189,14 @@ pub struct MockSubaoPreProposalQueries { impl ContractQuerier for MockSubaoPreProposalQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: SubdaoPreProposeQueryMsg = from_binary(msg).unwrap(); - return match q { + match q { SubdaoPreProposeQueryMsg::QueryExtension { msg: SubdaoPreProposeQueryExt::TimelockAddress {}, } => SystemResult::Ok(ContractResult::from(to_binary(&Addr::unchecked( self.timelock.clone(), )))), _ => SystemResult::Err(SystemError::Unknown {}), - }; + } } } @@ -208,7 +208,7 @@ pub struct MockSubdaoCoreQueries { impl ContractQuerier for MockSubdaoCoreQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: SubdaoQueryMsg = from_binary(msg).unwrap(); - return match q { + match q { SubdaoQueryMsg::ProposalModules { start_after: _, limit: _, @@ -229,7 +229,7 @@ impl ContractQuerier for MockSubdaoCoreQueries { }))) } _ => SystemResult::Err(SystemError::Unknown {}), - }; + } } } @@ -279,7 +279,7 @@ pub fn get_properly_initialized_dao() -> HashMap HashMap> { @@ -292,7 +292,7 @@ pub fn get_dao_with_impostor_timelock() -> HashMap HashMap> { @@ -305,7 +305,7 @@ pub fn get_dao_with_impostor_subdao() -> HashMap HashMap> { @@ -335,5 +335,5 @@ pub fn get_dao_with_many_subdaos() -> HashMap> ]), }), ); - return contracts; + contracts } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index bb3aad86..305031c8 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -6,15 +6,12 @@ use cosmwasm_std::{ }; use cw2::set_contract_version; use cw_storage_plus::Bound; -use cw_utils::{Duration, Threshold}; -use cwd_pre_propose_base::msg::QueryMsg as PreProposeQueryBase; +use cw_utils::Duration; use cwd_proposal_single::msg::QueryMsg as MainDaoProposalModuleQueryMsg; use cwd_proposal_single::state::Config as MainDaoProposalModuleConfig; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; -use neutron_dao_pre_propose_overrule::msg::{ - QueryExt as OverruleQueryExt, QueryMsg as OverruleQueryMsg, -}; +use neutron_dao_pre_propose_overrule::msg::QueryMsg as OverruleQueryMsg; use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; @@ -22,7 +19,6 @@ use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg use neutron_subdao_timelock_single::types::{ Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, }; -use std::ops::Add; use crate::error::ContractError; use crate::state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}; From 598b60967d7b6a316afd5df208dbf50e76f69b20 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:16:23 +0200 Subject: [PATCH 23/53] schema regen --- .../schema/query_msg_for__empty.json} | 31 +++++++++- .../schema/query_msg_for__query_ext.json} | 57 ++++++++++++++++++- ...ery_msg.json => query_msg_for__empty.json} | 31 +++++++++- .../schema/config_response.json | 12 ++-- .../schema/execute_msg.json | 10 ++-- .../schema/instantiate_msg.json | 8 +-- .../schema/query_msg_for__query_ext.json} | 43 +++++++++++++- 7 files changed, 166 insertions(+), 26 deletions(-) rename contracts/dao/pre-propose/{cwd-pre-propose-single-overrule/schema/query_msg.json => cwd-pre-propose-multiple/schema/query_msg_for__empty.json} (60%) rename contracts/{subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg.json => dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg_for__query_ext.json} (53%) rename contracts/dao/pre-propose/cwd-pre-propose-single/schema/{query_msg.json => query_msg_for__empty.json} (60%) rename contracts/{dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg.json => subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg_for__query_ext.json} (63%) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg.json b/contracts/dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg_for__empty.json similarity index 60% rename from contracts/dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg.json rename to contracts/dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg_for__empty.json index a057bb1e..f481ed19 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg.json +++ b/contracts/dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg_for__empty.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", + "title": "QueryMsg_for_Empty", "oneOf": [ { "description": "Gets the proposal module that this pre propose module is associated with. Returns `Addr`.", @@ -63,6 +63,33 @@ } }, "additionalProperties": false + }, + { + "description": "Extension for queries. The default implementation will do nothing if queried for will return `Binary::default()`.", + "type": "object", + "required": [ + "query_extension" + ], + "properties": { + "query_extension": { + "type": "object", + "required": [ + "msg" + ], + "properties": { + "msg": { + "$ref": "#/definitions/Empty" + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" } - ] + } } diff --git a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg.json b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg_for__query_ext.json similarity index 53% rename from contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg.json rename to contracts/dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg_for__query_ext.json index a057bb1e..72150917 100644 --- a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg.json +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/schema/query_msg_for__query_ext.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", + "title": "QueryMsg_for_QueryExt", "oneOf": [ { "description": "Gets the proposal module that this pre propose module is associated with. Returns `Addr`.", @@ -63,6 +63,59 @@ } }, "additionalProperties": false + }, + { + "description": "Extension for queries. The default implementation will do nothing if queried for will return `Binary::default()`.", + "type": "object", + "required": [ + "query_extension" + ], + "properties": { + "query_extension": { + "type": "object", + "required": [ + "msg" + ], + "properties": { + "msg": { + "$ref": "#/definitions/QueryExt" + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "QueryExt": { + "oneOf": [ + { + "type": "object", + "required": [ + "overrule_proposal_id" + ], + "properties": { + "overrule_proposal_id": { + "type": "object", + "required": [ + "subdao_proposal_id", + "timelock_address" + ], + "properties": { + "subdao_proposal_id": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + }, + "timelock_address": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] } - ] + } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single/schema/query_msg.json b/contracts/dao/pre-propose/cwd-pre-propose-single/schema/query_msg_for__empty.json similarity index 60% rename from contracts/dao/pre-propose/cwd-pre-propose-single/schema/query_msg.json rename to contracts/dao/pre-propose/cwd-pre-propose-single/schema/query_msg_for__empty.json index a057bb1e..f481ed19 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single/schema/query_msg.json +++ b/contracts/dao/pre-propose/cwd-pre-propose-single/schema/query_msg_for__empty.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", + "title": "QueryMsg_for_Empty", "oneOf": [ { "description": "Gets the proposal module that this pre propose module is associated with. Returns `Addr`.", @@ -63,6 +63,33 @@ } }, "additionalProperties": false + }, + { + "description": "Extension for queries. The default implementation will do nothing if queried for will return `Binary::default()`.", + "type": "object", + "required": [ + "query_extension" + ], + "properties": { + "query_extension": { + "type": "object", + "required": [ + "msg" + ], + "properties": { + "msg": { + "$ref": "#/definitions/Empty" + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Empty": { + "description": "An empty struct that serves as a placeholder in different places, such as contracts that don't set a custom message.\n\nIt is designed to be expressable in correct JSON and JSON Schema but contains no meaningful data. Previously we used enums without cases, but those cannot represented as valid JSON Schema (https://github.com/CosmWasm/cosmwasm/issues/451)", + "type": "object" } - ] + } } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/schema/config_response.json b/contracts/subdaos/cwd-subdao-timelock-single/schema/config_response.json index 42f06433..4e71b722 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/schema/config_response.json +++ b/contracts/subdaos/cwd-subdao-timelock-single/schema/config_response.json @@ -3,21 +3,19 @@ "title": "ConfigResponse", "type": "object", "required": [ + "overrule_pre_propose", "owner", - "subdao", - "timelock_duration" + "subdao" ], "properties": { + "overrule_pre_propose": { + "$ref": "#/definitions/Addr" + }, "owner": { "$ref": "#/definitions/Addr" }, "subdao": { "$ref": "#/definitions/Addr" - }, - "timelock_duration": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 } }, "definitions": { diff --git a/contracts/subdaos/cwd-subdao-timelock-single/schema/execute_msg.json b/contracts/subdaos/cwd-subdao-timelock-single/schema/execute_msg.json index d0c75f3b..92a2c75a 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/schema/execute_msg.json +++ b/contracts/subdaos/cwd-subdao-timelock-single/schema/execute_msg.json @@ -84,19 +84,17 @@ "update_config": { "type": "object", "properties": { - "owner": { + "overrule_pre_propose": { "type": [ "string", "null" ] }, - "timelock_duration": { + "owner": { "type": [ - "integer", + "string", "null" - ], - "format": "uint64", - "minimum": 0.0 + ] } } } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/schema/instantiate_msg.json b/contracts/subdaos/cwd-subdao-timelock-single/schema/instantiate_msg.json index 1f434048..cb81f9a9 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/schema/instantiate_msg.json +++ b/contracts/subdaos/cwd-subdao-timelock-single/schema/instantiate_msg.json @@ -3,13 +3,11 @@ "title": "InstantiateMsg", "type": "object", "required": [ - "timelock_duration" + "overrule_pre_propose" ], "properties": { - "timelock_duration": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 + "overrule_pre_propose": { + "type": "string" } } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg.json b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg_for__query_ext.json similarity index 63% rename from contracts/dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg.json rename to contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg_for__query_ext.json index a057bb1e..e6f4a6ea 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-multiple/schema/query_msg.json +++ b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/schema/query_msg_for__query_ext.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "QueryMsg", + "title": "QueryMsg_for_QueryExt", "oneOf": [ { "description": "Gets the proposal module that this pre propose module is associated with. Returns `Addr`.", @@ -63,6 +63,45 @@ } }, "additionalProperties": false + }, + { + "description": "Extension for queries. The default implementation will do nothing if queried for will return `Binary::default()`.", + "type": "object", + "required": [ + "query_extension" + ], + "properties": { + "query_extension": { + "type": "object", + "required": [ + "msg" + ], + "properties": { + "msg": { + "$ref": "#/definitions/QueryExt" + } + } + } + }, + "additionalProperties": false + } + ], + "definitions": { + "QueryExt": { + "oneOf": [ + { + "type": "object", + "required": [ + "timelock_address" + ], + "properties": { + "timelock_address": { + "type": "object" + } + }, + "additionalProperties": false + } + ] } - ] + } } From 51d7ef629f0bdc80c3e20f258275f42ab731121f Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 21 Mar 2023 16:21:34 +0200 Subject: [PATCH 24/53] refactoring --- Cargo.lock | 2 -- .../examples/schema.rs | 3 +-- .../src/contract.rs | 12 +++++----- .../src/testing/tests.rs | 4 ++-- .../src/contract.rs | 18 +++++++------- .../src/testing/tests.rs | 11 +++++---- .../Cargo.toml | 2 -- .../src/lib.rs | 1 - .../src/msg.rs | 24 +++++++------------ .../src/types.rs | 11 --------- 10 files changed, 34 insertions(+), 54 deletions(-) delete mode 100644 packages/neutron-dao-pre-propose-overrule/src/types.rs diff --git a/Cargo.lock b/Cargo.lock index 24c71bda..028b56da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1300,7 +1300,6 @@ name = "neutron-dao-pre-propose-overrule" version = "0.1.0" dependencies = [ "cosmwasm-std", - "cwd-core", "cwd-interface", "cwd-pre-propose-base", "cwd-voting", @@ -1308,7 +1307,6 @@ dependencies = [ "neutron-subdao-core", "neutron-subdao-pre-propose-single", "neutron-subdao-proposal-single", - "neutron-subdao-timelock-single", "schemars", "serde", "thiserror", diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs index 1ee2d192..ad9a7a4e 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/examples/schema.rs @@ -4,8 +4,7 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; use cosmwasm_std::Addr; use cwd_pre_propose_base::msg::{DepositInfoResponse, ExecuteMsg, InstantiateMsg, QueryMsg}; -use neutron_dao_pre_propose_overrule::msg::QueryExt; -use neutron_dao_pre_propose_overrule::types::ProposeMessage; +use neutron_dao_pre_propose_overrule::msg::{ProposeMessage, QueryExt}; fn main() { let mut out_dir = current_dir().unwrap(); diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index b15f9511..3f37fb94 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -8,21 +8,21 @@ use cw2::set_contract_version; use error::PreProposeOverruleError; use crate::error; -use neutron_dao_pre_propose_overrule::msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryExt, QueryMsg, -}; -// use crate::state::{Config, CONFIG}; use cwd_pre_propose_base::{ error::PreProposeError, msg::{ExecuteMsg as ExecuteBase, InstantiateMsg as InstantiateBase}, state::PreProposeContract, }; +use neutron_dao_pre_propose_overrule::msg::{ + ExecuteMsg, InstantiateMsg, ProposeMessage, QueryExt, QueryMsg, +}; use crate::state::PROPOSALS; use cwd_core::{msg::QueryMsg as MainDaoQueryMsg, query::SubDao}; -use cwd_proposal_single::msg::QueryMsg as ProposalSingleQueryMsg; +use cwd_proposal_single::{ + msg::ExecuteMsg as ProposeMessageInternal, msg::QueryMsg as ProposalSingleQueryMsg, +}; use cwd_voting::pre_propose::ProposalCreationPolicy; -use neutron_dao_pre_propose_overrule::types::ProposeMessage; use neutron_subdao_core::{msg::QueryMsg as SubdaoQueryMsg, types as SubdaoTypes}; use neutron_subdao_pre_propose_single::msg::{ QueryExt as SubdaoPreProposeQueryExt, QueryMsg as SubdaoPreProposeQueryMsg, diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 0a1a48b4..a981a64a 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -10,7 +10,7 @@ use crate::{ testing::mock_querier::{mock_dependencies, MOCK_DAO_CORE, MOCK_TIMELOCK_CONTRACT}, }; use neutron_dao_pre_propose_overrule::msg::{ - ExecuteMsg, InstantiateMsg, ProposeMessageInternal, QueryExt, QueryMsg, + ExecuteMsg, InstantiateMsg, ProposeMessage, QueryExt, QueryMsg, }; use crate::error::PreProposeOverruleError; @@ -21,7 +21,7 @@ use crate::testing::mock_querier::{ TIMELOCKED_PROPOSAL_ID, }; use cwd_pre_propose_base::state::Config; -use neutron_dao_pre_propose_overrule::types::ProposeMessage; +use cwd_proposal_single::msg::ExecuteMsg as ProposeMessageInternal; use neutron_subdao_timelock_single::msg as TimelockMsg; pub fn init_base_contract(deps: DepsMut) { diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 305031c8..658af6a4 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -7,17 +7,19 @@ use cosmwasm_std::{ use cw2::set_contract_version; use cw_storage_plus::Bound; use cw_utils::Duration; -use cwd_proposal_single::msg::QueryMsg as MainDaoProposalModuleQueryMsg; -use cwd_proposal_single::state::Config as MainDaoProposalModuleConfig; +use cwd_proposal_single::{ + msg::QueryMsg as MainDaoProposalModuleQueryMsg, state::Config as MainDaoProposalModuleConfig, +}; use neutron_bindings::bindings::msg::NeutronMsg; -use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; -use neutron_dao_pre_propose_overrule::msg::QueryMsg as OverruleQueryMsg; -use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; +use neutron_dao_pre_propose_overrule::msg::{ + ExecuteMsg as OverruleExecuteMsg, ProposeMessage as OverruleProposeMessage, + QueryMsg as OverruleQueryMsg, +}; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; -use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}; -use neutron_subdao_timelock_single::types::{ - Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, +use neutron_subdao_timelock_single::{ + msg::{ExecuteMsg, InstantiateMsg, MigrateMsg, QueryMsg}, + types::{Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal}, }; use crate::error::ContractError; diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index 1b4dc01a..36ef13f8 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -5,9 +5,9 @@ use cosmwasm_std::{ to_binary, Addr, Attribute, CosmosMsg, Reply, SubMsg, SubMsgResult, WasmMsg, }; use neutron_bindings::bindings::msg::NeutronMsg; -use neutron_subdao_timelock_single::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; -use neutron_subdao_timelock_single::types::{ - Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal, +use neutron_subdao_timelock_single::{ + msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, + types::{Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal}, }; use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL}; @@ -16,8 +16,9 @@ use crate::{ state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}, testing::mock_querier::MOCK_TIMELOCK_INITIALIZER, }; -use neutron_dao_pre_propose_overrule::msg::ExecuteMsg as OverruleExecuteMsg; -use neutron_dao_pre_propose_overrule::types::ProposeMessage as OverruleProposeMessage; +use neutron_dao_pre_propose_overrule::msg::{ + ExecuteMsg as OverruleExecuteMsg, ProposeMessage as OverruleProposeMessage, +}; use super::mock_querier::{mock_dependencies, MOCK_SUBDAO_CORE_ADDR}; diff --git a/packages/neutron-dao-pre-propose-overrule/Cargo.toml b/packages/neutron-dao-pre-propose-overrule/Cargo.toml index 3ebf7989..5098a540 100644 --- a/packages/neutron-dao-pre-propose-overrule/Cargo.toml +++ b/packages/neutron-dao-pre-propose-overrule/Cargo.toml @@ -18,7 +18,5 @@ cwd-voting = { path = "../cwd-voting" } cwd-interface = { path = "../cwd-interface" } thiserror = { version = "1.0.31" } neutron-subdao-core = { version = "*", path = "../neutron-subdao-core" } -cwd-core = { version = "*", path = "../../contracts/dao/cwd-core" } -neutron-subdao-timelock-single = { version = "*", path = "../neutron-subdao-timelock-single" } neutron-subdao-proposal-single = { version = "*", path = "../neutron-subdao-proposal-single" } neutron-subdao-pre-propose-single = { version = "*", path = "../neutron-subdao-pre-propose-single" } diff --git a/packages/neutron-dao-pre-propose-overrule/src/lib.rs b/packages/neutron-dao-pre-propose-overrule/src/lib.rs index c413ff51..d0e87a0d 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/lib.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/lib.rs @@ -1,2 +1 @@ pub mod msg; -pub mod types; diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs index 71df8a72..4bba999d 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/msg.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -1,10 +1,18 @@ -use crate::types::ProposeMessage; use cosmwasm_std::CosmosMsg; use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum ProposeMessage { + ProposeOverrule { + timelock_contract: String, + proposal_id: u64, + }, +} + pub type ExecuteMsg = ExecuteBase; #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] @@ -13,20 +21,6 @@ pub struct InstantiateMsg { pub main_dao: String, } -/// Internal version of the propose message that includes the -/// `proposer` field. The module will fill this in based on the sender -/// of the external message. -#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum ProposeMessageInternal { - Propose { - title: String, - description: String, - msgs: Vec>, - proposer: Option, - }, -} - #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum QueryExt { diff --git a/packages/neutron-dao-pre-propose-overrule/src/types.rs b/packages/neutron-dao-pre-propose-overrule/src/types.rs deleted file mode 100644 index 3a483ff3..00000000 --- a/packages/neutron-dao-pre-propose-overrule/src/types.rs +++ /dev/null @@ -1,11 +0,0 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] -#[serde(rename_all = "snake_case")] -pub enum ProposeMessage { - ProposeOverrule { - timelock_contract: String, - proposal_id: u64, - }, -} From c0def325cad7ed61ef82b668bdc7b3110a4b6d86 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Wed, 22 Mar 2023 19:38:27 +0200 Subject: [PATCH 25/53] fix imports to make release build pass --- artifacts/checksums.txt | 18 ++++++++--------- artifacts/checksums_intermediate.txt | 19 +++++++++--------- artifacts/cwd_core.wasm | Bin 396365 -> 395801 bytes artifacts/cwd_pre_propose_multiple.wasm | Bin 348935 -> 350757 bytes artifacts/cwd_pre_propose_overrule.wasm | Bin 261200 -> 402426 bytes artifacts/cwd_pre_propose_single.wasm | Bin 343611 -> 345433 bytes artifacts/cwd_proposal_multiple.wasm | Bin 523198 -> 523198 bytes artifacts/cwd_subdao_core.wasm | Bin 410502 -> 410968 bytes artifacts/cwd_subdao_pre_propose_single.wasm | Bin 370700 -> 371561 bytes artifacts/cwd_subdao_proposal_single.wasm | Bin 485722 -> 485722 bytes artifacts/cwd_subdao_timelock_single.wasm | Bin 302184 -> 325130 bytes .../Cargo.toml | 4 ++-- 12 files changed, 20 insertions(+), 21 deletions(-) diff --git a/artifacts/checksums.txt b/artifacts/checksums.txt index c3e9497a..a560c621 100644 --- a/artifacts/checksums.txt +++ b/artifacts/checksums.txt @@ -1,17 +1,17 @@ e8b52fab268f7bb5538b4b81e284a89eee824e4b9f9430eb147f64601bea3363 credits_vault.wasm e1f198ec554470bd05f4081cf2309035a1369152b147bdc2ca2fad7120364641 cw4_group.wasm 187c5a1e98b14384bf2e1bbbfddde4214f7e10e00dd5369c68f4dc3363a8a7bf cw4_voting.wasm -6fc1a396d4763097b7b260a083e1c7f9de8d92b1a020c18cceee29f055d72df2 cwd_core.wasm -c7ddd8a95dc3d1912249f12e7b036d9daeaac07af1e2c77ebe92a97aaab125b8 cwd_pre_propose_multiple.wasm -047169a6e4e4b6fc5b2f7550376b2f1648554c54837f7631afa07fc3c6c34ce8 cwd_pre_propose_overrule.wasm -35be8f8ebecfd8893eded5d63148fd1f68733a525f8f7a42f8b70c11bbaf60fb cwd_pre_propose_single.wasm -77c2d5ef5199a936905920e53c8435b9bf89e919c4552a679813902ecc3b1d77 cwd_proposal_multiple.wasm +676a948ace3832aaca1ffcb0809525bd8545437425eb22b39a640c4731b17e3f cwd_core.wasm +809f202fee0c0ecca955598369b6d735b9e194aca65190f3c6b1322ece51dbe0 cwd_pre_propose_multiple.wasm +60a3db047c83fbb69830d5454a2442d0ec61d640ea95df6760d3fbbe4c8bef9d cwd_pre_propose_overrule.wasm +12a3e52d9d72f031921b16442b8b9e7a4a70de4630acd5cbe148878c273ded3b cwd_pre_propose_single.wasm +994330de9edb83f32e1364f9d65ddcc37669bd2d22071220bad2028a93b82d5e cwd_proposal_multiple.wasm 64d3e3dc1db548307654dd585f1bad1d3dc00d2758d2b71d988a71333bcea3c6 cwd_proposal_single.wasm -8f86441f544654e6012cf4e56670c0ddbd2275c80aba64c923fe349889e0ed43 cwd_subdao_core.wasm +b769d72485a1a53d0cdc4061b09dc8f52000a2a624b986b586b11c2b23dc8df8 cwd_subdao_core.wasm bdddd6ea8f7dc36e1b73d97c7caf20f59a3f2e3544a307098fbd02d838f260bd cwd_subdao_pre_propose_overrule.wasm -e98782b00d3a36f85dfe899025848beae3b330deefb818204d6251e431417f1a cwd_subdao_pre_propose_single.wasm -be0fb8de87fad3da5f4fee52b27dbcef6426af56692401945873b2b0894779cc cwd_subdao_proposal_single.wasm -aed528b20c9d432414858d0a825e945365145b3d375cb174fd7a8ba4f7234693 cwd_subdao_timelock_single.wasm +e9a1837eb0dbc795b38fe06ccff808f78ef1f39bb218fabf724a4fb054e70f8b cwd_subdao_pre_propose_single.wasm +f84afbe69f489c754a5ca09ce0e2b159606f9339d9b5389a2c60d76899b2770d cwd_subdao_proposal_single.wasm +928e49c1c009876a56876bde89b681d5d66dbe9ebca9bdf39bde76e35ce7d7da cwd_subdao_timelock_single.wasm a6a0f619d52fc90ab59e15358f7a5b2a34e570e31cdbf6881037198bc877c2ab lockdrop_vault.wasm 9bbd1d908adc2e3d50ae3f3d74073a4d39c437c6b389fed2163eff3bf238ee28 neutron_distribution.wasm 8c58519e5a278fbce1c912a5832cab7e29768b69f05c2338e2a10d584c517c5a neutron_reserve.wasm diff --git a/artifacts/checksums_intermediate.txt b/artifacts/checksums_intermediate.txt index b8f945e4..9ef80ad7 100644 --- a/artifacts/checksums_intermediate.txt +++ b/artifacts/checksums_intermediate.txt @@ -1,18 +1,17 @@ -5683c77f46619bea0dfc466792110a0008c447f9fec08e6e929892f70f11a53c target/wasm32-unknown-unknown/release/cwd_pre_propose_multiple.wasm -d328a563a7125e5c1bd8d31004eacfea2417467efc040aac2ecc981040f566a6 target/wasm32-unknown-unknown/release/cwd_pre_propose_overrule.wasm -9045a14917b5fe2aae20e8778bdb315ddee88dcd3f38e6d86fd2e1e820e585d0 target/wasm32-unknown-unknown/release/cwd_pre_propose_single.wasm -1ae934f9b3e188a4d7096f4f9231edfad84a482a33a66e90b5d0ce124065c062 target/wasm32-unknown-unknown/release/cwd_subdao_pre_propose_single.wasm 91be9e3bbb44c0abfafc1602887348ac67c41511c6f2cbbca26e945e7125b159 target/wasm32-unknown-unknown/release/neutron_distribution.wasm 2243d1d288ebc8c8110a95ea69226ba9012ffd79cad637147c6e9aa5a27c7942 target/wasm32-unknown-unknown/release/neutron_treasury.wasm -d328a563a7125e5c1bd8d31004eacfea2417467efc040aac2ecc981040f566a6 target/wasm32-unknown-unknown/release/cwd_pre_propose_overrule.wasm -98d530814928c28813685bdd634d33c6d10bde7d8d3d14054dd28c18ecc082c7 target/wasm32-unknown-unknown/release/cwd_core.wasm -182595fe1ffd93701b14c6f04d5ac40af1f43aabcfbdb7144b63d609a87154d0 target/wasm32-unknown-unknown/release/cwd_subdao_core.wasm -5f5de39421089a6edc7f6e8bbcfe90aa57115e6257d8f3e2c4ee9f026a8acf0e target/wasm32-unknown-unknown/release/cwd_subdao_proposal_single.wasm -2cbd1aeb99f73a7089fbcb94140096585c4db4611fb342a6e9843989feee1fd2 target/wasm32-unknown-unknown/release/cwd_subdao_timelock_single.wasm 958d16502995b3793d757debf31462925a83d2a7ff64a9085cb039cdc647c6a6 target/wasm32-unknown-unknown/release/neutron_reserve.wasm -78764327dccf528394eb79786bb75d8737687dfff33ea8e0497a71276a7ee926 target/wasm32-unknown-unknown/release/cwd_proposal_multiple.wasm fc79389148ad4653d8a9da2926c683d297b0c7ddce8bf2a865c70e0897cdb176 target/wasm32-unknown-unknown/release/cwd_proposal_single.wasm d433ee1fb4e4776d6099018f1ed0fae7ac965b519a2a7cd73d13eddeba32fa19 target/wasm32-unknown-unknown/release/lockdrop_vault.wasm 1ad122156a805c1f22ea37baf521605b5bedd761b22973bf69192de331e30bd2 target/wasm32-unknown-unknown/release/neutron_vault.wasm 55eabfcd6370e5774f67dc9517fcf6361f73bb53f17f129987cf4929227edd5b target/wasm32-unknown-unknown/release/neutron_voting_registry.wasm 98389aad0f011b85b7092660c807d8a80c5a96f68321f17eb0cf12feed478106 target/wasm32-unknown-unknown/release/credits_vault.wasm +e77eedef6c4bccd4f5a9d01d51384438b28698c69ac62bb04e721e01a6d53e77 target/wasm32-unknown-unknown/release/cwd_core.wasm +1380040e816ce1afff68c21fce60f0019fb939c709a3785aabf5a2544171e1c5 target/wasm32-unknown-unknown/release/cwd_pre_propose_multiple.wasm +67498ef6345dcca00cd1872a6001dffeee05482aaa213bed32224f9b26a3caa8 target/wasm32-unknown-unknown/release/cwd_pre_propose_overrule.wasm +531d65991cf499437f88b290b39dfc08b8985c7e7af4eb25afe5275ff3fbba54 target/wasm32-unknown-unknown/release/cwd_pre_propose_single.wasm +310bcf72e4189d76ab60a95624693f4be2a413715c5d1a938b270b4e14f9813d target/wasm32-unknown-unknown/release/cwd_proposal_multiple.wasm +cb5780133dd1fcf855d40da1491f7a6fee8f2282e171e181d722c25c5388b40b target/wasm32-unknown-unknown/release/cwd_subdao_core.wasm +b44285b6abc42412b683822e86ad1d14f169ede64e14a90e357d076b1378b5b1 target/wasm32-unknown-unknown/release/cwd_subdao_pre_propose_single.wasm +94304c0d6e7ab6126d2d8f3a8f3db3cf7e371896939d3a51d14046458584e151 target/wasm32-unknown-unknown/release/cwd_subdao_proposal_single.wasm +b363f543f66e8473c7e8dd47d5a4e4bcb8fda775114ea6e25064a05d70ee31bf target/wasm32-unknown-unknown/release/cwd_subdao_timelock_single.wasm diff --git a/artifacts/cwd_core.wasm b/artifacts/cwd_core.wasm index ec3d4272da62f262ee29619bdc23ab9e84411016..618c498a59e258b1875689ec96d2cdb9ae0093ae 100644 GIT binary patch delta 98997 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 z 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


y{{M$9S@7R)PnISh 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 Rc3u2_0rL;wx9(Qg{{g@T*RB8n delta 26742 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

GoymgT2aYY!W`K&mwhXj%LMR8*E`0VYBj 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%0Dm3~y`%obw<^!4MX*e|@&hoIV#3$j2H) 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

m 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 G$n$SV@O(S~ diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml index f9660ced..847fea16 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml @@ -26,12 +26,12 @@ neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron- schemars = "0.8.8" thiserror = { version = "1.0.31" } neutron-subdao-core = { version = "*", path = "../../../../packages/neutron-subdao-core" } -cwd-core = { version = "*", path = "../../../../contracts/dao/cwd-core" } +cwd-core = { version = "*", path = "../../../../contracts/dao/cwd-core", features = ["library"] } neutron-subdao-timelock-single = { version = "*", path = "../../../../packages/neutron-subdao-timelock-single" } neutron-subdao-proposal-single = { version = "*", path = "../../../../packages/neutron-subdao-proposal-single" } neutron-subdao-pre-propose-single = { version = "*", path = "../../../../packages/neutron-subdao-pre-propose-single" } neutron-dao-pre-propose-overrule = { version = "*", path = "../../../../packages/neutron-dao-pre-propose-overrule" } -cwd-proposal-single = { version = "*", path = "../../../../contracts/dao/proposal/cwd-proposal-single" } +cwd-proposal-single = { version = "*", path = "../../../../contracts/dao/proposal/cwd-proposal-single", features = ["library"] } [dev-dependencies] cosmwasm-schema = "1.0.0" From 2c693097e9f49c0b16c37565adcb2b12f32d7912 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 23 Mar 2023 18:35:01 +0200 Subject: [PATCH 26/53] clippy fixes --- packages/neutron-dao-pre-propose-overrule/src/msg.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs index 4bba999d..b99d7010 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/msg.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -1,6 +1,4 @@ -use cosmwasm_std::CosmosMsg; use cwd_pre_propose_base::msg::{ExecuteMsg as ExecuteBase, QueryMsg as QueryBase}; -use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; From b21d9d428d2108f83cbd83d633f2ec7768d6273a Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 28 Mar 2023 13:29:32 +0300 Subject: [PATCH 27/53] init msg fix --- .../cwd-pre-propose-single-overrule/src/testing/tests.rs | 4 +--- packages/neutron-dao-pre-propose-overrule/src/msg.rs | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index a981a64a..7fe34bda 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -25,9 +25,7 @@ use cwd_proposal_single::msg::ExecuteMsg as ProposeMessageInternal; use neutron_subdao_timelock_single::msg as TimelockMsg; pub fn init_base_contract(deps: DepsMut) { - let msg = InstantiateMsg { - main_dao: MOCK_DAO_CORE.to_string(), - }; + let msg = InstantiateMsg {}; let info = mock_info(MOCK_DAO_PROPOSE_MODULE, &[]); instantiate(deps, mock_env(), info, msg).unwrap(); } diff --git a/packages/neutron-dao-pre-propose-overrule/src/msg.rs b/packages/neutron-dao-pre-propose-overrule/src/msg.rs index b99d7010..f495963e 100644 --- a/packages/neutron-dao-pre-propose-overrule/src/msg.rs +++ b/packages/neutron-dao-pre-propose-overrule/src/msg.rs @@ -15,9 +15,7 @@ pub type ExecuteMsg = ExecuteBase; #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -pub struct InstantiateMsg { - pub main_dao: String, -} +pub struct InstantiateMsg {} #[derive(Serialize, Deserialize, Clone, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] From 3192ee06010c6987596978ac537da9d1681089ae Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Mon, 3 Apr 2023 16:38:56 +0300 Subject: [PATCH 28/53] fix --- .../dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs index e307217b..94d30a08 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs @@ -1,5 +1,3 @@ -extern crate core; - pub mod contract; pub mod error; pub mod state; From cc5e3ecbc336a80e2a0316f943b741cb77e41ee4 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Mon, 3 Apr 2023 17:05:33 +0300 Subject: [PATCH 29/53] removing redundant deps --- Cargo.lock | 9 --------- contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml | 2 +- packages/neutron-dao-pre-propose-overrule/Cargo.toml | 8 -------- packages/neutron-subdao-timelock-single/Cargo.toml | 1 - 4 files changed, 1 insertion(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26dac37a..cd9d701a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1299,17 +1299,9 @@ dependencies = [ name = "neutron-dao-pre-propose-overrule" version = "0.1.0" dependencies = [ - "cosmwasm-std", - "cwd-interface", "cwd-pre-propose-base", - "cwd-voting", - "neutron-sdk", - "neutron-subdao-core", - "neutron-subdao-pre-propose-single", - "neutron-subdao-proposal-single", "schemars", "serde", - "thiserror", ] [[package]] @@ -1420,7 +1412,6 @@ name = "neutron-subdao-timelock-single" version = "0.1.0" dependencies = [ "cosmwasm-std", - "cw-utils 0.13.4", "neutron-sdk", "schemars", "serde", diff --git a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml index bf1e8567..5eb72f96 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml +++ b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml @@ -33,7 +33,7 @@ neutron-subdao-timelock-single = { path = "../../../packages/neutron-subdao-time cwd-pre-propose-base = { path = "../../../packages/cwd-pre-propose-base" } neutron-subdao-core = { path = "../../../packages/neutron-subdao-core" } neutron-dao-pre-propose-overrule = { path = "../../../packages/neutron-dao-pre-propose-overrule" } -cwd-proposal-single = { path = "../../../contracts/dao/proposal/cwd-proposal-single" } +cwd-proposal-single = { path = "../../../contracts/dao/proposal/cwd-proposal-single", features = ["library"]} cwd-voting = { path = "../../../packages/cwd-voting" } [dev-dependencies] diff --git a/packages/neutron-dao-pre-propose-overrule/Cargo.toml b/packages/neutron-dao-pre-propose-overrule/Cargo.toml index 5098a540..2b972c70 100644 --- a/packages/neutron-dao-pre-propose-overrule/Cargo.toml +++ b/packages/neutron-dao-pre-propose-overrule/Cargo.toml @@ -12,11 +12,3 @@ repository = "https://github.com/neutron/neutron-dao" cwd-pre-propose-base = { version = "*", path = "../cwd-pre-propose-base" } schemars = "0.8" serde = { version = "1.0.147", default-features = false, features = ["derive"] } -cosmwasm-std = "1.0.0" -neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron-org/neutron-sdk.git", rev = "c19b40c024eeaa8733af9ddee94a52798d78f469" } -cwd-voting = { path = "../cwd-voting" } -cwd-interface = { path = "../cwd-interface" } -thiserror = { version = "1.0.31" } -neutron-subdao-core = { version = "*", path = "../neutron-subdao-core" } -neutron-subdao-proposal-single = { version = "*", path = "../neutron-subdao-proposal-single" } -neutron-subdao-pre-propose-single = { version = "*", path = "../neutron-subdao-pre-propose-single" } diff --git a/packages/neutron-subdao-timelock-single/Cargo.toml b/packages/neutron-subdao-timelock-single/Cargo.toml index 39e721c4..a06e7c80 100644 --- a/packages/neutron-subdao-timelock-single/Cargo.toml +++ b/packages/neutron-subdao-timelock-single/Cargo.toml @@ -10,4 +10,3 @@ neutron_bindings = { package = "neutron-sdk", git = "https://github.com/neutron- cosmwasm-std = { version = "1.0.0" } schemars = "0.8" serde = { version = "1.0.147", default-features = false, features = ["derive"] } -cw-utils = "0.13" From f55bf39d103dbda5e4bfc9fb34dba5e5606d46e2 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:06:19 +0300 Subject: [PATCH 30/53] timelock proposal tracks the overrule proposal status now --- .../src/testing/mock_querier.rs | 1 - .../src/contract.rs | 28 +- .../src/testing/mock_querier.rs | 59 +- .../src/testing/tests.rs | 860 +++++++++--------- .../src/types.rs | 3 - 5 files changed, 485 insertions(+), 466 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 919ad802..4585c28c 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -130,7 +130,6 @@ impl ContractQuerier for MockTimelockQueries { TimelockMsg::QueryMsg::Proposal { proposal_id } => { SystemResult::Ok(ContractResult::from(to_binary(&SingleChoiceProposal { id: proposal_id, - timelock_ts: Default::default(), msgs: vec![], status: match proposal_id { TIMELOCKED_PROPOSAL_ID => ProposalStatus::Timelocked, diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index c16c1e91..88699ce0 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -8,12 +8,14 @@ use cw2::set_contract_version; use cw_storage_plus::Bound; use cw_utils::Duration; use cwd_proposal_single::{ - msg::QueryMsg as MainDaoProposalModuleQueryMsg, state::Config as MainDaoProposalModuleConfig, + msg::QueryMsg as MainDaoProposalModuleQueryMsg, state::Config as MainDaoProposalModuleConfig, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal }; +use cwd_voting::status::Status; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_dao_pre_propose_overrule::msg::{ ExecuteMsg as OverruleExecuteMsg, ProposeMessage as OverruleProposeMessage, QueryMsg as OverruleQueryMsg, + QueryExt as OverruleQueryExt, }; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; @@ -105,7 +107,6 @@ pub fn execute_timelock_proposal( let proposal = SingleChoiceProposal { id: proposal_id, msgs, - timelock_ts: env.block.time, status: ProposalStatus::Timelocked, }; @@ -149,10 +150,7 @@ pub fn execute_execute_proposal( }); } - let timelock_duration = get_timelock_duration(&deps, &config.overrule_pre_propose)?; - - // Check if timelock has passed - if env.block.time.seconds() < (timelock_duration + proposal.timelock_ts.seconds()) { + if !is_overrule_proposal_rejected(&deps, &env, &config.overrule_pre_propose, proposal.id)? { return Err(ContractError::TimeLocked {}); } @@ -280,20 +278,22 @@ pub fn migrate(deps: DepsMut, _env: Env, _msg: MigrateMsg) -> Result Result { + subdao_proposal_id: u64, +) -> Result { + let overrule_proposal_id: u64 = deps + .querier + .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::QueryExtension { msg: OverruleQueryExt::OverruleProposalId { timelock_address: env.contract.address.to_string(), subdao_proposal_id }})?; let propose: Addr = deps .querier .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::ProposalModule {})?; - let config: MainDaoProposalModuleConfig = deps + let overrule_proposal: MainDaoSingleChoiceProposal = deps .querier - .query_wasm_smart(propose, &MainDaoProposalModuleQueryMsg::Config {})?; - match config.max_voting_period { - Duration::Height(_) => Err(ContractError::CantCreateOverrule {}), - Duration::Time(duration) => Ok(duration), - } + .query_wasm_smart(propose, &MainDaoProposalModuleQueryMsg::Proposal { proposal_id: overrule_proposal_id })?; + Ok(overrule_proposal.status == Status::Rejected) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index db450873..4a4e0017 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -1,17 +1,18 @@ +use std::borrow::Borrow; +use std::cell::RefCell; use std::marker::PhantomData; +use std::rc::Rc; -use cosmwasm_std::{ - from_binary, from_slice, - testing::{MockApi, MockQuerier, MockStorage}, - to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, - SystemError, SystemResult, WasmQuery, -}; +use cosmwasm_std::{from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, Uint128}; use cw_utils::Duration; use cwd_proposal_single::{ msg::{QueryMsg as ProposeQuery, QueryMsg}, state::Config as OverrulProposalConfig, + proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal }; +use cwd_voting::status::Status; use cwd_voting::threshold::Threshold; +use cwd_voting::voting::Votes; use neutron_dao_pre_propose_overrule::msg::{ QueryExt as PreProposeOverruleQueryExt, QueryMsg as PreProposeOverruleQuery, }; @@ -25,11 +26,12 @@ pub const MOCK_MAIN_DAO_ADDR: &str = "neutron1main_dao_core_contract"; pub const MOCK_OVERRULE_PROPOSAL: &str = "neutron1main_dao_overrule_proposal"; pub const MOCK_OVERRULE_PREPROPOSAL: &str = "neutron1main_dao_overrule_preproposal"; -pub fn mock_dependencies() -> OwnedDeps { - let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[])); +pub fn mock_dependencies(x: Rc>) -> OwnedDeps { + let custom_storage = MockStorage::default(); + let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[]), x); OwnedDeps { - storage: MockStorage::default(), + storage: custom_storage, api: MockApi::default(), querier: custom_querier, custom_query_type: PhantomData, @@ -38,6 +40,7 @@ pub fn mock_dependencies() -> OwnedDeps { pub struct WasmMockQuerier { base: MockQuerier, + overrule_proposal_status: Rc>, } impl Querier for WasmMockQuerier { @@ -82,21 +85,21 @@ impl WasmMockQuerier { let q: PreProposeOverruleQuery = from_binary(msg).unwrap(); let reply = match q { PreProposeOverruleQuery::ProposalModule {} => { - MOCK_OVERRULE_PROPOSAL.to_string() + to_binary(&MOCK_OVERRULE_PROPOSAL.to_string()) } - PreProposeOverruleQuery::Dao {} => MOCK_MAIN_DAO_ADDR.to_string(), + PreProposeOverruleQuery::Dao {} => to_binary(&MOCK_MAIN_DAO_ADDR.to_string()), PreProposeOverruleQuery::Config {} => todo!(), PreProposeOverruleQuery::DepositInfo { proposal_id: _ } => todo!(), PreProposeOverruleQuery::QueryExtension { msg: PreProposeOverruleQueryExt::OverruleProposalId { .. }, - } => todo!(), + } => to_binary(&1), }; - return SystemResult::Ok(ContractResult::from(to_binary(&reply))); + return SystemResult::Ok(ContractResult::from(reply)); } if contract_addr == MOCK_OVERRULE_PROPOSAL { let q: ProposeQuery = from_binary(msg).unwrap(); let reply = match q { - QueryMsg::Config {} => OverrulProposalConfig { + QueryMsg::Config {} => to_binary(&OverrulProposalConfig { threshold: Threshold::AbsoluteCount { threshold: Default::default(), }, @@ -105,8 +108,26 @@ impl WasmMockQuerier { allow_revoting: false, dao: Addr::unchecked(MOCK_MAIN_DAO_ADDR), close_proposal_on_execution_failure: false, - }, - QueryMsg::Proposal { .. } => todo!(), + }), + QueryMsg::Proposal { .. } => to_binary(&MainDaoSingleChoiceProposal { + title: "".to_string(), + description: "".to_string(), + proposer: Addr::unchecked(""), + start_height: 0, + min_voting_period: None, + expiration: Default::default(), + threshold: Threshold::AbsoluteCount { threshold: Uint128::new(1) }, + total_power: Default::default(), + msgs: vec![], + // status: Status::Rejected, + status: *(*self.overrule_proposal_status).borrow(), + votes: Votes { + yes: Default::default(), + no: Default::default(), + abstain: Default::default(), + }, + allow_revoting: false, + }), QueryMsg::ListProposals { .. } => todo!(), QueryMsg::ReverseProposals { .. } => todo!(), QueryMsg::ProposalCount { .. } => todo!(), @@ -117,7 +138,7 @@ impl WasmMockQuerier { QueryMsg::VoteHooks { .. } => todo!(), _ => todo!(), }; - return SystemResult::Ok(ContractResult::from(to_binary(&reply))); + return SystemResult::Ok(ContractResult::from(reply)); } SystemResult::Err(SystemError::NoSuchContract { addr: contract_addr.to_string(), @@ -129,7 +150,7 @@ impl WasmMockQuerier { } impl WasmMockQuerier { - pub fn new(base: MockQuerier) -> Self { - WasmMockQuerier { base } + pub fn new(base: MockQuerier, x: Rc>) -> WasmMockQuerier { + WasmMockQuerier { base, overrule_proposal_status: x } } } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index 36ef13f8..71d092f2 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -1,3 +1,6 @@ +use std::any::Any; +use std::cell::RefCell; +use std::rc::Rc; use cosmwasm_std::testing::MOCK_CONTRACT_ADDR; use cosmwasm_std::{ from_binary, @@ -5,12 +8,14 @@ use cosmwasm_std::{ to_binary, Addr, Attribute, CosmosMsg, Reply, SubMsg, SubMsgResult, WasmMsg, }; use neutron_bindings::bindings::msg::NeutronMsg; +use schemars::schema::InstanceType::String; +use cwd_voting::status::Status; use neutron_subdao_timelock_single::{ msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, types::{Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal}, }; -use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL}; +use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL, WasmMockQuerier}; use crate::{ contract::{execute, instantiate, query, reply}, state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}, @@ -21,127 +26,129 @@ use neutron_dao_pre_propose_overrule::msg::{ }; use super::mock_querier::{mock_dependencies, MOCK_SUBDAO_CORE_ADDR}; - -#[test] -fn test_instantiate_test() { - let mut deps = mock_dependencies(); - let env = mock_env(); - let info = mock_info("neutron1unknownsender", &[]); - let msg = InstantiateMsg { - overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), - }; - let res = instantiate(deps.as_mut(), env.clone(), info, msg); - assert_eq!( - "Generic error: Querier system error: No such contract: neutron1unknownsender", - res.unwrap_err().to_string() - ); - - let info = mock_info(MOCK_TIMELOCK_INITIALIZER, &[]); - - let msg = InstantiateMsg { - overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), - }; - let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - let res_ok = res.unwrap(); - let expected_attributes = vec![ - Attribute::new("action", "instantiate"), - Attribute::new("owner", MOCK_MAIN_DAO_ADDR), - Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), - ]; - assert_eq!(expected_attributes, res_ok.attributes); - let config = CONFIG.load(&deps.storage).unwrap(); - let expected_config = Config { - owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), - overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - assert_eq!(expected_config, config); - - let msg = InstantiateMsg { - overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), - }; - let res = instantiate(deps.as_mut(), env, info, msg.clone()); - let res_ok = res.unwrap(); - let expected_attributes = vec![ - Attribute::new("action", "instantiate"), - Attribute::new("owner", MOCK_MAIN_DAO_ADDR), - Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), - ]; - assert_eq!(expected_attributes, res_ok.attributes); - let config = CONFIG.load(&deps.storage).unwrap(); - let expected_config = Config { - owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), - overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - assert_eq!(expected_config, config); -} - -#[test] -fn test_execute_timelock_proposal() { - let mut deps = mock_dependencies(); - let env = mock_env(); - let info = mock_info("neutron1unknownsender", &[]); - - let msg = ExecuteMsg::TimelockProposal { - proposal_id: 10, - msgs: vec![NeutronMsg::remove_interchain_query(1).into()], - }; - - let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - assert_eq!( - "neutron_subdao_timelock_single::types::Config not found", - res.unwrap_err().to_string() - ); - - let config = Config { - owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - CONFIG.save(deps.as_mut().storage, &config).unwrap(); - let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); - assert_eq!("Unauthorized", res.unwrap_err().to_string()); - - let info = mock_info(MOCK_SUBDAO_CORE_ADDR, &[]); - let res_ok = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); - let expected_attributes = vec![ - Attribute::new("action", "timelock_proposal"), - Attribute::new("sender", MOCK_SUBDAO_CORE_ADDR), - Attribute::new("proposal_id", "10"), - Attribute::new("status", "timelocked"), - ]; - assert_eq!(expected_attributes, res_ok.attributes); - assert_eq!(1, res_ok.messages.len()); - - assert_eq!( - res_ok.messages, - vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { - contract_addr: MOCK_OVERRULE_PREPROPOSAL.to_string(), - msg: to_binary(&OverruleExecuteMsg::Propose { - msg: OverruleProposeMessage::ProposeOverrule { - timelock_contract: MOCK_CONTRACT_ADDR.to_string(), - proposal_id: 10, - }, - }) - .unwrap(), - funds: vec![], - }))] - ); - - let expected_proposal = SingleChoiceProposal { - id: 10, - timelock_ts: env.block.time, - msgs: vec![NeutronMsg::remove_interchain_query(1).into()], - status: ProposalStatus::Timelocked, - }; - let prop = PROPOSALS.load(deps.as_mut().storage, 10u64).unwrap(); - assert_eq!(expected_proposal, prop); -} +// +// #[test] +// fn test_instantiate_test() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// let env = mock_env(); +// let info = mock_info("neutron1unknownsender", &[]); +// let msg = InstantiateMsg { +// overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), +// }; +// let res = instantiate(deps.as_mut(), env.clone(), info, msg); +// assert_eq!( +// "Generic error: Querier system error: No such contract: neutron1unknownsender", +// res.unwrap_err().to_string() +// ); +// +// let info = mock_info(MOCK_TIMELOCK_INITIALIZER, &[]); +// +// let msg = InstantiateMsg { +// overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), +// }; +// let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg.clone()); +// let res_ok = res.unwrap(); +// let expected_attributes = vec![ +// Attribute::new("action", "instantiate"), +// Attribute::new("owner", MOCK_MAIN_DAO_ADDR), +// Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), +// ]; +// assert_eq!(expected_attributes, res_ok.attributes); +// let config = CONFIG.load(&deps.storage).unwrap(); +// let expected_config = Config { +// owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), +// overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// assert_eq!(expected_config, config); +// +// let msg = InstantiateMsg { +// overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), +// }; +// let res = instantiate(deps.as_mut(), env, info, msg.clone()); +// let res_ok = res.unwrap(); +// let expected_attributes = vec![ +// Attribute::new("action", "instantiate"), +// Attribute::new("owner", MOCK_MAIN_DAO_ADDR), +// Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), +// ]; +// assert_eq!(expected_attributes, res_ok.attributes); +// let config = CONFIG.load(&deps.storage).unwrap(); +// let expected_config = Config { +// owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), +// overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// assert_eq!(expected_config, config); +// } +// +// #[test] +// fn test_execute_timelock_proposal() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// let env = mock_env(); +// let info = mock_info("neutron1unknownsender", &[]); +// +// let msg = ExecuteMsg::TimelockProposal { +// proposal_id: 10, +// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], +// }; +// +// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); +// assert_eq!( +// "neutron_subdao_timelock_single::types::Config not found", +// res.unwrap_err().to_string() +// ); +// +// let config = Config { +// owner: Addr::unchecked("owner"), +// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// CONFIG.save(deps.as_mut().storage, &config).unwrap(); +// let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); +// assert_eq!("Unauthorized", res.unwrap_err().to_string()); +// +// let info = mock_info(MOCK_SUBDAO_CORE_ADDR, &[]); +// let res_ok = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); +// let expected_attributes = vec![ +// Attribute::new("action", "timelock_proposal"), +// Attribute::new("sender", MOCK_SUBDAO_CORE_ADDR), +// Attribute::new("proposal_id", "10"), +// Attribute::new("status", "timelocked"), +// ]; +// assert_eq!(expected_attributes, res_ok.attributes); +// assert_eq!(1, res_ok.messages.len()); +// +// assert_eq!( +// res_ok.messages, +// vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { +// contract_addr: MOCK_OVERRULE_PREPROPOSAL.to_string(), +// msg: to_binary(&OverruleExecuteMsg::Propose { +// msg: OverruleProposeMessage::ProposeOverrule { +// timelock_contract: MOCK_CONTRACT_ADDR.to_string(), +// proposal_id: 10, +// }, +// }) +// .unwrap(), +// funds: vec![], +// }))] +// ); +// +// let expected_proposal = SingleChoiceProposal { +// id: 10, +// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], +// status: ProposalStatus::Timelocked, +// }; +// let prop = PROPOSALS.load(deps.as_mut().storage, 10u64).unwrap(); +// assert_eq!(expected_proposal, prop); +// } #[test] fn test_execute_proposal() { - let mut deps = mock_dependencies(); + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let mut env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); @@ -173,7 +180,6 @@ fn test_execute_proposal() { for s in wrong_prop_statuses { let proposal = SingleChoiceProposal { id: 10, - timelock_ts: env.block.time, msgs: vec![NeutronMsg::remove_interchain_query(1).into()], status: s, }; @@ -189,7 +195,6 @@ fn test_execute_proposal() { let proposal = SingleChoiceProposal { id: 10, - timelock_ts: env.block.time, msgs: vec![NeutronMsg::remove_interchain_query(1).into()], status: ProposalStatus::Timelocked, }; @@ -198,8 +203,10 @@ fn test_execute_proposal() { .unwrap(); let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); assert_eq!("Proposal is timelocked", res.unwrap_err().to_string()); - - env.block.time = env.block.time.plus_seconds(11); + { + let mut data_mut_ref = overrule_proposal_status.borrow_mut(); + *data_mut_ref = Status::Rejected; + } let res = execute(deps.as_mut(), env, info, msg).unwrap(); let expected_attributes = vec![ Attribute::new("action", "execute_proposal"), @@ -218,309 +225,304 @@ fn test_execute_proposal() { let updated_prop = PROPOSALS.load(deps.as_mut().storage, 10).unwrap(); assert_eq!(ProposalStatus::Executed, updated_prop.status) } - -#[test] -fn test_overrule_proposal() { - let mut deps = mock_dependencies(); - let env = mock_env(); - let info = mock_info("neutron1unknownsender", &[]); - - let msg = ExecuteMsg::OverruleProposal { proposal_id: 10 }; - - let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - assert_eq!( - "neutron_subdao_timelock_single::types::Config not found", - res.unwrap_err().to_string() - ); - - let config = Config { - owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - CONFIG.save(deps.as_mut().storage, &config).unwrap(); - let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); - assert_eq!("Unauthorized", res.unwrap_err().to_string()); - - let info = mock_info("owner", &[]); - - let wrong_prop_statuses = vec![ - ProposalStatus::Executed, - ProposalStatus::ExecutionFailed, - ProposalStatus::Overruled, - ]; - for s in wrong_prop_statuses { - let proposal = SingleChoiceProposal { - id: 10, - timelock_ts: env.block.time, - msgs: vec![NeutronMsg::remove_interchain_query(1).into()], - status: s, - }; - PROPOSALS - .save(deps.as_mut().storage, proposal.id, &proposal) - .unwrap(); - let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - assert_eq!( - format!("Wrong proposal status ({})", s), - res.unwrap_err().to_string() - ) - } - - let proposal = SingleChoiceProposal { - id: 10, - timelock_ts: env.block.time, - msgs: vec![NeutronMsg::remove_interchain_query(1).into()], - status: ProposalStatus::Timelocked, - }; - PROPOSALS - .save(deps.as_mut().storage, proposal.id, &proposal) - .unwrap(); - let res_ok = execute(deps.as_mut(), env, info.clone(), msg).unwrap(); - assert_eq!(0, res_ok.messages.len()); - let expected_attributes = vec![ - Attribute::new("action", "overrule_proposal"), - Attribute::new("sender", info.sender), - Attribute::new("proposal_id", proposal.id.to_string()), - ]; - assert_eq!(expected_attributes, res_ok.attributes); - let updated_prop = PROPOSALS.load(deps.as_mut().storage, 10).unwrap(); - assert_eq!(ProposalStatus::Overruled, updated_prop.status); -} - -#[test] -fn execute_update_config() { - let mut deps = mock_dependencies(); - let env = mock_env(); - let info = mock_info("neutron1unknownsender", &[]); - - let msg = ExecuteMsg::UpdateConfig { - owner: None, - overrule_pre_propose: Some("neutron1someotheroverrule".to_string()), - }; - - let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - assert_eq!( - "neutron_subdao_timelock_single::types::Config not found", - res.unwrap_err().to_string() - ); - - let config = Config { - owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - CONFIG.save(deps.as_mut().storage, &config).unwrap(); - let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); - assert_eq!("Unauthorized", res.unwrap_err().to_string()); - - let info = mock_info("owner", &[]); - let config = Config { - owner: Addr::unchecked("none"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - CONFIG.save(deps.as_mut().storage, &config).unwrap(); - let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); - assert_eq!("Unauthorized", res.unwrap_err().to_string()); - - let config = Config { - owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - CONFIG.save(deps.as_mut().storage, &config).unwrap(); - let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg).unwrap(); - assert_eq!(0, res_ok.messages.len()); - let expected_attributes = vec![ - Attribute::new("action", "update_config"), - Attribute::new("owner", "owner"), - Attribute::new("overrule_pre_propose", "neutron1someotheroverrule"), - ]; - assert_eq!(expected_attributes, res_ok.attributes); - let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); - let some_other_prepropose = "neutron1someotheroverrule"; - assert_eq!( - updated_config, - Config { - owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(some_other_prepropose), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) - } - ); - - let msg = ExecuteMsg::UpdateConfig { - owner: Some("neutron1newowner".to_string()), - overrule_pre_propose: None, - }; - - let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()).unwrap(); - assert_eq!(0, res_ok.messages.len()); - let expected_attributes = vec![ - Attribute::new("action", "update_config"), - Attribute::new("owner", "neutron1newowner"), - Attribute::new("overrule_pre_propose", some_other_prepropose), - ]; - assert_eq!(expected_attributes, res_ok.attributes); - let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); - assert_eq!( - updated_config, - Config { - owner: Addr::unchecked("neutron1newowner"), - overrule_pre_propose: Addr::unchecked(some_other_prepropose), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) - } - ); - - // old owner - let err = execute(deps.as_mut(), env, info, msg).unwrap_err(); - assert_eq!("Unauthorized", err.to_string()); -} - -#[test] -fn test_query_config() { - let mut deps = mock_dependencies(); - let config = Config { - owner: Addr::unchecked("owner"), - overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), - subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), - }; - CONFIG.save(deps.as_mut().storage, &config).unwrap(); - let query_msg = QueryMsg::Config {}; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_config: Config = from_binary(&res).unwrap(); - assert_eq!(config, queried_config) -} - -#[test] -fn test_query_proposals() { - let mut deps = mock_dependencies(); - for i in 1..=100 { - let prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - PROPOSALS.save(deps.as_mut().storage, i, &prop).unwrap(); - } - for i in 1..=100 { - let query_msg = QueryMsg::Proposal { proposal_id: i }; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_prop: SingleChoiceProposal = from_binary(&res).unwrap(); - let expected_prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - assert_eq!(expected_prop, queried_prop) - } - - let query_msg = QueryMsg::ListProposals { - start_after: None, - limit: None, - }; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_props: ProposalListResponse = from_binary(&res).unwrap(); - for (p, i) in queried_props.proposals.iter().zip(1..) { - let expected_prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - assert_eq!(expected_prop, *p); - } - assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); - - let query_msg = QueryMsg::ListProposals { - start_after: None, - limit: Some(100), - }; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_props: ProposalListResponse = from_binary(&res).unwrap(); - for (p, i) in queried_props.proposals.iter().zip(1..) { - let expected_prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - assert_eq!(expected_prop, *p); - } - assert_eq!(queried_props.proposals.len(), 100); - - let query_msg = QueryMsg::ListProposals { - start_after: None, - limit: Some(10), - }; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_props: ProposalListResponse = from_binary(&res).unwrap(); - for (p, i) in queried_props.proposals.iter().zip(1..) { - let expected_prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - assert_eq!(expected_prop, *p); - } - assert_eq!(queried_props.proposals.len(), 10); - - let query_msg = QueryMsg::ListProposals { - start_after: Some(50), - limit: None, - }; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_props: ProposalListResponse = from_binary(&res).unwrap(); - for (p, i) in queried_props.proposals.iter().zip(51..) { - let expected_prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - assert_eq!(expected_prop, *p); - } - assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); - - let query_msg = QueryMsg::ListProposals { - start_after: Some(90), - limit: None, - }; - let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); - let queried_props: ProposalListResponse = from_binary(&res).unwrap(); - for (p, i) in queried_props.proposals.iter().zip(91..) { - let expected_prop = SingleChoiceProposal { - id: i, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(i).into()], - status: ProposalStatus::Timelocked, - }; - assert_eq!(expected_prop, *p); - } - assert_eq!(queried_props.proposals.len(), 10); -} - -#[test] -fn test_reply() { - let mut deps = mock_dependencies(); - let msg = Reply { - id: 10, - result: SubMsgResult::Err("error".to_string()), - }; - let err = reply(deps.as_mut(), mock_env(), msg.clone()).unwrap_err(); - assert_eq!("no such proposal (10)", err.to_string()); - - let prop = SingleChoiceProposal { - id: 10, - timelock_ts: mock_env().block.time, - msgs: vec![NeutronMsg::remove_interchain_query(1).into()], - status: ProposalStatus::Timelocked, - }; - PROPOSALS.save(deps.as_mut().storage, 10, &prop).unwrap(); - let res_ok = reply(deps.as_mut(), mock_env(), msg).unwrap(); - assert_eq!(0, res_ok.messages.len()); - let expected_attributes = vec![Attribute::new("timelocked_proposal_execution_failed", "10")]; - assert_eq!(expected_attributes, res_ok.attributes); -} +// +// #[test] +// fn test_overrule_proposal() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// let env = mock_env(); +// let info = mock_info("neutron1unknownsender", &[]); +// +// let msg = ExecuteMsg::OverruleProposal { proposal_id: 10 }; +// +// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); +// assert_eq!( +// "neutron_subdao_timelock_single::types::Config not found", +// res.unwrap_err().to_string() +// ); +// +// let config = Config { +// owner: Addr::unchecked("owner"), +// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// CONFIG.save(deps.as_mut().storage, &config).unwrap(); +// let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); +// assert_eq!("Unauthorized", res.unwrap_err().to_string()); +// +// let info = mock_info("owner", &[]); +// +// let wrong_prop_statuses = vec![ +// ProposalStatus::Executed, +// ProposalStatus::ExecutionFailed, +// ProposalStatus::Overruled, +// ]; +// for s in wrong_prop_statuses { +// let proposal = SingleChoiceProposal { +// id: 10, +// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], +// status: s, +// }; +// PROPOSALS +// .save(deps.as_mut().storage, proposal.id, &proposal) +// .unwrap(); +// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); +// assert_eq!( +// format!("Wrong proposal status ({})", s), +// res.unwrap_err().to_string() +// ) +// } +// +// let proposal = SingleChoiceProposal { +// id: 10, +// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], +// status: ProposalStatus::Timelocked, +// }; +// PROPOSALS +// .save(deps.as_mut().storage, proposal.id, &proposal) +// .unwrap(); +// let res_ok = execute(deps.as_mut(), env, info.clone(), msg).unwrap(); +// assert_eq!(0, res_ok.messages.len()); +// let expected_attributes = vec![ +// Attribute::new("action", "overrule_proposal"), +// Attribute::new("sender", info.sender), +// Attribute::new("proposal_id", proposal.id.to_string()), +// ]; +// assert_eq!(expected_attributes, res_ok.attributes); +// let updated_prop = PROPOSALS.load(deps.as_mut().storage, 10).unwrap(); +// assert_eq!(ProposalStatus::Overruled, updated_prop.status); +// } +// +// #[test] +// fn execute_update_config() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// let env = mock_env(); +// let info = mock_info("neutron1unknownsender", &[]); +// +// let msg = ExecuteMsg::UpdateConfig { +// owner: None, +// overrule_pre_propose: Some("neutron1someotheroverrule".to_string()), +// }; +// +// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); +// assert_eq!( +// "neutron_subdao_timelock_single::types::Config not found", +// res.unwrap_err().to_string() +// ); +// +// let config = Config { +// owner: Addr::unchecked("owner"), +// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// CONFIG.save(deps.as_mut().storage, &config).unwrap(); +// let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); +// assert_eq!("Unauthorized", res.unwrap_err().to_string()); +// +// let info = mock_info("owner", &[]); +// let config = Config { +// owner: Addr::unchecked("none"), +// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// CONFIG.save(deps.as_mut().storage, &config).unwrap(); +// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); +// assert_eq!("Unauthorized", res.unwrap_err().to_string()); +// +// let config = Config { +// owner: Addr::unchecked("owner"), +// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// CONFIG.save(deps.as_mut().storage, &config).unwrap(); +// let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg).unwrap(); +// assert_eq!(0, res_ok.messages.len()); +// let expected_attributes = vec![ +// Attribute::new("action", "update_config"), +// Attribute::new("owner", "owner"), +// Attribute::new("overrule_pre_propose", "neutron1someotheroverrule"), +// ]; +// assert_eq!(expected_attributes, res_ok.attributes); +// let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); +// let some_other_prepropose = "neutron1someotheroverrule"; +// assert_eq!( +// updated_config, +// Config { +// owner: Addr::unchecked("owner"), +// overrule_pre_propose: Addr::unchecked(some_other_prepropose), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) +// } +// ); +// +// let msg = ExecuteMsg::UpdateConfig { +// owner: Some("neutron1newowner".to_string()), +// overrule_pre_propose: None, +// }; +// +// let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()).unwrap(); +// assert_eq!(0, res_ok.messages.len()); +// let expected_attributes = vec![ +// Attribute::new("action", "update_config"), +// Attribute::new("owner", "neutron1newowner"), +// Attribute::new("overrule_pre_propose", some_other_prepropose), +// ]; +// assert_eq!(expected_attributes, res_ok.attributes); +// let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); +// assert_eq!( +// updated_config, +// Config { +// owner: Addr::unchecked("neutron1newowner"), +// overrule_pre_propose: Addr::unchecked(some_other_prepropose), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) +// } +// ); +// +// // old owner +// let err = execute(deps.as_mut(), env, info, msg).unwrap_err(); +// assert_eq!("Unauthorized", err.to_string()); +// } +// +// #[test] +// fn test_query_config() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// let config = Config { +// owner: Addr::unchecked("owner"), +// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), +// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), +// }; +// CONFIG.save(deps.as_mut().storage, &config).unwrap(); +// let query_msg = QueryMsg::Config {}; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_config: Config = from_binary(&res).unwrap(); +// assert_eq!(config, queried_config) +// } +// +// #[test] +// fn test_query_proposals() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// for i in 1..=100 { +// let prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// PROPOSALS.save(deps.as_mut().storage, i, &prop).unwrap(); +// } +// for i in 1..=100 { +// let query_msg = QueryMsg::Proposal { proposal_id: i }; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_prop: SingleChoiceProposal = from_binary(&res).unwrap(); +// let expected_prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// assert_eq!(expected_prop, queried_prop) +// } +// +// let query_msg = QueryMsg::ListProposals { +// start_after: None, +// limit: None, +// }; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); +// for (p, i) in queried_props.proposals.iter().zip(1..) { +// let expected_prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// assert_eq!(expected_prop, *p); +// } +// assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); +// +// let query_msg = QueryMsg::ListProposals { +// start_after: None, +// limit: Some(100), +// }; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); +// for (p, i) in queried_props.proposals.iter().zip(1..) { +// let expected_prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// assert_eq!(expected_prop, *p); +// } +// assert_eq!(queried_props.proposals.len(), 100); +// +// let query_msg = QueryMsg::ListProposals { +// start_after: None, +// limit: Some(10), +// }; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); +// for (p, i) in queried_props.proposals.iter().zip(1..) { +// let expected_prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// assert_eq!(expected_prop, *p); +// } +// assert_eq!(queried_props.proposals.len(), 10); +// +// let query_msg = QueryMsg::ListProposals { +// start_after: Some(50), +// limit: None, +// }; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); +// for (p, i) in queried_props.proposals.iter().zip(51..) { +// let expected_prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// assert_eq!(expected_prop, *p); +// } +// assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); +// +// let query_msg = QueryMsg::ListProposals { +// start_after: Some(90), +// limit: None, +// }; +// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); +// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); +// for (p, i) in queried_props.proposals.iter().zip(91..) { +// let expected_prop = SingleChoiceProposal { +// id: i, +// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], +// status: ProposalStatus::Timelocked, +// }; +// assert_eq!(expected_prop, *p); +// } +// assert_eq!(queried_props.proposals.len(), 10); +// } +// +// #[test] +// fn test_reply() { +// let mut overrule_proposal_status = Status::Open; +// let mut deps = mock_dependencies(&overrule_proposal_status); +// let msg = Reply { +// id: 10, +// result: SubMsgResult::Err("error".to_string()), +// }; +// let err = reply(deps.as_mut(), mock_env(), msg.clone()).unwrap_err(); +// assert_eq!("no such proposal (10)", err.to_string()); +// +// let prop = SingleChoiceProposal { +// id: 10, +// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], +// status: ProposalStatus::Timelocked, +// }; +// PROPOSALS.save(deps.as_mut().storage, 10, &prop).unwrap(); +// let res_ok = reply(deps.as_mut(), mock_env(), msg).unwrap(); +// assert_eq!(0, res_ok.messages.len()); +// let expected_attributes = vec![Attribute::new("timelocked_proposal_execution_failed", "10")]; +// assert_eq!(expected_attributes, res_ok.attributes); +// } diff --git a/packages/neutron-subdao-timelock-single/src/types.rs b/packages/neutron-subdao-timelock-single/src/types.rs index f451751e..5e50fb84 100644 --- a/packages/neutron-subdao-timelock-single/src/types.rs +++ b/packages/neutron-subdao-timelock-single/src/types.rs @@ -17,9 +17,6 @@ pub struct SingleChoiceProposal { /// The ID of the proposal being returned. pub id: u64, - /// The timestamp at which the proposal was submitted to the timelock contract. - pub timelock_ts: Timestamp, - /// The messages that will be executed should this proposal be executed. pub msgs: Vec>, From 8f15c55227b5f9fb72daf15cd7a8d5e6f8b88d95 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:10:34 +0300 Subject: [PATCH 31/53] rustfmt --- .../src/contract.rs | 28 +++++++++++++------ .../src/testing/mock_querier.rs | 26 +++++++++++++---- .../src/testing/tests.rs | 14 ++++++---- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 88699ce0..884482b9 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -8,14 +8,15 @@ use cw2::set_contract_version; use cw_storage_plus::Bound; use cw_utils::Duration; use cwd_proposal_single::{ - msg::QueryMsg as MainDaoProposalModuleQueryMsg, state::Config as MainDaoProposalModuleConfig, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal + msg::QueryMsg as MainDaoProposalModuleQueryMsg, + proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, + state::Config as MainDaoProposalModuleConfig, }; use cwd_voting::status::Status; use neutron_bindings::bindings::msg::NeutronMsg; use neutron_dao_pre_propose_overrule::msg::{ ExecuteMsg as OverruleExecuteMsg, ProposeMessage as OverruleProposeMessage, - QueryMsg as OverruleQueryMsg, - QueryExt as OverruleQueryExt, + QueryExt as OverruleQueryExt, QueryMsg as OverruleQueryMsg, }; use neutron_subdao_core::msg::QueryMsg as SubdaoQuery; use neutron_subdao_pre_propose_single::msg::QueryMsg as PreProposeQuery; @@ -284,15 +285,24 @@ fn is_overrule_proposal_rejected( overrule_pre_propose: &Addr, subdao_proposal_id: u64, ) -> Result { - let overrule_proposal_id: u64 = deps - .querier - .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::QueryExtension { msg: OverruleQueryExt::OverruleProposalId { timelock_address: env.contract.address.to_string(), subdao_proposal_id }})?; + let overrule_proposal_id: u64 = deps.querier.query_wasm_smart( + overrule_pre_propose, + &OverruleQueryMsg::QueryExtension { + msg: OverruleQueryExt::OverruleProposalId { + timelock_address: env.contract.address.to_string(), + subdao_proposal_id, + }, + }, + )?; let propose: Addr = deps .querier .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::ProposalModule {})?; - let overrule_proposal: MainDaoSingleChoiceProposal = deps - .querier - .query_wasm_smart(propose, &MainDaoProposalModuleQueryMsg::Proposal { proposal_id: overrule_proposal_id })?; + let overrule_proposal: MainDaoSingleChoiceProposal = deps.querier.query_wasm_smart( + propose, + &MainDaoProposalModuleQueryMsg::Proposal { + proposal_id: overrule_proposal_id, + }, + )?; Ok(overrule_proposal.status == Status::Rejected) } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index 4a4e0017..09d33ead 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -3,12 +3,17 @@ use std::cell::RefCell; use std::marker::PhantomData; use std::rc::Rc; -use cosmwasm_std::{from_binary, from_slice, testing::{MockApi, MockQuerier, MockStorage}, to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, SystemError, SystemResult, WasmQuery, Uint128}; +use cosmwasm_std::{ + from_binary, from_slice, + testing::{MockApi, MockQuerier, MockStorage}, + to_binary, Addr, ContractResult, Empty, OwnedDeps, Querier, QuerierResult, QueryRequest, + SystemError, SystemResult, Uint128, WasmQuery, +}; use cw_utils::Duration; use cwd_proposal_single::{ msg::{QueryMsg as ProposeQuery, QueryMsg}, + proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, state::Config as OverrulProposalConfig, - proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal }; use cwd_voting::status::Status; use cwd_voting::threshold::Threshold; @@ -26,7 +31,9 @@ pub const MOCK_MAIN_DAO_ADDR: &str = "neutron1main_dao_core_contract"; pub const MOCK_OVERRULE_PROPOSAL: &str = "neutron1main_dao_overrule_proposal"; pub const MOCK_OVERRULE_PREPROPOSAL: &str = "neutron1main_dao_overrule_preproposal"; -pub fn mock_dependencies(x: Rc>) -> OwnedDeps { +pub fn mock_dependencies( + x: Rc>, +) -> OwnedDeps { let custom_storage = MockStorage::default(); let custom_querier = WasmMockQuerier::new(MockQuerier::new(&[]), x); @@ -87,7 +94,9 @@ impl WasmMockQuerier { PreProposeOverruleQuery::ProposalModule {} => { to_binary(&MOCK_OVERRULE_PROPOSAL.to_string()) } - PreProposeOverruleQuery::Dao {} => to_binary(&MOCK_MAIN_DAO_ADDR.to_string()), + PreProposeOverruleQuery::Dao {} => { + to_binary(&MOCK_MAIN_DAO_ADDR.to_string()) + } PreProposeOverruleQuery::Config {} => todo!(), PreProposeOverruleQuery::DepositInfo { proposal_id: _ } => todo!(), PreProposeOverruleQuery::QueryExtension { @@ -116,7 +125,9 @@ impl WasmMockQuerier { start_height: 0, min_voting_period: None, expiration: Default::default(), - threshold: Threshold::AbsoluteCount { threshold: Uint128::new(1) }, + threshold: Threshold::AbsoluteCount { + threshold: Uint128::new(1), + }, total_power: Default::default(), msgs: vec![], // status: Status::Rejected, @@ -151,6 +162,9 @@ impl WasmMockQuerier { impl WasmMockQuerier { pub fn new(base: MockQuerier, x: Rc>) -> WasmMockQuerier { - WasmMockQuerier { base, overrule_proposal_status: x } + WasmMockQuerier { + base, + overrule_proposal_status: x, + } } } diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index 71d092f2..cc443413 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -1,21 +1,23 @@ -use std::any::Any; -use std::cell::RefCell; -use std::rc::Rc; use cosmwasm_std::testing::MOCK_CONTRACT_ADDR; use cosmwasm_std::{ from_binary, testing::{mock_env, mock_info}, to_binary, Addr, Attribute, CosmosMsg, Reply, SubMsg, SubMsgResult, WasmMsg, }; -use neutron_bindings::bindings::msg::NeutronMsg; -use schemars::schema::InstanceType::String; use cwd_voting::status::Status; +use neutron_bindings::bindings::msg::NeutronMsg; use neutron_subdao_timelock_single::{ msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, types::{Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal}, }; +use schemars::schema::InstanceType::String; +use std::any::Any; +use std::cell::RefCell; +use std::rc::Rc; -use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL, WasmMockQuerier}; +use crate::testing::mock_querier::{ + WasmMockQuerier, MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL, +}; use crate::{ contract::{execute, instantiate, query, reply}, state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}, From ad531cbaa993a8e15f133e859f421a79ae4af6ff Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:18:49 +0300 Subject: [PATCH 32/53] return commented tests --- .../cwd-subdao-timelock-single/Cargo.toml | 2 +- .../src/contract.rs | 2 - .../src/testing/tests.rs | 838 +++++++++--------- .../src/types.rs | 2 +- 4 files changed, 421 insertions(+), 423 deletions(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml index 5eb72f96..2f7a85af 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml +++ b/contracts/subdaos/cwd-subdao-timelock-single/Cargo.toml @@ -21,7 +21,6 @@ cosmwasm-std = { version = "1.0.0" } cosmwasm-storage = { version = "1.0.0" } cw-storage-plus = "0.13" cw2 = "0.13" -cw-utils = "0.13" cw-controllers = "0.13" schemars = "0.8" serde = { version = "1.0.147", default-features = false, features = ["derive"] } @@ -40,3 +39,4 @@ cwd-voting = { path = "../../../packages/cwd-voting" } cosmwasm-schema = { version = "1.0.0" } cw-multi-test = "0.13" anyhow = "1.0.57" +cw-utils = "0.13" diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 884482b9..b77ae873 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -6,11 +6,9 @@ use cosmwasm_std::{ }; use cw2::set_contract_version; use cw_storage_plus::Bound; -use cw_utils::Duration; use cwd_proposal_single::{ msg::QueryMsg as MainDaoProposalModuleQueryMsg, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, - state::Config as MainDaoProposalModuleConfig, }; use cwd_voting::status::Status; use neutron_bindings::bindings::msg::NeutronMsg; diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index cc443413..1254b229 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -28,124 +28,124 @@ use neutron_dao_pre_propose_overrule::msg::{ }; use super::mock_querier::{mock_dependencies, MOCK_SUBDAO_CORE_ADDR}; -// -// #[test] -// fn test_instantiate_test() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// let env = mock_env(); -// let info = mock_info("neutron1unknownsender", &[]); -// let msg = InstantiateMsg { -// overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), -// }; -// let res = instantiate(deps.as_mut(), env.clone(), info, msg); -// assert_eq!( -// "Generic error: Querier system error: No such contract: neutron1unknownsender", -// res.unwrap_err().to_string() -// ); -// -// let info = mock_info(MOCK_TIMELOCK_INITIALIZER, &[]); -// -// let msg = InstantiateMsg { -// overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), -// }; -// let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg.clone()); -// let res_ok = res.unwrap(); -// let expected_attributes = vec![ -// Attribute::new("action", "instantiate"), -// Attribute::new("owner", MOCK_MAIN_DAO_ADDR), -// Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), -// ]; -// assert_eq!(expected_attributes, res_ok.attributes); -// let config = CONFIG.load(&deps.storage).unwrap(); -// let expected_config = Config { -// owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), -// overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// assert_eq!(expected_config, config); -// -// let msg = InstantiateMsg { -// overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), -// }; -// let res = instantiate(deps.as_mut(), env, info, msg.clone()); -// let res_ok = res.unwrap(); -// let expected_attributes = vec![ -// Attribute::new("action", "instantiate"), -// Attribute::new("owner", MOCK_MAIN_DAO_ADDR), -// Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), -// ]; -// assert_eq!(expected_attributes, res_ok.attributes); -// let config = CONFIG.load(&deps.storage).unwrap(); -// let expected_config = Config { -// owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), -// overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// assert_eq!(expected_config, config); -// } -// -// #[test] -// fn test_execute_timelock_proposal() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// let env = mock_env(); -// let info = mock_info("neutron1unknownsender", &[]); -// -// let msg = ExecuteMsg::TimelockProposal { -// proposal_id: 10, -// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], -// }; -// -// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); -// assert_eq!( -// "neutron_subdao_timelock_single::types::Config not found", -// res.unwrap_err().to_string() -// ); -// -// let config = Config { -// owner: Addr::unchecked("owner"), -// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// CONFIG.save(deps.as_mut().storage, &config).unwrap(); -// let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); -// assert_eq!("Unauthorized", res.unwrap_err().to_string()); -// -// let info = mock_info(MOCK_SUBDAO_CORE_ADDR, &[]); -// let res_ok = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); -// let expected_attributes = vec![ -// Attribute::new("action", "timelock_proposal"), -// Attribute::new("sender", MOCK_SUBDAO_CORE_ADDR), -// Attribute::new("proposal_id", "10"), -// Attribute::new("status", "timelocked"), -// ]; -// assert_eq!(expected_attributes, res_ok.attributes); -// assert_eq!(1, res_ok.messages.len()); -// -// assert_eq!( -// res_ok.messages, -// vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { -// contract_addr: MOCK_OVERRULE_PREPROPOSAL.to_string(), -// msg: to_binary(&OverruleExecuteMsg::Propose { -// msg: OverruleProposeMessage::ProposeOverrule { -// timelock_contract: MOCK_CONTRACT_ADDR.to_string(), -// proposal_id: 10, -// }, -// }) -// .unwrap(), -// funds: vec![], -// }))] -// ); -// -// let expected_proposal = SingleChoiceProposal { -// id: 10, -// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], -// status: ProposalStatus::Timelocked, -// }; -// let prop = PROPOSALS.load(deps.as_mut().storage, 10u64).unwrap(); -// assert_eq!(expected_proposal, prop); -// } + +#[test] +fn test_instantiate_test() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + let env = mock_env(); + let info = mock_info("neutron1unknownsender", &[]); + let msg = InstantiateMsg { + overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), + }; + let res = instantiate(deps.as_mut(), env.clone(), info, msg); + assert_eq!( + "Generic error: Querier system error: No such contract: neutron1unknownsender", + res.unwrap_err().to_string() + ); + + let info = mock_info(MOCK_TIMELOCK_INITIALIZER, &[]); + + let msg = InstantiateMsg { + overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), + }; + let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg.clone()); + let res_ok = res.unwrap(); + let expected_attributes = vec![ + Attribute::new("action", "instantiate"), + Attribute::new("owner", MOCK_MAIN_DAO_ADDR), + Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), + ]; + assert_eq!(expected_attributes, res_ok.attributes); + let config = CONFIG.load(&deps.storage).unwrap(); + let expected_config = Config { + owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), + overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + assert_eq!(expected_config, config); + + let msg = InstantiateMsg { + overrule_pre_propose: MOCK_OVERRULE_PREPROPOSAL.to_string(), + }; + let res = instantiate(deps.as_mut(), env, info, msg.clone()); + let res_ok = res.unwrap(); + let expected_attributes = vec![ + Attribute::new("action", "instantiate"), + Attribute::new("owner", MOCK_MAIN_DAO_ADDR), + Attribute::new("overrule_pre_propose", MOCK_OVERRULE_PREPROPOSAL), + ]; + assert_eq!(expected_attributes, res_ok.attributes); + let config = CONFIG.load(&deps.storage).unwrap(); + let expected_config = Config { + owner: Addr::unchecked(MOCK_MAIN_DAO_ADDR), + overrule_pre_propose: Addr::unchecked(msg.overrule_pre_propose), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + assert_eq!(expected_config, config); +} + +#[test] +fn test_execute_timelock_proposal() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + let env = mock_env(); + let info = mock_info("neutron1unknownsender", &[]); + + let msg = ExecuteMsg::TimelockProposal { + proposal_id: 10, + msgs: vec![NeutronMsg::remove_interchain_query(1).into()], + }; + + let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); + assert_eq!( + "neutron_subdao_timelock_single::types::Config not found", + res.unwrap_err().to_string() + ); + + let config = Config { + owner: Addr::unchecked("owner"), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + CONFIG.save(deps.as_mut().storage, &config).unwrap(); + let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); + assert_eq!("Unauthorized", res.unwrap_err().to_string()); + + let info = mock_info(MOCK_SUBDAO_CORE_ADDR, &[]); + let res_ok = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); + let expected_attributes = vec![ + Attribute::new("action", "timelock_proposal"), + Attribute::new("sender", MOCK_SUBDAO_CORE_ADDR), + Attribute::new("proposal_id", "10"), + Attribute::new("status", "timelocked"), + ]; + assert_eq!(expected_attributes, res_ok.attributes); + assert_eq!(1, res_ok.messages.len()); + + assert_eq!( + res_ok.messages, + vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: MOCK_OVERRULE_PREPROPOSAL.to_string(), + msg: to_binary(&OverruleExecuteMsg::Propose { + msg: OverruleProposeMessage::ProposeOverrule { + timelock_contract: MOCK_CONTRACT_ADDR.to_string(), + proposal_id: 10, + }, + }) + .unwrap(), + funds: vec![], + }))] + ); + + let expected_proposal = SingleChoiceProposal { + id: 10, + msgs: vec![NeutronMsg::remove_interchain_query(1).into()], + status: ProposalStatus::Timelocked, + }; + let prop = PROPOSALS.load(deps.as_mut().storage, 10u64).unwrap(); + assert_eq!(expected_proposal, prop); +} #[test] fn test_execute_proposal() { @@ -227,304 +227,304 @@ fn test_execute_proposal() { let updated_prop = PROPOSALS.load(deps.as_mut().storage, 10).unwrap(); assert_eq!(ProposalStatus::Executed, updated_prop.status) } -// -// #[test] -// fn test_overrule_proposal() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// let env = mock_env(); -// let info = mock_info("neutron1unknownsender", &[]); -// -// let msg = ExecuteMsg::OverruleProposal { proposal_id: 10 }; -// -// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); -// assert_eq!( -// "neutron_subdao_timelock_single::types::Config not found", -// res.unwrap_err().to_string() -// ); -// -// let config = Config { -// owner: Addr::unchecked("owner"), -// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// CONFIG.save(deps.as_mut().storage, &config).unwrap(); -// let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); -// assert_eq!("Unauthorized", res.unwrap_err().to_string()); -// -// let info = mock_info("owner", &[]); -// -// let wrong_prop_statuses = vec![ -// ProposalStatus::Executed, -// ProposalStatus::ExecutionFailed, -// ProposalStatus::Overruled, -// ]; -// for s in wrong_prop_statuses { -// let proposal = SingleChoiceProposal { -// id: 10, -// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], -// status: s, -// }; -// PROPOSALS -// .save(deps.as_mut().storage, proposal.id, &proposal) -// .unwrap(); -// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); -// assert_eq!( -// format!("Wrong proposal status ({})", s), -// res.unwrap_err().to_string() -// ) -// } -// -// let proposal = SingleChoiceProposal { -// id: 10, -// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], -// status: ProposalStatus::Timelocked, -// }; -// PROPOSALS -// .save(deps.as_mut().storage, proposal.id, &proposal) -// .unwrap(); -// let res_ok = execute(deps.as_mut(), env, info.clone(), msg).unwrap(); -// assert_eq!(0, res_ok.messages.len()); -// let expected_attributes = vec![ -// Attribute::new("action", "overrule_proposal"), -// Attribute::new("sender", info.sender), -// Attribute::new("proposal_id", proposal.id.to_string()), -// ]; -// assert_eq!(expected_attributes, res_ok.attributes); -// let updated_prop = PROPOSALS.load(deps.as_mut().storage, 10).unwrap(); -// assert_eq!(ProposalStatus::Overruled, updated_prop.status); -// } -// -// #[test] -// fn execute_update_config() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// let env = mock_env(); -// let info = mock_info("neutron1unknownsender", &[]); -// -// let msg = ExecuteMsg::UpdateConfig { -// owner: None, -// overrule_pre_propose: Some("neutron1someotheroverrule".to_string()), -// }; -// -// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); -// assert_eq!( -// "neutron_subdao_timelock_single::types::Config not found", -// res.unwrap_err().to_string() -// ); -// -// let config = Config { -// owner: Addr::unchecked("owner"), -// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// CONFIG.save(deps.as_mut().storage, &config).unwrap(); -// let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); -// assert_eq!("Unauthorized", res.unwrap_err().to_string()); -// -// let info = mock_info("owner", &[]); -// let config = Config { -// owner: Addr::unchecked("none"), -// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// CONFIG.save(deps.as_mut().storage, &config).unwrap(); -// let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); -// assert_eq!("Unauthorized", res.unwrap_err().to_string()); -// -// let config = Config { -// owner: Addr::unchecked("owner"), -// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// CONFIG.save(deps.as_mut().storage, &config).unwrap(); -// let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg).unwrap(); -// assert_eq!(0, res_ok.messages.len()); -// let expected_attributes = vec![ -// Attribute::new("action", "update_config"), -// Attribute::new("owner", "owner"), -// Attribute::new("overrule_pre_propose", "neutron1someotheroverrule"), -// ]; -// assert_eq!(expected_attributes, res_ok.attributes); -// let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); -// let some_other_prepropose = "neutron1someotheroverrule"; -// assert_eq!( -// updated_config, -// Config { -// owner: Addr::unchecked("owner"), -// overrule_pre_propose: Addr::unchecked(some_other_prepropose), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) -// } -// ); -// -// let msg = ExecuteMsg::UpdateConfig { -// owner: Some("neutron1newowner".to_string()), -// overrule_pre_propose: None, -// }; -// -// let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()).unwrap(); -// assert_eq!(0, res_ok.messages.len()); -// let expected_attributes = vec![ -// Attribute::new("action", "update_config"), -// Attribute::new("owner", "neutron1newowner"), -// Attribute::new("overrule_pre_propose", some_other_prepropose), -// ]; -// assert_eq!(expected_attributes, res_ok.attributes); -// let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); -// assert_eq!( -// updated_config, -// Config { -// owner: Addr::unchecked("neutron1newowner"), -// overrule_pre_propose: Addr::unchecked(some_other_prepropose), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) -// } -// ); -// -// // old owner -// let err = execute(deps.as_mut(), env, info, msg).unwrap_err(); -// assert_eq!("Unauthorized", err.to_string()); -// } -// -// #[test] -// fn test_query_config() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// let config = Config { -// owner: Addr::unchecked("owner"), -// overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), -// subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), -// }; -// CONFIG.save(deps.as_mut().storage, &config).unwrap(); -// let query_msg = QueryMsg::Config {}; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_config: Config = from_binary(&res).unwrap(); -// assert_eq!(config, queried_config) -// } -// -// #[test] -// fn test_query_proposals() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// for i in 1..=100 { -// let prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// PROPOSALS.save(deps.as_mut().storage, i, &prop).unwrap(); -// } -// for i in 1..=100 { -// let query_msg = QueryMsg::Proposal { proposal_id: i }; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_prop: SingleChoiceProposal = from_binary(&res).unwrap(); -// let expected_prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// assert_eq!(expected_prop, queried_prop) -// } -// -// let query_msg = QueryMsg::ListProposals { -// start_after: None, -// limit: None, -// }; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); -// for (p, i) in queried_props.proposals.iter().zip(1..) { -// let expected_prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// assert_eq!(expected_prop, *p); -// } -// assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); -// -// let query_msg = QueryMsg::ListProposals { -// start_after: None, -// limit: Some(100), -// }; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); -// for (p, i) in queried_props.proposals.iter().zip(1..) { -// let expected_prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// assert_eq!(expected_prop, *p); -// } -// assert_eq!(queried_props.proposals.len(), 100); -// -// let query_msg = QueryMsg::ListProposals { -// start_after: None, -// limit: Some(10), -// }; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); -// for (p, i) in queried_props.proposals.iter().zip(1..) { -// let expected_prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// assert_eq!(expected_prop, *p); -// } -// assert_eq!(queried_props.proposals.len(), 10); -// -// let query_msg = QueryMsg::ListProposals { -// start_after: Some(50), -// limit: None, -// }; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); -// for (p, i) in queried_props.proposals.iter().zip(51..) { -// let expected_prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// assert_eq!(expected_prop, *p); -// } -// assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); -// -// let query_msg = QueryMsg::ListProposals { -// start_after: Some(90), -// limit: None, -// }; -// let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); -// let queried_props: ProposalListResponse = from_binary(&res).unwrap(); -// for (p, i) in queried_props.proposals.iter().zip(91..) { -// let expected_prop = SingleChoiceProposal { -// id: i, -// msgs: vec![NeutronMsg::remove_interchain_query(i).into()], -// status: ProposalStatus::Timelocked, -// }; -// assert_eq!(expected_prop, *p); -// } -// assert_eq!(queried_props.proposals.len(), 10); -// } -// -// #[test] -// fn test_reply() { -// let mut overrule_proposal_status = Status::Open; -// let mut deps = mock_dependencies(&overrule_proposal_status); -// let msg = Reply { -// id: 10, -// result: SubMsgResult::Err("error".to_string()), -// }; -// let err = reply(deps.as_mut(), mock_env(), msg.clone()).unwrap_err(); -// assert_eq!("no such proposal (10)", err.to_string()); -// -// let prop = SingleChoiceProposal { -// id: 10, -// msgs: vec![NeutronMsg::remove_interchain_query(1).into()], -// status: ProposalStatus::Timelocked, -// }; -// PROPOSALS.save(deps.as_mut().storage, 10, &prop).unwrap(); -// let res_ok = reply(deps.as_mut(), mock_env(), msg).unwrap(); -// assert_eq!(0, res_ok.messages.len()); -// let expected_attributes = vec![Attribute::new("timelocked_proposal_execution_failed", "10")]; -// assert_eq!(expected_attributes, res_ok.attributes); -// } + +#[test] +fn test_overrule_proposal() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + let env = mock_env(); + let info = mock_info("neutron1unknownsender", &[]); + + let msg = ExecuteMsg::OverruleProposal { proposal_id: 10 }; + + let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); + assert_eq!( + "neutron_subdao_timelock_single::types::Config not found", + res.unwrap_err().to_string() + ); + + let config = Config { + owner: Addr::unchecked("owner"), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + CONFIG.save(deps.as_mut().storage, &config).unwrap(); + let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); + assert_eq!("Unauthorized", res.unwrap_err().to_string()); + + let info = mock_info("owner", &[]); + + let wrong_prop_statuses = vec![ + ProposalStatus::Executed, + ProposalStatus::ExecutionFailed, + ProposalStatus::Overruled, + ]; + for s in wrong_prop_statuses { + let proposal = SingleChoiceProposal { + id: 10, + msgs: vec![NeutronMsg::remove_interchain_query(1).into()], + status: s, + }; + PROPOSALS + .save(deps.as_mut().storage, proposal.id, &proposal) + .unwrap(); + let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); + assert_eq!( + format!("Wrong proposal status ({})", s), + res.unwrap_err().to_string() + ) + } + + let proposal = SingleChoiceProposal { + id: 10, + msgs: vec![NeutronMsg::remove_interchain_query(1).into()], + status: ProposalStatus::Timelocked, + }; + PROPOSALS + .save(deps.as_mut().storage, proposal.id, &proposal) + .unwrap(); + let res_ok = execute(deps.as_mut(), env, info.clone(), msg).unwrap(); + assert_eq!(0, res_ok.messages.len()); + let expected_attributes = vec![ + Attribute::new("action", "overrule_proposal"), + Attribute::new("sender", info.sender), + Attribute::new("proposal_id", proposal.id.to_string()), + ]; + assert_eq!(expected_attributes, res_ok.attributes); + let updated_prop = PROPOSALS.load(deps.as_mut().storage, 10).unwrap(); + assert_eq!(ProposalStatus::Overruled, updated_prop.status); +} + +#[test] +fn execute_update_config() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + let env = mock_env(); + let info = mock_info("neutron1unknownsender", &[]); + + let msg = ExecuteMsg::UpdateConfig { + owner: None, + overrule_pre_propose: Some("neutron1someotheroverrule".to_string()), + }; + + let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); + assert_eq!( + "neutron_subdao_timelock_single::types::Config not found", + res.unwrap_err().to_string() + ); + + let config = Config { + owner: Addr::unchecked("owner"), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + CONFIG.save(deps.as_mut().storage, &config).unwrap(); + let res = execute(deps.as_mut(), env.clone(), info, msg.clone()); + assert_eq!("Unauthorized", res.unwrap_err().to_string()); + + let info = mock_info("owner", &[]); + let config = Config { + owner: Addr::unchecked("none"), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + CONFIG.save(deps.as_mut().storage, &config).unwrap(); + let res = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()); + assert_eq!("Unauthorized", res.unwrap_err().to_string()); + + let config = Config { + owner: Addr::unchecked("owner"), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + CONFIG.save(deps.as_mut().storage, &config).unwrap(); + let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg).unwrap(); + assert_eq!(0, res_ok.messages.len()); + let expected_attributes = vec![ + Attribute::new("action", "update_config"), + Attribute::new("owner", "owner"), + Attribute::new("overrule_pre_propose", "neutron1someotheroverrule"), + ]; + assert_eq!(expected_attributes, res_ok.attributes); + let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); + let some_other_prepropose = "neutron1someotheroverrule"; + assert_eq!( + updated_config, + Config { + owner: Addr::unchecked("owner"), + overrule_pre_propose: Addr::unchecked(some_other_prepropose), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) + } + ); + + let msg = ExecuteMsg::UpdateConfig { + owner: Some("neutron1newowner".to_string()), + overrule_pre_propose: None, + }; + + let res_ok = execute(deps.as_mut(), env.clone(), info.clone(), msg.clone()).unwrap(); + assert_eq!(0, res_ok.messages.len()); + let expected_attributes = vec![ + Attribute::new("action", "update_config"), + Attribute::new("owner", "neutron1newowner"), + Attribute::new("overrule_pre_propose", some_other_prepropose), + ]; + assert_eq!(expected_attributes, res_ok.attributes); + let updated_config = CONFIG.load(deps.as_mut().storage).unwrap(); + assert_eq!( + updated_config, + Config { + owner: Addr::unchecked("neutron1newowner"), + overrule_pre_propose: Addr::unchecked(some_other_prepropose), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR) + } + ); + + // old owner + let err = execute(deps.as_mut(), env, info, msg).unwrap_err(); + assert_eq!("Unauthorized", err.to_string()); +} + +#[test] +fn test_query_config() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + let config = Config { + owner: Addr::unchecked("owner"), + overrule_pre_propose: Addr::unchecked(MOCK_OVERRULE_PREPROPOSAL), + subdao: Addr::unchecked(MOCK_SUBDAO_CORE_ADDR), + }; + CONFIG.save(deps.as_mut().storage, &config).unwrap(); + let query_msg = QueryMsg::Config {}; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_config: Config = from_binary(&res).unwrap(); + assert_eq!(config, queried_config) +} + +#[test] +fn test_query_proposals() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + for i in 1..=100 { + let prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + PROPOSALS.save(deps.as_mut().storage, i, &prop).unwrap(); + } + for i in 1..=100 { + let query_msg = QueryMsg::Proposal { proposal_id: i }; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_prop: SingleChoiceProposal = from_binary(&res).unwrap(); + let expected_prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + assert_eq!(expected_prop, queried_prop) + } + + let query_msg = QueryMsg::ListProposals { + start_after: None, + limit: None, + }; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_props: ProposalListResponse = from_binary(&res).unwrap(); + for (p, i) in queried_props.proposals.iter().zip(1..) { + let expected_prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + assert_eq!(expected_prop, *p); + } + assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); + + let query_msg = QueryMsg::ListProposals { + start_after: None, + limit: Some(100), + }; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_props: ProposalListResponse = from_binary(&res).unwrap(); + for (p, i) in queried_props.proposals.iter().zip(1..) { + let expected_prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + assert_eq!(expected_prop, *p); + } + assert_eq!(queried_props.proposals.len(), 100); + + let query_msg = QueryMsg::ListProposals { + start_after: None, + limit: Some(10), + }; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_props: ProposalListResponse = from_binary(&res).unwrap(); + for (p, i) in queried_props.proposals.iter().zip(1..) { + let expected_prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + assert_eq!(expected_prop, *p); + } + assert_eq!(queried_props.proposals.len(), 10); + + let query_msg = QueryMsg::ListProposals { + start_after: Some(50), + limit: None, + }; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_props: ProposalListResponse = from_binary(&res).unwrap(); + for (p, i) in queried_props.proposals.iter().zip(51..) { + let expected_prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + assert_eq!(expected_prop, *p); + } + assert_eq!(queried_props.proposals.len(), DEFAULT_LIMIT as usize); + + let query_msg = QueryMsg::ListProposals { + start_after: Some(90), + limit: None, + }; + let res = query(deps.as_ref(), mock_env(), query_msg).unwrap(); + let queried_props: ProposalListResponse = from_binary(&res).unwrap(); + for (p, i) in queried_props.proposals.iter().zip(91..) { + let expected_prop = SingleChoiceProposal { + id: i, + msgs: vec![NeutronMsg::remove_interchain_query(i).into()], + status: ProposalStatus::Timelocked, + }; + assert_eq!(expected_prop, *p); + } + assert_eq!(queried_props.proposals.len(), 10); +} + +#[test] +fn test_reply() { + let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); + let msg = Reply { + id: 10, + result: SubMsgResult::Err("error".to_string()), + }; + let err = reply(deps.as_mut(), mock_env(), msg.clone()).unwrap_err(); + assert_eq!("no such proposal (10)", err.to_string()); + + let prop = SingleChoiceProposal { + id: 10, + msgs: vec![NeutronMsg::remove_interchain_query(1).into()], + status: ProposalStatus::Timelocked, + }; + PROPOSALS.save(deps.as_mut().storage, 10, &prop).unwrap(); + let res_ok = reply(deps.as_mut(), mock_env(), msg).unwrap(); + assert_eq!(0, res_ok.messages.len()); + let expected_attributes = vec![Attribute::new("timelocked_proposal_execution_failed", "10")]; + assert_eq!(expected_attributes, res_ok.attributes); +} diff --git a/packages/neutron-subdao-timelock-single/src/types.rs b/packages/neutron-subdao-timelock-single/src/types.rs index 5e50fb84..1360f787 100644 --- a/packages/neutron-subdao-timelock-single/src/types.rs +++ b/packages/neutron-subdao-timelock-single/src/types.rs @@ -1,5 +1,5 @@ use cosmwasm_std::Addr; -use cosmwasm_std::{CosmosMsg, Timestamp}; +use cosmwasm_std::CosmosMsg; use neutron_bindings::bindings::msg::NeutronMsg; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; From 501cbea064f7c88289be154c831feef2eab67b92 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:20:37 +0300 Subject: [PATCH 33/53] clippy --- .../src/testing/mock_querier.rs | 1 - .../src/testing/tests.rs | 26 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index 09d33ead..aeca84df 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -1,4 +1,3 @@ -use std::borrow::Borrow; use std::cell::RefCell; use std::marker::PhantomData; use std::rc::Rc; diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index 1254b229..93e67d8e 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -10,13 +10,13 @@ use neutron_subdao_timelock_single::{ msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, types::{Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal}, }; -use schemars::schema::InstanceType::String; -use std::any::Any; + + use std::cell::RefCell; use std::rc::Rc; use crate::testing::mock_querier::{ - WasmMockQuerier, MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL, + MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL, }; use crate::{ contract::{execute, instantiate, query, reply}, @@ -31,7 +31,7 @@ use super::mock_querier::{mock_dependencies, MOCK_SUBDAO_CORE_ADDR}; #[test] fn test_instantiate_test() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); @@ -87,7 +87,7 @@ fn test_instantiate_test() { #[test] fn test_execute_timelock_proposal() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); @@ -113,7 +113,7 @@ fn test_execute_timelock_proposal() { assert_eq!("Unauthorized", res.unwrap_err().to_string()); let info = mock_info(MOCK_SUBDAO_CORE_ADDR, &[]); - let res_ok = execute(deps.as_mut(), env.clone(), info, msg).unwrap(); + let res_ok = execute(deps.as_mut(), env, info, msg).unwrap(); let expected_attributes = vec![ Attribute::new("action", "timelock_proposal"), Attribute::new("sender", MOCK_SUBDAO_CORE_ADDR), @@ -149,9 +149,9 @@ fn test_execute_timelock_proposal() { #[test] fn test_execute_proposal() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); - let mut env = mock_env(); + let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); let msg = ExecuteMsg::ExecuteProposal { proposal_id: 10 }; @@ -230,7 +230,7 @@ fn test_execute_proposal() { #[test] fn test_overrule_proposal() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); @@ -297,7 +297,7 @@ fn test_overrule_proposal() { #[test] fn execute_update_config() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let env = mock_env(); let info = mock_info("neutron1unknownsender", &[]); @@ -387,7 +387,7 @@ fn execute_update_config() { #[test] fn test_query_config() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let config = Config { owner: Addr::unchecked("owner"), @@ -403,7 +403,7 @@ fn test_query_config() { #[test] fn test_query_proposals() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); for i in 1..=100 { let prop = SingleChoiceProposal { @@ -508,7 +508,7 @@ fn test_query_proposals() { #[test] fn test_reply() { - let mut overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); + let overrule_proposal_status = Rc::new(RefCell::new(Status::Open)); let mut deps = mock_dependencies(Rc::clone(&overrule_proposal_status)); let msg = Reply { id: 10, From ff3f197b7601d54653465eaf0539bbaf22b1e55d Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:22:49 +0300 Subject: [PATCH 34/53] fmt --- .../subdaos/cwd-subdao-timelock-single/src/testing/tests.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs index 93e67d8e..84b7090c 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/tests.rs @@ -11,13 +11,10 @@ use neutron_subdao_timelock_single::{ types::{Config, ProposalListResponse, ProposalStatus, SingleChoiceProposal}, }; - use std::cell::RefCell; use std::rc::Rc; -use crate::testing::mock_querier::{ - MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL, -}; +use crate::testing::mock_querier::{MOCK_MAIN_DAO_ADDR, MOCK_OVERRULE_PREPROPOSAL}; use crate::{ contract::{execute, instantiate, query, reply}, state::{CONFIG, DEFAULT_LIMIT, PROPOSALS}, From ba6ad379f4254621c257706be4f751b294a5db3e Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 4 Apr 2023 19:19:03 +0300 Subject: [PATCH 35/53] redundant deps --- Cargo.lock | 7 ------- .../pre-propose/cwd-pre-propose-single-overrule/Cargo.toml | 1 - .../pre-propose/cwd-subdao-pre-propose-single/Cargo.toml | 6 ------ 3 files changed, 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cd9d701a..8ac0b27c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -730,7 +730,6 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-denom", - "cw-multi-test 0.13.4", "cw-storage-plus 0.13.4", "cw-utils 0.13.4", "cw2 0.13.4", @@ -897,18 +896,12 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-denom", - "cw-multi-test 0.13.4", "cw-storage-plus 0.13.4", "cw-utils 0.13.4", "cw2 0.13.4", "cw20 0.13.4", - "cw20-base", - "cw4-group", "cwd-interface", "cwd-pre-propose-base", - "cwd-proposal-hooks", - "cwd-subdao-core", - "cwd-subdao-proposal-single", "cwd-voting", "neutron-sdk", "neutron-subdao-pre-propose-single", diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml index d5e6e40b..bde90b04 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/Cargo.toml @@ -35,7 +35,6 @@ cwd-proposal-single = { version = "*", path = "../../../../contracts/dao/proposa [dev-dependencies] cosmwasm-schema = "1.0.0" -cw-multi-test = "0.13.2" cw-utils = "0.13.2" cwd-proposal-single = { path = "../../proposal/cwd-proposal-single" } cwd-core = { path = "../../cwd-core" } diff --git a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/Cargo.toml b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/Cargo.toml index d68c385e..2622eabb 100644 --- a/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/Cargo.toml +++ b/contracts/subdaos/pre-propose/cwd-subdao-pre-propose-single/Cargo.toml @@ -32,14 +32,8 @@ cwd-interface = { path = "../../../../packages/cwd-interface" } [dev-dependencies] cosmwasm-schema = "1.0.0" -cw-multi-test = "0.13.2" cw-utils = "0.13.2" -cw4-group = "0.13.2" cw20 = "0.13.2" -cw20-base = "0.13.2" -cwd-subdao-proposal-single = { path = "../../proposal/cwd-subdao-proposal-single" } -cwd-subdao-core = { path = "../../cwd-subdao-core" } cwd-voting = { path = "../../../../packages/cwd-voting" } cw-denom = { path = "../../../../packages/cw-denom" } cwd-interface = { path = "../../../../packages/cwd-interface" } -cwd-proposal-hooks = { path = "../../../../packages/cwd-proposal-hooks" } From bb4cbb38d7bb661a1be19980b09e6695cbf577ff Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Wed, 5 Apr 2023 11:24:31 +0300 Subject: [PATCH 36/53] fixed proposalresponse --- .../subdaos/cwd-subdao-timelock-single/src/contract.rs | 5 +++-- .../cwd-subdao-timelock-single/src/testing/mock_querier.rs | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index b77ae873..92d9e6a1 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -8,6 +8,7 @@ use cw2::set_contract_version; use cw_storage_plus::Bound; use cwd_proposal_single::{ msg::QueryMsg as MainDaoProposalModuleQueryMsg, + query::ProposalResponse as MainDaoProposalResponse, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, }; use cwd_voting::status::Status; @@ -295,13 +296,13 @@ fn is_overrule_proposal_rejected( let propose: Addr = deps .querier .query_wasm_smart(overrule_pre_propose, &OverruleQueryMsg::ProposalModule {})?; - let overrule_proposal: MainDaoSingleChoiceProposal = deps.querier.query_wasm_smart( + let overrule_proposal: MainDaoProposalResponse = deps.querier.query_wasm_smart( propose, &MainDaoProposalModuleQueryMsg::Proposal { proposal_id: overrule_proposal_id, }, )?; - Ok(overrule_proposal.status == Status::Rejected) + Ok(overrule_proposal.proposal.status == Status::Rejected) } #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index aeca84df..1d99d085 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -13,6 +13,7 @@ use cwd_proposal_single::{ msg::{QueryMsg as ProposeQuery, QueryMsg}, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, state::Config as OverrulProposalConfig, + query::ProposalResponse as MainDaoProposalResponse, }; use cwd_voting::status::Status; use cwd_voting::threshold::Threshold; @@ -117,7 +118,8 @@ impl WasmMockQuerier { dao: Addr::unchecked(MOCK_MAIN_DAO_ADDR), close_proposal_on_execution_failure: false, }), - QueryMsg::Proposal { .. } => to_binary(&MainDaoSingleChoiceProposal { + QueryMsg::Proposal { .. } => to_binary(&MainDaoProposalResponse{ id: 1, proposal: + MainDaoSingleChoiceProposal { title: "".to_string(), description: "".to_string(), proposer: Addr::unchecked(""), @@ -137,7 +139,7 @@ impl WasmMockQuerier { abstain: Default::default(), }, allow_revoting: false, - }), + }}), QueryMsg::ListProposals { .. } => todo!(), QueryMsg::ReverseProposals { .. } => todo!(), QueryMsg::ProposalCount { .. } => todo!(), From 4b8b946acbdc629424a7f48111a91540c7709db1 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 6 Apr 2023 16:53:55 +0300 Subject: [PATCH 37/53] fixed preproposal hooks --- .../src/contract.rs | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 3f37fb94..fd2eaaae 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -73,7 +73,7 @@ pub fn execute( // we transform an external message which omits that field into an // internal message which sets it. type ExecuteInternal = ExecuteBase; - match msg { + let internal_msg = match msg { ExecuteMsg::Propose { msg: ProposeMessage::ProposeOverrule { @@ -138,12 +138,31 @@ pub fn execute( next_proposal_id, )?; - PrePropose::default() - .execute(deps, env, info, internal_msg) - .map_err(PreProposeOverruleError::PreProposeBase) - } + Ok(internal_msg) + }, + ExecuteMsg::ProposalCreatedHook { + proposal_id, + proposer, + } => Ok(ExecuteInternal::ProposalCreatedHook { + proposal_id, + proposer, + }), + ExecuteMsg::ProposalCompletedHook { + proposal_id, + new_status, + } => Ok(ExecuteInternal::ProposalCompletedHook { + proposal_id, + new_status, + }), + // ExecuteMsg::Withdraw and ExecuteMsg::UpdateConfig are unsupported + // ExecuteMsg::Withdraw is unsupported because overrule proposals should have no deposits + // ExecuteMsg::UpdateConfig since the config has only the info about deposits, + // no custom fields are added. _ => Err(PreProposeOverruleError::MessageUnsupported {}), - } + }; + PrePropose::default() + .execute(deps, env, info, internal_msg?) + .map_err(PreProposeOverruleError::PreProposeBase) } fn get_subdao_from_timelock( From 82147dd2beb5fef2afb295f77f9c48329f1768d4 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 6 Apr 2023 17:04:12 +0300 Subject: [PATCH 38/53] fmt --- .../src/contract.rs | 2 +- .../src/contract.rs | 2 +- .../src/testing/mock_querier.rs | 46 ++++++++++--------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index fd2eaaae..25de243e 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -139,7 +139,7 @@ pub fn execute( )?; Ok(internal_msg) - }, + } ExecuteMsg::ProposalCreatedHook { proposal_id, proposer, diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 92d9e6a1..55e77929 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -8,8 +8,8 @@ use cw2::set_contract_version; use cw_storage_plus::Bound; use cwd_proposal_single::{ msg::QueryMsg as MainDaoProposalModuleQueryMsg, - query::ProposalResponse as MainDaoProposalResponse, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, + query::ProposalResponse as MainDaoProposalResponse, }; use cwd_voting::status::Status; use neutron_bindings::bindings::msg::NeutronMsg; diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs index 1d99d085..a54dd8e3 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/testing/mock_querier.rs @@ -12,8 +12,8 @@ use cw_utils::Duration; use cwd_proposal_single::{ msg::{QueryMsg as ProposeQuery, QueryMsg}, proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, - state::Config as OverrulProposalConfig, query::ProposalResponse as MainDaoProposalResponse, + state::Config as OverrulProposalConfig, }; use cwd_voting::status::Status; use cwd_voting::threshold::Threshold; @@ -118,28 +118,30 @@ impl WasmMockQuerier { dao: Addr::unchecked(MOCK_MAIN_DAO_ADDR), close_proposal_on_execution_failure: false, }), - QueryMsg::Proposal { .. } => to_binary(&MainDaoProposalResponse{ id: 1, proposal: - MainDaoSingleChoiceProposal { - title: "".to_string(), - description: "".to_string(), - proposer: Addr::unchecked(""), - start_height: 0, - min_voting_period: None, - expiration: Default::default(), - threshold: Threshold::AbsoluteCount { - threshold: Uint128::new(1), + QueryMsg::Proposal { .. } => to_binary(&MainDaoProposalResponse { + id: 1, + proposal: MainDaoSingleChoiceProposal { + title: "".to_string(), + description: "".to_string(), + proposer: Addr::unchecked(""), + start_height: 0, + min_voting_period: None, + expiration: Default::default(), + threshold: Threshold::AbsoluteCount { + threshold: Uint128::new(1), + }, + total_power: Default::default(), + msgs: vec![], + // status: Status::Rejected, + status: *(*self.overrule_proposal_status).borrow(), + votes: Votes { + yes: Default::default(), + no: Default::default(), + abstain: Default::default(), + }, + allow_revoting: false, }, - total_power: Default::default(), - msgs: vec![], - // status: Status::Rejected, - status: *(*self.overrule_proposal_status).borrow(), - votes: Votes { - yes: Default::default(), - no: Default::default(), - abstain: Default::default(), - }, - allow_revoting: false, - }}), + }), QueryMsg::ListProposals { .. } => todo!(), QueryMsg::ReverseProposals { .. } => todo!(), QueryMsg::ProposalCount { .. } => todo!(), From 2dc5f6efc3892dafca537b329bef763744e431e9 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 6 Apr 2023 17:43:24 +0300 Subject: [PATCH 39/53] clippy --- contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index 55e77929..d7e34f79 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -8,7 +8,6 @@ use cw2::set_contract_version; use cw_storage_plus::Bound; use cwd_proposal_single::{ msg::QueryMsg as MainDaoProposalModuleQueryMsg, - proposal::SingleChoiceProposal as MainDaoSingleChoiceProposal, query::ProposalResponse as MainDaoProposalResponse, }; use cwd_voting::status::Status; From 7d8dd6f930204f50d2c7d49b6df8ed65787c833e Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Sun, 9 Apr 2023 11:34:49 +0300 Subject: [PATCH 40/53] housekeeping --- .../pre-propose/cwd-pre-propose-single-overrule/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs index 94d30a08..c8622d46 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/lib.rs @@ -1,6 +1,6 @@ pub mod contract; -pub mod error; -pub mod state; +mod error; +mod state; #[cfg(test)] pub mod testing; From 1a56936ce5fa7653334aa418cf1492e796c3fec5 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Sun, 9 Apr 2023 12:12:21 +0300 Subject: [PATCH 41/53] error descriptions --- .../pre-propose/cwd-pre-propose-single-overrule/src/error.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index 72ebae4c..52ac36af 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -19,9 +19,9 @@ pub enum PreProposeOverruleError { #[error("Subdao isn't in the list.")] ForbiddenSubdao {}, - #[error("")] + #[error("Subdao proposal isn't timelocked")] ProposalWrongState {}, - #[error("")] + #[error("Overrule proposal for this subdao proposal already created")] AlreadyExists {}, } From 8dd178e20decf8a61cbbaa8bc17c43bd662ac63f Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Mon, 10 Apr 2023 02:04:53 +0300 Subject: [PATCH 42/53] more error descriptions --- .../cwd-pre-propose-single-overrule/src/contract.rs | 5 ++--- .../pre-propose/cwd-pre-propose-single-overrule/src/error.rs | 4 ++-- .../cwd-pre-propose-single-overrule/src/testing/tests.rs | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 25de243e..4f5140eb 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -83,11 +83,10 @@ pub fn execute( } => { let timelock_contract_addr = deps.api.addr_validate(&timelock_contract)?; - if PROPOSALS + if let Ok(id) = PROPOSALS .load(deps.storage, (proposal_id, timelock_contract_addr.clone())) - .is_ok() { - return Err(PreProposeOverruleError::AlreadyExists {}); + return Err(PreProposeOverruleError::AlreadyExists {id}); } let subdao_address = get_subdao_from_timelock(&deps, &timelock_contract)?; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index 52ac36af..cbec2f09 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -22,6 +22,6 @@ pub enum PreProposeOverruleError { #[error("Subdao proposal isn't timelocked")] ProposalWrongState {}, - #[error("Overrule proposal for this subdao proposal already created")] - AlreadyExists {}, + #[error("Overrule proposal for this subdao proposal already created with id ({id})")] + AlreadyExists { id: u64 }, } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 7fe34bda..c0b05e33 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -282,5 +282,5 @@ fn test_double_creation() { msg, ); assert!(res_not_ok.is_err()); - assert_eq!(res_not_ok, Err(PreProposeOverruleError::AlreadyExists {})); + assert_eq!(res_not_ok, Err(PreProposeOverruleError::AlreadyExists { id: PROPOSALS_COUNT + 1 })); } From 430ffe03dd308c8bda3cf4e8a1adfaae289b0cec Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Mon, 10 Apr 2023 02:09:50 +0300 Subject: [PATCH 43/53] fmt --- .../cwd-pre-propose-single-overrule/src/contract.rs | 6 +++--- .../cwd-pre-propose-single-overrule/src/testing/tests.rs | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 4f5140eb..c2236f8f 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -83,10 +83,10 @@ pub fn execute( } => { let timelock_contract_addr = deps.api.addr_validate(&timelock_contract)?; - if let Ok(id) = PROPOSALS - .load(deps.storage, (proposal_id, timelock_contract_addr.clone())) + if let Ok(id) = + PROPOSALS.load(deps.storage, (proposal_id, timelock_contract_addr.clone())) { - return Err(PreProposeOverruleError::AlreadyExists {id}); + return Err(PreProposeOverruleError::AlreadyExists { id }); } let subdao_address = get_subdao_from_timelock(&deps, &timelock_contract)?; diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index c0b05e33..6912ed59 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -282,5 +282,10 @@ fn test_double_creation() { msg, ); assert!(res_not_ok.is_err()); - assert_eq!(res_not_ok, Err(PreProposeOverruleError::AlreadyExists { id: PROPOSALS_COUNT + 1 })); + assert_eq!( + res_not_ok, + Err(PreProposeOverruleError::AlreadyExists { + id: PROPOSALS_COUNT + 1 + }) + ); } From 3ee3cabb42e98685b6cba9c4a12665158cbf2554 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 11 Apr 2023 00:14:59 +0300 Subject: [PATCH 44/53] refactoring+comments --- .../src/contract.rs | 40 +++++++++++-------- .../src/error.rs | 2 +- .../src/testing/tests.rs | 2 +- .../src/contract.rs | 4 ++ 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index c2236f8f..bc915a6d 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -35,6 +35,9 @@ pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); pub(crate) const SUBDAOS_QUERY_LIMIT: u32 = 10; +const PROPOSAL_DESCRIPTION_FORMAT: &str = "If this proposal will be accepted, the DAO is going to\ +overrule the proposal #{} of '{}' subdao (address {})"; + type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] @@ -44,15 +47,16 @@ pub fn instantiate( info: MessageInfo, _msg: InstantiateMsg, ) -> Result { - // the contract has no info for instantiation so far, so it just calls the init function of base - // deposit is set to zero because it makes no sense for overrule proposals - // for open submission it's tbd + // The contract has no info for instantiation so far, so it just calls the init function of base let resp = PrePropose::default().instantiate( deps.branch(), env, info, InstantiateBase { + // We restrict deposits since overrule proposals are supposed to be created automatically deposit_info: None, + // Actually, the overrule proposal is going to be created by the timelock contract which + // is not the DAO member and has no voting power. open_proposal_submission: true, }, )?; @@ -68,10 +72,6 @@ pub fn execute( info: MessageInfo, msg: ExecuteMsg, ) -> Result { - // We don't want to expose the `proposer` field on the propose - // message externally as that is to be set by this module. Here, - // we transform an external message which omits that field into an - // internal message which sets it. type ExecuteInternal = ExecuteBase; let internal_msg = match msg { ExecuteMsg::Propose { @@ -91,16 +91,18 @@ pub fn execute( let subdao_address = get_subdao_from_timelock(&deps, &timelock_contract)?; - // we need this check since the timelock contract might be an impostor + // We need this check since the timelock contract might be an impostor + // E.g. the timelock contract might be a malicious contract that is not a part of + // the subdao but pretends to be. if get_timelock_from_subdao(&deps, &subdao_address)? != timelock_contract { - return Err(PreProposeOverruleError::SubdaoMisconfured {}); + return Err(PreProposeOverruleError::SubdaoMisconfigured {}); } - if !check_if_subdao_legit(&deps, &subdao_address)? { + if !is_subdao_legit(&deps, &subdao_address)? { return Err(PreProposeOverruleError::ForbiddenSubdao {}); } - if !check_is_proposal_timelocked( + if !is_proposal_timelocked( &deps, &Addr::unchecked(timelock_contract_addr.clone()), proposal_id, @@ -115,9 +117,12 @@ pub fn execute( }); let subdao_name = get_subdao_name(&deps, &subdao_address)?; + let prop_name: String = format!( + "Reject the proposal #{} of the '{}' subdao", + proposal_id, subdao_name + ); let prop_desc: String = - format!("Reject the decision made by the {} subdao", subdao_name); - let prop_name: String = format!("Overrule proposal {} of {}", proposal_id, subdao_name); + format!(PROPOSAL_DESCRIPTION_FORMAT, proposal_id, subdao_name, subdao_address); let internal_msg = ExecuteInternal::Propose { msg: ProposeMessageInternal::Propose { @@ -139,6 +144,7 @@ pub fn execute( Ok(internal_msg) } + // The following messages are forwarded to the base contract ExecuteMsg::ProposalCreatedHook { proposal_id, proposer, @@ -190,7 +196,7 @@ fn get_timelock_from_subdao( )?; if proposal_modules.is_empty() { - return Err(PreProposeOverruleError::SubdaoMisconfured {}); + return Err(PreProposeOverruleError::SubdaoMisconfigured {}); } let prop_policy: ProposalCreationPolicy = deps.querier.query_wasm_smart( @@ -199,7 +205,7 @@ fn get_timelock_from_subdao( )?; match prop_policy { - ProposalCreationPolicy::Anyone {} => Err(PreProposeOverruleError::SubdaoMisconfured {}), + ProposalCreationPolicy::Anyone {} => Err(PreProposeOverruleError::SubdaoMisconfigured {}), ProposalCreationPolicy::Module { addr } => { let timelock: Addr = deps.querier.query_wasm_smart( addr, @@ -212,7 +218,7 @@ fn get_timelock_from_subdao( } } -fn check_if_subdao_legit( +fn is_subdao_legit( deps: &DepsMut, subdao_core: &Addr, ) -> Result { @@ -270,7 +276,7 @@ fn get_next_proposal_id(deps: &DepsMut) -> Result Ok(last_proposal_id + 1) } -fn check_is_proposal_timelocked( +fn is_proposal_timelocked( deps: &DepsMut, timelock: &Addr, proposal_id: u64, diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index cbec2f09..0cd7181a 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -14,7 +14,7 @@ pub enum PreProposeOverruleError { MessageUnsupported {}, #[error("Subdao is wrongly configured.")] - SubdaoMisconfured {}, + SubdaoMisconfigured {}, #[error("Subdao isn't in the list.")] ForbiddenSubdao {}, diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index 6912ed59..c0976248 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -205,7 +205,7 @@ fn test_impostor_timelock() { msg, ); assert!(res.is_err()); - assert_eq!(res, Err(PreProposeOverruleError::SubdaoMisconfured {})); + assert_eq!(res, Err(PreProposeOverruleError::SubdaoMisconfigured {})); } #[test] diff --git a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs index d7e34f79..030d7c04 100644 --- a/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs +++ b/contracts/subdaos/cwd-subdao-timelock-single/src/contract.rs @@ -47,6 +47,10 @@ pub fn instantiate( .querier .query_wasm_smart(subdao_core.clone(), &SubdaoQuery::MainDao {})?; + // We don't validate overrule pre propose address more than just as address. + // We could also query the DAO address of this module and check if it matches the main DAO set + // in the config. But we don't do that because it would require for the subdao to know much more + // about the main DAO than it should IMO. It also makes testing harder. let overrule_pre_propose = deps.api.addr_validate(&msg.overrule_pre_propose)?; let config = Config { From 9841bb0290e243cc6c45bcbac90dcab6c1c3915e Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 11 Apr 2023 00:35:37 +0300 Subject: [PATCH 45/53] format fix --- .../src/contract.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index bc915a6d..96767faa 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -35,9 +35,6 @@ pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); pub(crate) const SUBDAOS_QUERY_LIMIT: u32 = 10; -const PROPOSAL_DESCRIPTION_FORMAT: &str = "If this proposal will be accepted, the DAO is going to\ -overrule the proposal #{} of '{}' subdao (address {})"; - type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] @@ -121,8 +118,11 @@ pub fn execute( "Reject the proposal #{} of the '{}' subdao", proposal_id, subdao_name ); - let prop_desc: String = - format!(PROPOSAL_DESCRIPTION_FORMAT, proposal_id, subdao_name, subdao_address); + let prop_desc: String = format!( + "If this proposal will be accepted, the DAO is going to \ +overrule the proposal #{} of '{}' subdao (address {})", + proposal_id, subdao_name, subdao_address + ); let internal_msg = ExecuteInternal::Propose { msg: ProposeMessageInternal::Propose { @@ -218,10 +218,7 @@ fn get_timelock_from_subdao( } } -fn is_subdao_legit( - deps: &DepsMut, - subdao_core: &Addr, -) -> Result { +fn is_subdao_legit(deps: &DepsMut, subdao_core: &Addr) -> Result { let main_dao = get_main_dao_address(deps)?; let mut start_after: Option = None; From d2a1fd69e24f2a94f7a30d86f9674a9916fd8c7d Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Tue, 11 Apr 2023 00:43:33 +0300 Subject: [PATCH 46/53] tests fix --- .../src/testing/tests.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index c0976248..e578ae65 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -17,8 +17,8 @@ use crate::error::PreProposeOverruleError; use crate::testing::mock_querier::{ get_dao_with_impostor_subdao, get_dao_with_impostor_timelock, get_dao_with_many_subdaos, get_properly_initialized_dao, ContractQuerier, MOCK_DAO_PROPOSE_MODULE, - MOCK_IMPOSTOR_TIMELOCK_CONTRACT, NON_TIMELOCKED_PROPOSAL_ID, PROPOSALS_COUNT, SUBDAO_NAME, - TIMELOCKED_PROPOSAL_ID, + MOCK_IMPOSTOR_TIMELOCK_CONTRACT, MOCK_SUBDAO_CORE, NON_TIMELOCKED_PROPOSAL_ID, PROPOSALS_COUNT, + SUBDAO_NAME, TIMELOCKED_PROPOSAL_ID, }; use cwd_pre_propose_base::state::Config; use cwd_proposal_single::msg::ExecuteMsg as ProposeMessageInternal; @@ -50,8 +50,15 @@ fn test_create_overrule_proposal() { msg, ); assert!(res.is_ok()); - let prop_desc: String = format!("Reject the decision made by the {} subdao", SUBDAO_NAME); - let prop_name: String = format!("Overrule proposal {} of {}", PROPOSAL_ID, SUBDAO_NAME); + let prop_name: String = format!( + "Reject the proposal #{} of the '{}' subdao", + PROPOSAL_ID, SUBDAO_NAME + ); + let prop_desc: String = format!( + "If this proposal will be accepted, the DAO is going to \ +overrule the proposal #{} of '{}' subdao (address {})", + PROPOSAL_ID, SUBDAO_NAME, MOCK_SUBDAO_CORE + ); assert_eq!( res.unwrap().messages, vec![SubMsg::new(CosmosMsg::Wasm(WasmMsg::Execute { From c63fad0968e29d4175ba3b32227dc4e8384f0bdd Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 13 Apr 2023 13:34:27 +0300 Subject: [PATCH 47/53] post-review error descriptions fixes --- .../cwd-pre-propose-single-overrule/src/error.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs index 0cd7181a..31fd1345 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/error.rs @@ -10,13 +10,13 @@ pub enum PreProposeOverruleError { #[error(transparent)] PreProposeBase(PreProposeError), - #[error("Base pre propose messages aren't supported.")] + #[error("Base pre propose messages aren't supported")] MessageUnsupported {}, - #[error("Subdao is wrongly configured.")] + #[error("Subdao is misconfigured")] SubdaoMisconfigured {}, - #[error("Subdao isn't in the list.")] + #[error("Subdao isn't in the list")] ForbiddenSubdao {}, #[error("Subdao proposal isn't timelocked")] From 9fd4d73b9bf45306b22f38d486d1d4bea4684c3a Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:11:45 +0300 Subject: [PATCH 48/53] post-review refactoring --- .../src/contract.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 96767faa..6bb87a49 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -101,7 +101,7 @@ pub fn execute( if !is_proposal_timelocked( &deps, - &Addr::unchecked(timelock_contract_addr.clone()), + &timelock_contract_addr, proposal_id, )? { return Err(PreProposeOverruleError::ProposalWrongState {}); @@ -195,12 +195,15 @@ fn get_timelock_from_subdao( }, )?; - if proposal_modules.is_empty() { - return Err(PreProposeOverruleError::SubdaoMisconfigured {}); - } + let proposal_module = proposal_modules + .first() + .ok_or(PreProposeOverruleError::SubdaoMisconfigured {}, + )? + .address + .clone(); let prop_policy: ProposalCreationPolicy = deps.querier.query_wasm_smart( - proposal_modules.first().unwrap().address.clone(), + proposal_module, &SubdaoProposalMsg::QueryMsg::ProposalCreationPolicy {}, )?; @@ -246,7 +249,7 @@ fn is_subdao_legit(deps: &DepsMut, subdao_core: &Addr) -> Result Date: Thu, 13 Apr 2023 14:12:16 +0300 Subject: [PATCH 49/53] post-review fmt --- .../cwd-pre-propose-single-overrule/src/contract.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 6bb87a49..9bcd292e 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -99,11 +99,7 @@ pub fn execute( return Err(PreProposeOverruleError::ForbiddenSubdao {}); } - if !is_proposal_timelocked( - &deps, - &timelock_contract_addr, - proposal_id, - )? { + if !is_proposal_timelocked(&deps, &timelock_contract_addr, proposal_id)? { return Err(PreProposeOverruleError::ProposalWrongState {}); } @@ -197,8 +193,7 @@ fn get_timelock_from_subdao( let proposal_module = proposal_modules .first() - .ok_or(PreProposeOverruleError::SubdaoMisconfigured {}, - )? + .ok_or(PreProposeOverruleError::SubdaoMisconfigured {})? .address .clone(); From 6f8dcfdd34eed7849e507b85b5873d04c676cc0d Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:15:35 +0300 Subject: [PATCH 50/53] post-review refactoring --- .../cwd-pre-propose-single-overrule/src/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 9bcd292e..51ce3418 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -86,7 +86,7 @@ pub fn execute( return Err(PreProposeOverruleError::AlreadyExists { id }); } - let subdao_address = get_subdao_from_timelock(&deps, &timelock_contract)?; + let subdao_address = get_subdao_from_timelock(&deps, &timelock_contract_addr)?; // We need this check since the timelock contract might be an impostor // E.g. the timelock contract might be a malicious contract that is not a part of @@ -168,7 +168,7 @@ overrule the proposal #{} of '{}' subdao (address {})", fn get_subdao_from_timelock( deps: &DepsMut, - timelock_contract: &String, + timelock_contract: &Addr, ) -> Result { let timelock_config: TimelockTypes::Config = deps.querier.query_wasm_smart( timelock_contract.to_string(), From 2d08e28f967efc287f77e4ec4b5b02dcdfb5c90a Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 13 Apr 2023 19:34:01 +0300 Subject: [PATCH 51/53] post-review get subdao query --- contracts/dao/cwd-core/src/contract.rs | 18 ++++++ contracts/dao/cwd-core/src/msg.rs | 2 + .../src/contract.rs | 43 +++---------- .../src/testing/mock_querier.rs | 61 +++++-------------- .../src/testing/tests.rs | 25 +------- .../cwd-proposal-single/src/testing/tests.rs | 47 ++++++++++++-- 6 files changed, 87 insertions(+), 109 deletions(-) diff --git a/contracts/dao/cwd-core/src/contract.rs b/contracts/dao/cwd-core/src/contract.rs index d4fc1893..507f7fa1 100644 --- a/contracts/dao/cwd-core/src/contract.rs +++ b/contracts/dao/cwd-core/src/contract.rs @@ -330,6 +330,9 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { QueryMsg::ListSubDaos { start_after, limit } => { query_list_sub_daos(deps, start_after, limit) } + QueryMsg::GetSubDao { address } => { + query_sub_dao(deps, address) + } QueryMsg::DaoURI {} => query_dao_uri(deps), } } @@ -514,6 +517,21 @@ pub fn query_list_sub_daos( to_binary(&subdaos) } +pub fn query_sub_dao( + deps: Deps, + address: String, +) -> StdResult { + let addr = deps.api.addr_validate(&address)?; + let item = SUBDAO_LIST.may_load(deps.storage, &addr)?; + match item { + None => Err(StdError::generic_err("SubDao not found")), + Some(charter) => to_binary(&SubDao { + addr: address, + charter, + }) + } +} + pub fn query_dao_uri(deps: Deps) -> StdResult { let config = CONFIG.load(deps.storage)?; to_binary(&config.dao_uri) diff --git a/contracts/dao/cwd-core/src/msg.rs b/contracts/dao/cwd-core/src/msg.rs index 7cbfefe9..c8a34193 100644 --- a/contracts/dao/cwd-core/src/msg.rs +++ b/contracts/dao/cwd-core/src/msg.rs @@ -126,6 +126,8 @@ pub enum QueryMsg { start_after: Option, limit: Option, }, + /// Returns the SubDAO for a specific address if it in the list + GetSubDao { address: String }, /// Implements the DAO Star standard: https://daostar.one/EIP DaoURI {}, } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 51ce3418..71bcde12 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -33,8 +33,6 @@ use neutron_subdao_timelock_single::{msg as TimelockMsg, types as TimelockTypes} pub(crate) const CONTRACT_NAME: &str = "crates.io:cwd-pre-propose-single-overrule"; pub(crate) const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); -pub(crate) const SUBDAOS_QUERY_LIMIT: u32 = 10; - type PrePropose = PreProposeContract; #[cfg_attr(not(feature = "library"), entry_point)] @@ -219,39 +217,16 @@ fn get_timelock_from_subdao( fn is_subdao_legit(deps: &DepsMut, subdao_core: &Addr) -> Result { let main_dao = get_main_dao_address(deps)?; - let mut start_after: Option = None; - - // unfortunately, there is no way to get the total subdao number so we do infinite loop here - loop { - let subdao_list: Vec = deps.querier.query_wasm_smart( - main_dao.clone(), - &MainDaoQueryMsg::ListSubDaos { - start_after: match start_after.clone() { - None => None, - Some(a) => Some(a.addr), - }, - limit: Some(SUBDAOS_QUERY_LIMIT), - }, - )?; - - let results_number = subdao_list.len(); - - if subdao_list.is_empty() { - return Ok(false); - } - - start_after = Some(subdao_list.last().unwrap().clone()); - - if subdao_list - .into_iter() - .any(|subdao| subdao.addr == *subdao_core) - { - return Ok(true); - }; + let subdao: StdResult = deps.querier.query_wasm_smart( + main_dao.clone(), + &MainDaoQueryMsg::GetSubDao { + address: subdao_core.to_string(), + }, + ); - if results_number < SUBDAOS_QUERY_LIMIT as usize { - return Ok(false); - } + match subdao { + Ok(subdao) => Ok(subdao.addr == *subdao_core), + Err(_) => Err(PreProposeOverruleError::ForbiddenSubdao {}) } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 4585c28c..5b8e4585 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::marker::PhantomData; use cosmwasm_std::{ @@ -93,19 +93,23 @@ pub trait ContractQuerier { } pub struct MockDaoQueries { - sub_dao_list_pages: HashMap, Vec>, + sub_dao_set: HashSet, } impl ContractQuerier for MockDaoQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); match q { - MainDaoQueryMsg::ListSubDaos { - start_after, - limit: _, - } => SystemResult::Ok(ContractResult::from(to_binary( - &self.sub_dao_list_pages.get(&start_after).unwrap(), - ))), + MainDaoQueryMsg::GetSubDao { + address, + } => + match self.sub_dao_set.contains(&address) { + true => SystemResult::Ok(ContractResult::from(to_binary(&SubDao { + addr: address.clone(), + charter: None, + }))), + false => SystemResult::Err(SystemError::Unknown {}) + }, _ => SystemResult::Err(SystemError::Unknown {}), } } @@ -243,13 +247,9 @@ pub fn get_properly_initialized_dao() -> HashMap HashMap HashMap> { - let mut contracts: HashMap> = get_properly_initialized_dao(); - // subdao becomes impostor if it is not in the dao's list, so let's just make it empty - contracts.remove(&MOCK_DAO_CORE.to_string()); - contracts.insert( - MOCK_DAO_CORE.to_string(), - Box::new(MockDaoQueries { - sub_dao_list_pages: HashMap::from([ - ( - None, - (0..crate::contract::SUBDAOS_QUERY_LIMIT) - .map(|_| SubDao { - addr: "bla_bla".to_string(), - charter: None, - }) - .collect::>(), - ), - ( - Some("bla_bla".to_string()), - vec![SubDao { - addr: MOCK_SUBDAO_CORE.to_string(), - charter: None, - }], - ), - ]), - }), - ); - contracts -} diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs index e578ae65..e6c19bdf 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/tests.rs @@ -15,7 +15,7 @@ use neutron_dao_pre_propose_overrule::msg::{ use crate::error::PreProposeOverruleError; use crate::testing::mock_querier::{ - get_dao_with_impostor_subdao, get_dao_with_impostor_timelock, get_dao_with_many_subdaos, + get_dao_with_impostor_subdao, get_dao_with_impostor_timelock, get_properly_initialized_dao, ContractQuerier, MOCK_DAO_PROPOSE_MODULE, MOCK_IMPOSTOR_TIMELOCK_CONTRACT, MOCK_SUBDAO_CORE, NON_TIMELOCKED_PROPOSAL_ID, PROPOSALS_COUNT, SUBDAO_NAME, TIMELOCKED_PROPOSAL_ID, @@ -239,29 +239,6 @@ fn test_proposal_is_not_timelocked() { assert_eq!(res, Err(PreProposeOverruleError::ProposalWrongState {})); } -#[test] -fn test_long_subdao_list() { - // test where we check if out pagination handling works properly - let contracts: HashMap> = get_dao_with_many_subdaos(); - let mut deps = mock_dependencies(contracts); - init_base_contract(deps.as_mut()); - const PROPOSAL_ID: u64 = TIMELOCKED_PROPOSAL_ID; - const PROPOSER_ADDR: &str = "whatever"; - let msg = ExecuteMsg::Propose { - msg: ProposeMessage::ProposeOverrule { - timelock_contract: MOCK_TIMELOCK_CONTRACT.to_string(), - proposal_id: PROPOSAL_ID, - }, - }; - let res = execute( - deps.as_mut(), - mock_env(), - mock_info(PROPOSER_ADDR, &[]), - msg, - ); - assert!(res.is_ok()); -} - #[test] fn test_double_creation() { let contracts: HashMap> = get_properly_initialized_dao(); diff --git a/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs b/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs index 4090a6f5..ec435154 100644 --- a/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs +++ b/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs @@ -1,9 +1,4 @@ -use cosmwasm_std::{ - coins, - testing::{mock_dependencies, mock_env}, - to_binary, Addr, Attribute, BankMsg, ContractInfoResponse, CosmosMsg, Decimal, Empty, Reply, - StdError, SubMsgResult, Uint128, WasmMsg, WasmQuery, -}; +use cosmwasm_std::{coins, testing::{mock_dependencies, mock_env}, to_binary, Addr, Attribute, BankMsg, ContractInfoResponse, CosmosMsg, Decimal, Empty, Reply, StdError, SubMsgResult, Uint128, WasmMsg, WasmQuery, StdResult}; use cosmwasm_std::{Api, Storage}; use cw2::ContractVersion; use cw20::Cw20Coin; @@ -23,6 +18,11 @@ use cwd_voting::{ voting::{Vote, Votes}, }; use neutron_bindings::bindings::msg::NeutronMsg; +use cwd_core::msg::{ + QueryMsg as DaoQueryMsg, + ExecuteMsg as DaoExecuteMsg, +}; +use cwd_core::query::SubDao; use crate::testing::execute::{execute_proposal, execute_proposal_should_fail}; use crate::{ @@ -1358,6 +1358,41 @@ fn test_pre_propose_admin_is_dao() { assert_eq!(info.admin, Some(core_addr.into_string())); } +#[test] +fn test_subdao_queries() { + let mut app = custom_app::(no_init); + let instantiate = get_proposal_module_instantiate(&mut app); + let core_addr = instantiate_with_native_bonded_balances_governance(&mut app, instantiate, None); + + let subdao_addr = Addr::unchecked("subdao"); + let res: StdResult = app.wrap() + .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::GetSubDao { address: subdao_addr.to_string() }); + assert!(res.is_err()); + let res: Vec = app.wrap() + .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::ListSubDaos { start_after: None, limit: None }).unwrap(); + assert_eq!(res.len(), 0); + + let res = app.execute_contract( + core_addr.clone(), + core_addr.clone(), + &DaoExecuteMsg::UpdateSubDaos { + to_add: vec![SubDao { + addr: subdao_addr.to_string(), + charter: None, + }], + to_remove: vec![], + }, + &[], + ); + assert!(res.is_ok()); + let res: StdResult = app.wrap() + .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::GetSubDao { address: subdao_addr.to_string() }); + assert!(res.is_ok()); + let res: Vec = app.wrap() + .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::ListSubDaos { start_after: None, limit: None }).unwrap(); + assert_eq!(res.len(), 1); +} + // TODO: test pre-propose module that fails on new proposal hook (ugh). // - What happens if you have proposals that can not be executed but From d3b01604699b9a5199357f99f6dbbfbe14a06966 Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 13 Apr 2023 19:34:50 +0300 Subject: [PATCH 52/53] post-review fmt --- contracts/dao/cwd-core/src/contract.rs | 11 ++-- .../src/contract.rs | 2 +- .../src/testing/mock_querier.rs | 12 ++--- .../src/testing/tests.rs | 7 ++- .../cwd-proposal-single/src/testing/tests.rs | 54 ++++++++++++++----- 5 files changed, 50 insertions(+), 36 deletions(-) diff --git a/contracts/dao/cwd-core/src/contract.rs b/contracts/dao/cwd-core/src/contract.rs index 507f7fa1..72954cd6 100644 --- a/contracts/dao/cwd-core/src/contract.rs +++ b/contracts/dao/cwd-core/src/contract.rs @@ -330,9 +330,7 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult { QueryMsg::ListSubDaos { start_after, limit } => { query_list_sub_daos(deps, start_after, limit) } - QueryMsg::GetSubDao { address } => { - query_sub_dao(deps, address) - } + QueryMsg::GetSubDao { address } => query_sub_dao(deps, address), QueryMsg::DaoURI {} => query_dao_uri(deps), } } @@ -517,10 +515,7 @@ pub fn query_list_sub_daos( to_binary(&subdaos) } -pub fn query_sub_dao( - deps: Deps, - address: String, -) -> StdResult { +pub fn query_sub_dao(deps: Deps, address: String) -> StdResult { let addr = deps.api.addr_validate(&address)?; let item = SUBDAO_LIST.may_load(deps.storage, &addr)?; match item { @@ -528,7 +523,7 @@ pub fn query_sub_dao( Some(charter) => to_binary(&SubDao { addr: address, charter, - }) + }), } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index 71bcde12..b384bdee 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -226,7 +226,7 @@ fn is_subdao_legit(deps: &DepsMut, subdao_core: &Addr) -> Result Ok(subdao.addr == *subdao_core), - Err(_) => Err(PreProposeOverruleError::ForbiddenSubdao {}) + Err(_) => Err(PreProposeOverruleError::ForbiddenSubdao {}), } } diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs index 5b8e4585..2557e60d 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/testing/mock_querier.rs @@ -100,15 +100,12 @@ impl ContractQuerier for MockDaoQueries { fn query(&self, msg: &Binary) -> QuerierResult { let q: MainDaoQueryMsg = from_binary(msg).unwrap(); match q { - MainDaoQueryMsg::GetSubDao { - address, - } => - match self.sub_dao_set.contains(&address) { + MainDaoQueryMsg::GetSubDao { address } => match self.sub_dao_set.contains(&address) { true => SystemResult::Ok(ContractResult::from(to_binary(&SubDao { addr: address.clone(), charter: None, }))), - false => SystemResult::Err(SystemError::Unknown {}) + false => SystemResult::Err(SystemError::Unknown {}), }, _ => SystemResult::Err(SystemError::Unknown {}), } @@ -247,9 +244,7 @@ pub fn get_properly_initialized_dao() -> HashMap HashMap = app.wrap() - .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::GetSubDao { address: subdao_addr.to_string() }); + let res: StdResult = app.wrap().query_wasm_smart( + core_addr.clone(), + &DaoQueryMsg::GetSubDao { + address: subdao_addr.to_string(), + }, + ); assert!(res.is_err()); - let res: Vec = app.wrap() - .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::ListSubDaos { start_after: None, limit: None }).unwrap(); + let res: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &DaoQueryMsg::ListSubDaos { + start_after: None, + limit: None, + }, + ) + .unwrap(); assert_eq!(res.len(), 0); let res = app.execute_contract( @@ -1385,11 +1399,23 @@ fn test_subdao_queries() { &[], ); assert!(res.is_ok()); - let res: StdResult = app.wrap() - .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::GetSubDao { address: subdao_addr.to_string() }); + let res: StdResult = app.wrap().query_wasm_smart( + core_addr.clone(), + &DaoQueryMsg::GetSubDao { + address: subdao_addr.to_string(), + }, + ); assert!(res.is_ok()); - let res: Vec = app.wrap() - .query_wasm_smart(core_addr.clone(), &DaoQueryMsg::ListSubDaos { start_after: None, limit: None }).unwrap(); + let res: Vec = app + .wrap() + .query_wasm_smart( + core_addr.clone(), + &DaoQueryMsg::ListSubDaos { + start_after: None, + limit: None, + }, + ) + .unwrap(); assert_eq!(res.len(), 1); } From 03421cc2f102c092bab229e614e3e29fc063847d Mon Sep 17 00:00:00 2001 From: oldremez <83083413+oldremez@users.noreply.github.com> Date: Thu, 13 Apr 2023 19:39:48 +0300 Subject: [PATCH 53/53] post-review clippy --- .../pre-propose/cwd-pre-propose-single-overrule/src/contract.rs | 2 +- contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs index b384bdee..842710ed 100644 --- a/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs +++ b/contracts/dao/pre-propose/cwd-pre-propose-single-overrule/src/contract.rs @@ -218,7 +218,7 @@ fn is_subdao_legit(deps: &DepsMut, subdao_core: &Addr) -> Result = deps.querier.query_wasm_smart( - main_dao.clone(), + main_dao, &MainDaoQueryMsg::GetSubDao { address: subdao_core.to_string(), }, diff --git a/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs b/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs index 625f6815..c2ede878 100644 --- a/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs +++ b/contracts/dao/proposal/cwd-proposal-single/src/testing/tests.rs @@ -1409,7 +1409,7 @@ fn test_subdao_queries() { let res: Vec = app .wrap() .query_wasm_smart( - core_addr.clone(), + core_addr, &DaoQueryMsg::ListSubDaos { start_after: None, limit: None,

_~KWhd&4nw29C#lBx5D`8)x4s7HTCA2Gy6&ttdsnmnvdh>zEu$zp z15h6?7zSNxqWTU;O`L|bF>!W`I5QC^t#RVyf*Rm7Y7qDO))lt1#QMyFGaHS9 zmrkT~BATYc82|2NfvwQdYy@vHn^zVlC2Ljk$HOGj_k6lG26is@j;GQn*QqLC-54o@ zXt~&v#sQ0k90q&mvmxi9NZaAusz9^Fz{NUmx@MGf913m?yoF)2;Ap3#=$ufvAv~Gp zvL2J@GVyefMduhiN>a&LqHUIv#EI;kP%MJVoS<0GhA)X7`A87{y#sx1N0bL6QXa7- z|A;jmz+ss(oTOMkxwN!`fuSnBM^bezBhv?<@A8a?AVia%L6IZ+W5Zy+PJq`RzMoS z?FC86A0nKD(I<-0T%?rIn#FJd%h}?)9jBtsVkL}<68uH6bNi-INBzJqylRaJl1OsH zsaVdiR>NitHX17ap-87v+NKvrvwSz2R#%I7VGvAFXE@=lzmv#@I~PZ`nm4VrM}`x^ z-9DsPSLB8>NqL&B$V6GyET7}Cy0{b7hs`{68U(#0VlpT{=BP#K91gH?v&O!kEYd;A z(5kR9FdtV(GrXn--_8<|An^s3XE@=NjY*mx|Mh zBpEU?5B`{Il%{%vG=++dbskfEgh`T=E{ItDLpSIN|2UPjXdB7Ap|!|@nekq&YVE`g zgBC=RN1!C0P~ih+b6X@Z6J3tDFXm}7YF3%_2}Gi}ohB6;IO6UuEX)B9JDggB2h-{z z0%pHAN+?zcZ6b|sOphpz%B66{}m!YIX5#Rj5l02ttTqf{GZj(=124St6N^fw?;pVD)w>NFVAtY%oI z!C?JNF|sjM#j1lrGkdXTr)gu#QAcdzM;uqmm+QSSc6tx`mHI7yqRGPtn>kF=YD(Y+ z88?-}2{KMf;j_uz1PQ$OPH-HaxmaC$=E3?DnvZEZ%KEe(qzmam*E;2t9!|s*UF&T7 zeusyXF-6xp+igl&;zyp^dna;*9Alpgd(DNpO+$@rjaopMSKCt`}Ob+&!K%frc-qHCS)Hl-}_qoQ@K zv)!SG{V_$?I@?`(xIL!mT4%dk4|m2CUF&T3>ES?3(Y4O@fFACRDZ19#9@4|Xn4)W) z?XVsmj48U-*^cPpP)yOa&i1Gt9*HTs*4ZA{!_k4E5tJ zytpes6+dQntbee-|6}T&q-kl-wMho1PVRE>3EH0opth-FH#6~vNwuNbs$dw}9~ZK$ z$R0Gn`YHp~=_DhpH%i8~t&D5dL0C`;$XX*vDg%?JhGZ-TA1yRHiWO2xF`vXwRoMKm z0k2C1>%j@Bz-%)09a4cE91`~?kqqalA2jPs`I3ZemR_s>_A;m*`KX&tz_*wY=4%va zzHC#Ws2sE;%Y6Rov(|`$=B#yf6sQ+9c~}mKNx#0jAn7Ay{Gj!T=HJCwA#2VcrH~bS zM#T#A2GeR&$a3?25OQR+<|4ZWSkXnmYBx$7+R_mjEvG9z%xGB%qAusxOFQQjI%@+eA6jicx^1f`WS%ecF)G*xCL^n+{% ziUPnTQ|X&)6O^r43FUa};4Fhh7<=e79K~)u&0J7~Yq}=QWDq_sIjJ9N)kL1MOiMFb zr_(m-)xf;|40as=Oi{!{O{O)s)@vufAOjvt?!UXRF^Q*;AV9ewfu4(|K>4XgQy}(v zQe+A&+!R>Ura*9|C5Ix~12v5OUxFBCWT4tJYO8;RIM7vKD?~XiW%NOhWyB6;1+z~y z2(8=Al4V=9^u0OuD^x;l92~J6s9s=ZNfl(EcT$Pk>7ccO5nZT0HL{6&sv`Ah@rtyK zU=amR9R^;QoPbR|DziTA|EGNBCY#lyK5wc^j5eQJb|4UlgDPnk7ae^qf&(gif<<%e zr(y;mXC%=PbYkW3;+c!>XNQ{u`nPqBn6YKUgxxwRmYF+NPs=jFruNU!gcU4P;AqA$ zW|?#vWs6LlW$NRv9m_1{sV6c`uM##Ci6qW)paQ5PZ!#29r`0cR<4EeXob4hFpOJAk z@-1ha%0{kxHl2Kp@`@_3A9Lf83&>g(Dy;YQfO|XAL`WNk0?Sb0F-vooMa7B<+PS_*i>zt)Yz=& z`VG;-IQ8*v{H7sV;03+@YqD?1Y*!Aeafe{RTQjY8*m+Y%hPhUUks0Ce0jb9L{raK8 zR_0|CowL{`rlLFdT@^irr^uept}?IH$8ukTXQeN@B%@azjSOGw+Ff{OxXY0s!_*@& zP1hj2v5pmv`b#=Xcesrnve9!SzAl39f}pnVO-N~Iy8EM;)!H`H1GBKTUC?zAU7+YS znJpN~Wq{jssu?xdnm_!~J$KQq-{m-vY84*k!CH7*k=#|?zW_v-ZNX|1GO1ZI0S3fU zhxKnki8!xn^-gQmgdnlw4agzWQVD4Q5kt1I+*w+R;=gRDmpcjaa?;!bI>cO33QOIHu1RG`5 zVr<%(O{9wPw!)9>>dP>`HEV?eGvMAjA>Y;S#{^d9`rpXCf1%Z@-JysEHc*h>>rMZ~ z%7?M^G|4lKWb;}gZ?e@9c~-QIYmmmOfV+_eE+hFBdAe54&c0t4?Fuo*>tg>xxuVg) z!AMGJPCxj%a6h(hhDEsX?OwxyI!rj(*?*=iI)08?#J%JNh_#`O!llQd_3Xy*j`xZW z(hPImLhoN&Is?LcjZW1*5fg>#*|x1tn)-+q340iJ5D4=qA&_jY>4x03TXYB)HZO}f z^-i_hETPL%w!93W4OuX`=rgg2jp64U5N!-4zXQU8wZ5~kb>p0GQBELh=5+si%R`x0 zWf#z*%Xfwo_loUgJji*DodNbB6T5^EY?7E`EE8XfrfQdg+}^8lYgS#AU8y_pDV;vA zrmiTraOqu9R$RnkUQ%qs{H}wa!wCjBaIVc*KGA^L7T)YIa({WmsX5VL*=}T(HzuRd z5#17^{dj0mx*Vp^kMR^hk02X(Wne-HhD~bQ7!EqdxZmt`s5JAvyuYZukZAkht+oR_ zAKc+P(RuSf@VcPumgGRf*pwt6W+h!E-S-)G)olw`00myPExc+sVYij$HG zFYvX(oUcYu5aTG^>~R=)8k~?!$-@yxgB44jKpBgJ{n}i?la36079c(bY+rLI`Y>O1 zf~W_F4gWm)Zew`Q|AN-E6{10vLV-d^Gmt8de5-{TGDI9M3%{(7q#jtjo!faL$_trG zWIZ{;2U4MjJ?SFVP6tb4W#FK3T%;i>zY_s9%ITgsatx@SiNw_eO2!OJe7jS{1jK^H ze5m9Um|ffdlQDfP_fjk7X{_%{q>*Y5kCWRIHJny>i=EaJOat9!pVDg1&4W$;Fpaua zI>%{sr;*_~c((P2AUXlY_3Oz`?Fd}OKx+7@UBrN(#fM#wWz3!A#U=!C)}ODvJ9FI=OwRo-b#la}f}!3DS>J6HFo+Bw7JQ^BOk+m{gZz^=una z)xcNFffjD92b-{(#G!4b%F8%xI=eY%mP`}qM8qh&N8(;rddl|`+6lVqQl%Slxkf}C zItRUfyv%#ifwKjH$$BWB3wzb2UCi^!I0Pzhxd%l-ObzWf`7@)wB4^6b-9tqbFnBXg8q5+)cA_b%oHvO{=H4Q;a2>?!#(1sbbxXW%i`OgdTJDVh*{p0{ z@(&9Fu8AOt!d|+lfWoNM%;Jhv7se;i1y0Y*l_bME!l)07YDx-FiHR?lQIzl=$a%C3 zE({}f^Uxy*VYyMU#fK`$K)xc_-a8PWjhyV#lL9q~|Bw$EC!*g>9S{wCl1?^<;YQl1 zMRjgWm@Ia3W5U#m6DEaj#=FOOkS2xjAk*C9>^B^NYlLqn6C6Y%INW(RY~+n))_+Z$ zC4v0dWEBtYakHbla%(z0ZNnU8O$~BiLfUMk4%(m&Zvq!J0is7+@CNG}5!`=phBuyH zgh$>3ASqy;%{Ib)dWF{HviL5Z>ezQP62_#w&$Hy=!8)}ODs2sv4Dc6~^B8Wj{vnA@ zw3g(AEcK1arNC8iP;iXJIoxe}rwV_JGHD540H+wU$ruQJhDL)9*$u)shvV-8Fa@j9 zSYSU#BkAcn$N1%U|cQmLmFf13iEGHLu^fv<;d4^wt!|ZkO79qkODhu zG)iA@Q7o77+IdY&tPj%VCf4Dy=%xdYAz_54TmT4U;qKLP{g8LtHdj6AarJO1%xMT9 zwba+#U6$_Ls#J!f_ZTWkBF7~fCJ>_w1SlM?%L^%36;~$qg$cFS)wR`=P|atoHrsD) zwKew*m<_84circ;6<(XnFJ7DORLvHO;p57BG#nxO^Q-WwbF1)Fs_^q2iy7c!t(X@j z^wO^`+;Y+r6BT%zv@r)NJ`@IFd?@P&O}jxa&FZkZz$KJ|xo4B5SvDr4v|fU&ZK?stPlA_tEO^VN z0C#~w&)j*WcueIro6Iw7QJkibDI5=a2OpC3!^ma-*{h&4f|)uZ;ZdovGqY4|9A?El zK#>KGVQ2)wS|?<>4ZN70Sa$*q)air+qAQUxd1TE%*K|FArm_keWLHo1O_pSJRGsZ} zIvlam#)Q>}ME|;4)pkW0D{Ew5&hF8R-BxPcZL@PXDXvmBjk`Tx?sV|}bK*{i$Zp)} zp9nQlUs)kx_Hf^CyZ1JjzcbzrzEBWWyvqK0LDs>$%KigU;>lQm+NKd=qr}7nWNgf( z2$j74>#uM)&_+?D$1nr^1sy0|Hrf`_w7xXsLOEevz@`8+vM;!XRht&XsKy2b%4!%C zs7{l`(^MBt882jQre!TfJ4Xg6Zt=i-O?Hhc>o2wQY3T_`%!Nzhk~W<2stjSZfa@r} z(q?~>IFi)j5+k_{B9d+9toU$@dEXhLz)Ggl4(&1+$_`Vj$WoBI#;cPm-4-`wMr2|g zdguOVTeV%~OI?))2tO$KB+-(WVNx`!MiLv!8;j zvWTU&;|3^THU(o>yBmm^H=03<32(Mlb#9G5aHGt%DrY|O?1gldO}lFa^teQ8<+#Kw zme?7W$gNYHN>t1=6{W$BWAVlcJ2~lmg=LJJh-AJNhS3)twc0?#!iz`eQHyXCrircX zeprLyOxR=^L`fmTQQmwv)SGbdx-TJ$)Gk}AfC6`8I<6H}AVdWeV;p?BpyQ%>NCHGs zzZtT|Ss3r!TEJ-n_c*UXZvtp00@m?NOjVZT9fMy)Ut)${IQkbS-}IB8{KYSRF6)21 zZDwey)g%VknXo}eVgv-p>;ePEM)m_>RP538Xf7`2W2b7q4mm&;8~22b{~2d-n*uR0 zK_Kp87IqU6y>d!N9I=Ne^&*%sb>(|65cS7zBn%YMZT1mKI6NQ;>50m3w?%tS4Rlw{rjrv zeHIeQOde7I;#>>ru{mf3sUX1nZ!HUA*WSqZ!dj*kyWF%oB&%lfT-tQF#{EcK0(IOM zK6uy|Z2jV`m}#r2O`!jhC%1E=ZAJo?U_%{3rbIY(S0cPgvPUedxZe_6A zZj(J&THcBZGLKAXt0nE`YKes!XvftO;;@OGp?$~I60SY^hl`F$=lxb+E#VHHBo0Wt zHd(>i)wEViqzp3lC}kT=kv0u(DZ!Cm#9xuejDnyxbxqKC^EGqI!$*3$%CcDL}~45e+456}+B45g5b zq4aVif^9Zw7CGqDfh!|nh%CJ0O+o!=JD>gTf}`yO1C@BFy6{`6AJbvK zsGInIuF*)$Xf~j^M$r@~AhE*?vgV#h192i|DJFs1m}aD7@tV!hd~WKb3>hd_J2sgL zTbA>5kH=J=zJ?u^rDO#%U*QbIb!cTnFZcNwS_7 zHIbuA_RxWsCjR6-rU|GpxYKNzDo1wHejzk>w46vH`y02532v8X14F?CEsc{t1m9v% zR-NlXbO&(KtoP+KUF!%{NA+{Tc?>YSTC(E||V%4~)qZ$zePBTn<0nbpue>sI0BP;?7pzPi>T#O0W zG^)_R%r2`jMjD-i8G(zeZ(MpqdpR@ILfr|faMs4BiM1u722=vt@tcR61u-tHOIR;1 z%a#fgoGdCngN|`o_Dr6hziQ84t)IV=_tB9owiK0PEs|0Tcv6#DdKs8Clil-fDwOwM zo${Gqc^DNgvT4N=5JU)Tk$RViwqy~}t6UTt>XQ}8l?6Uler#oo z|7M1w&R|xi9=hFRhH`lZfSD*kv@fOrp{j~bX!AlusdWNTl~iJ3MoUm!gaHJbpmsoB zJ`0^%LMs|>twlMh42|qMedZP{4KfAZgG+}WP@wX*ENZRYFfr+VyhZcFU>e-f(=A}| z1;yagrxt@xQdBYctY_Qf@O#u@wmQqco0{FkB9n~>mO?3E35tQbWH{7PF}LX7dRRiy z??b?dH8;?LaajLljQqoBq>vP8;VEtHm|n3E!=&t-Ce@nEA37;-Rt;t+s<%`0!;?-xEziI zpWvW6fvOgm1-@M1SRz4m?BKIOCsb{bY{Rj85V_wRZWolcVgZx@ zmK&6BK!1?>EAAyNSY#^t(<2NiuW}iLO(BA`5Zz`ylByKW-K$}Q2w+fI1#)Zng^nrZ zg)McM5rWC%2F0w*7M^+LmaqQ8pFXknd;RI*kA3UEVHS>)lI&F67;{#~GJX(B*hE2h z#_VRFeYP|j-{1J7qu#>tY-u#bFX2Ses$Av;+n)*^8k*w5Tsxcwv9(rMCrN^%e(FVJ(Q@c&C27K}s+Rup zmiPVX`O3%~ag`c-m703vkKO}E32*-;`hRnHfJLrrYaj$x9I{Um6!;;AxpJPHqAVQJLwm2!kfAz74-|>#$ zIP$ie7P7%FNXF=F3=%&2#4mpQukQK1H+?Bf2}d)8@v5K9FIvLNPhjIfM4?;a^-5i( zYhPMcZ$Rpoue$#YEHdyo{{~*Sd8F^ybm$)UMOy*+L!I$ zr>-v+w%!Wd>-XG@`g-+$K^vxS?ifp~UQtv67|U(g;+ z6n748Es-^3-uFsGc^3W#*1Jut?KT!&7YFYZK%CVsG*Te-6sl*`s%rvrVRl7Du=(W` z0b_*kRaV!h8g=DfS5@4*ru-`K@6yo`V;7PhHu2=CNDg7IEK6aEnQX+ zVd;|X&YK~eU8Bw>nPD_>(t;HRS@G(S;ii+D1~ajOWd?#S^^w&jggG z?huZkgleSdCXMB;yijPn$-*@y;afXYTBrcDy$+!*fuZ^d2l~eCG&BM*Syxt|DqFANYv#MdT+&g1?TgQ0$!-2rns-LiB-cNl*VZfZRL~%v0exC;sa-eR zF>{4Srj`@N9+`R?$NkmQvbeu8*(*jMUgVl0G{2s;r)B^`amhyUbM`cj9=NRdHI_UX zJ+O~`k7k%>^1t;)VvBQk3>wKiSa!dLPm=QT+^~;L#P2)&OAiYzwiLnDB8aZB&dTTu znHT&2cM_SPTwfSQ|KGyr_btaKEq#GddO0Z7T4iNwu&q^sMNn*0dm$66s4g1)oaQ7w zqyJ177eC{md@I|U=I9tLumqr6wQPq9<3*a41;b<16FHutl^64s1)neVhLf8hBt;wB z=@JB9Ahuabg22XXL7Bd;B?z)+EHsLy1VJ3tDMLQN#syz7jSo{j5(L+bj8WYv&9X7L znVDgDDehm$ z0YZAJt<}33t|s%BlD9MLm7!fH3Ymt z1fxQs+PZsbaA)ssv+(Vb;^G#*(K2qECowROLT1~_3MrR9Q43uI4{#iCeB&)%$ zQ=B3X9-+*Xqnp7$Q1bztJ~GEG7Y)Z zH#&%Q{Edv?5dd0SMt#(V(TuPG(yT|-byTx+NQB+tEPtkPfX@z{$N-2=z%r=lNG?Bs zg9SK=f4EH{JD}vL9l#-*9pM8krysyUPCI}@7D7Ku!;F8}o6Y#ABK-i4*4P5bH)a8} zZ#W4os!S+B5J?{|v~8I831FZmPX4P}YrdhA$N!2}o|oyNd2KWFiN}gL9z#rP@H4hY zsWrH>lmV2rlifcEvkcwW-_KNOY3XRTZ#c&?2^<{#lhc!)MsH=MgD})wQ5rw1D_A5M zaZ%~yMsRDA1#(mFhvc}orU7o9p{oDJa8wbkE<(-YR<1^Ica9wu8bL1Em2 zQi6Xx%C;_f6Onl&?@`iOv%_21VIwaKMxss@B9PjZJpHXXF~ztA;ZKbYDUcdJ2;yO? z7u&*Fcq~^CqM z+8K>N7fv>wKG+UVrpHI}jK(YWN){?3EsDiyP`BKOtW*&JPV(EKgP~)3h#fA%b`4c`2$>ky&Sx=G_e&9|0>U0!X5vU%Yh<1@M~OurBHG| zlOhK3;305-tH^I`WBs-*vJxUFcNk%kNE?hgCIn!kIqVd=DsB`FjQ>dvW}|G)mR=tJ zJ1sx8bTL)Jpv%_Xh% zVvXuqb*HT?c-f#%+-?#yxSf5&7to2m5Vu2c_2qs0Z5g%6`_}f!Gqpk~)66UDzq6Hh z(XTMO*ycKJs7idOD#cgin=ehuedoH-cMktL`RErl(sjq=WV!Pi;X<`UX?8>II@>o% z8#;u^eTiX>%tL9k)8!{Kp`6%UN1kj5QAB9+WLsXGhw97o$i#ZY9}W)+Y`~o zpY0W{2lOVK*m}{4&EOQ2INO=zY1`sD=160ArC>=)C9iRX{4?v@e2L-r9kVkwO zG@khZ`OBHOA|ZcElWL-H?o-egK95>m5WcVlqKG4e@GowQ!rr!v-`L~kqP)jaI(m3q z1R(qhFAC&Wo}BQeKoNlu2*a}Yt#Bx=wuGU)onHc@m)|6 z5KHzg#ir(BA?ZFqLFJ+aSX+CAe0bOPy~9c-~=>UGJ&f zbC?vad*HO+FhRGn;TNwifP(32{E5ald|iNnZO&0ZbwEC#7JH$)xe*N;PMmX%T7bx<3j*~;N8(xf{&^D|D=Xbr;I^EnxO;mi z@7{WN_ZA!hKd9jxEgc{HO2=nW2kmhz6Rh|ikpS=!UO1#s?3kfYJ2(JrZgxu56XWJr zNHpiYT0!xeeXkb$O5Tye*GDG5LW14Md$mHzY?SwE!M`vmc`p^8AE`HRr-=7zu{hX~ zxB-J%!2JQEhhxz8EsNs)SNUm#=iT#g*TpWFLU;zkEZ2X1)DP87cPlP4F}qOf>-14}Gi1P{9K zhOMBjS`8a}94rz$n~YR4Q?4prl@=FA-1cinN?d|XkPHOFs@2?>48;`rITI+q;!7gf zPLSqGUpWFe@jVmw$=@@n(lNl|S4_%YI^tFRDLXsO3rA<(7e#Sk!@gu$e4-N0w=Y~3 zY262}KA12q2-Vkv$?NLTcMbSF)5eLVfoqo1edy-1?;7~gHyH1_YALR214B4GPIhMxPJa9b}M>K!13?&9W8Yxy4 zHYstLlNK!qGvsN zN3T37H6jPIk_}<0fba+@2{WcY19R7SDN^o2-UCjG{sDyJhMRUlj>P8@L)_IwDA!%t^jpoxd1R3wiT6?mYkxb6o zo*vAkM4f2L9E*;~+yrt>(cYPx8L`q?>oO~rx8fsaE@#E9qgJedR4fTlb}ErcM+ePB z(u!-^Ui9ZdzXuQp5MOHdAGgyW+I)=j9IyS=CGAMlF291Ls5H_ zBI_Hd?M3}>AwCQ7#$hXV*otqmFr`GEbBbH(Ov+4U3h8{-8Z4ya(UD9t5gW6s>=k)? zL{{25Vr4VwBxWxrWhO_>v7FYUOI$S}u0S6v5VOyH!&xggoJqzp&`c7ukH*+bUS$^_ zqL&vk*+NSGTdX`{Wn)%4Zw^_LPkV}aMc{T}%DgO-P2|VW?_TTj0x+`2#7y)15-BTF z$ZxX}L&KQhkwlJYPZv@HR<@WN7NvX4teM(4Y^I0oH8+#_L>|jy5rYza(_JPt$uf#6QtQyf6|sv9{&K zX=^lk*c!_*wyR*N5}7zN#2C#OQJRYmCX#@hwT2Qo#3uog{p80+EP|V&Wh{eP30RY( zkzLss%O7+yIN>QNisUdr0-k1(16?5$7S0OQ8BucA2oUMh^SVN*UOsnQX+E@2?Sf zRHX`rD(^=5T;R12jWOISfIveG-o|mn(6kFsXFlpQ7joHVthAYIjsfMFX1NQqW6im2 zta&JrA1(|u#WJbJ7AqF(Z0+fZ5A;~E?$);ESSFX^YBlEa@y3>>mZl!j#5yV%UQ;%w zU4=d_MjtmLurHO)l%@Zdo!*31%q9j3L?eiP6rIPh48WN{ZYCSeTHyB}`+T%mXfJFy zP$Ot;4r1=TjTl`f2Pi|CBXI}ZdY?S!mm;Q|u>i3jaX;FTp3g#>=YI`iH{wdflnX9F zIn!G+M*tKDy;a<~35XBc7g5f7BtBFaC}h*zog_3QV@b=*%7epZ#p2iy|D+ONJ9&#- zIR;?>)SO6z?9=%Ka_yX?IRG3;5k}Kqu>1P19oGfr9BL4AU%rKW&gp+6=A2$Z%zT@U zF`g{WRDn|qt2{}@aqOZZO@j#SIx42jvs)a)>5N!_=n*TA#k?E+5@#Pm%)OnpW0=GQ z&K^bVLjFUDIj%3Foa5>%3}7sY_>h^4CKEVX_gW*#vEAuhA%-2B6V#qLyg4dB>i$nE~*k+^H zVBjW0R^v#rkZTM#wX`+0i><~Zh5PI$=<5*rT7f|R3LIHLnvu^KIP(NcGq_(2NDOp*i=q7XwGikRS zum(X_0%Ea5J#3bnQ|v7vtrZ6f0u=p-QQM-NY9;bmp(H~|YoKA7PvLGbV`qcrARna6 zql8LzLyB6INlP+tKxIb3F=eKdAd1}pKa!mgQ`CV95J#yR*&W(ZcEl_I5A0nmb`;W~ zm_JrgEVX^$1Isg(8Vz6w!y#V)#5_Dbpz7NajusHxYNV zrOF9jAb9%?fKT~FojFA;3R=UVP70jN%%re!plXWjo2n!o*CD2?bRS@mo*zI=dFTnm zlz|)yq2gyT9t*jqL?#l6jm8@>9|WNaHx8INE8NuD6h=!8x?b-~AA=@+$5|;WKa9O6 zX;Bf6O7es$j*>%G1;tF9^Nyhx@uj$&-FsA_Nz=YoEwy1))hePeuKfUIxn~&x}IfBz2z|IBDa04Skzmx_@CFI7GLa0S7 zL@*6-8|aE-MuM|WQPm~mFtS!2r?(Y1%(RrKj6xbxjW8x8$C|T{MPtqF13fKfr)74v zc66IP?Oj$!Ppq?}wKW#+=ZFdM;uJBIHogibQy9<{}ZfwLnQF zkV#24RK;S~lmT=OM8OopP^e#9)_|vP8B8(zNCanOByzxtt>G|aHL=$tk-oyfCNs14 zG{f6mCt$c;;+M(-evNJOIBOm4JKU}>|OTW>X1B z`mjC>CafgD^}jwxN@^2`X+=t;g}P}Zt@IG|lLkYbvj#Nqxw7sO#MEA4=Y&}tB9VfI zyfrAJl}W)Xqz|Vd1!82de5CW}u>_>nZ`Z#ZF=YbPKTpBV_K0yS@@ctJ`TMa6I@^u9 zI-}9J&n|liG4bcD)6&{))FJOXDC2lk9jFdgwqO;KN&L*_7a^jZuMU)4Gxlk-L#As6 z9hAs;a_=-MiAabJsv+==gDz$HW7Qf6j-h`gt|lc2s#2 zApp;kixbv;2%O=?veAblM+;^C9g7UZODj2X~q_r zH2OdW<+x6u9kp?F{uok1HtJUx=}g{`jw~aS#h#I_E!2GsZAgF5A*P1DE0Z54a99GA z@}j+oGFoJJWw0o4J>l#WVlQ;tVkI-#WaJ?6CI-h0v$UEMls0!^jkW=>F3c2+6y#!K zz(Rf4^x@p$ilO(Mv8i{rQ9o=RDb8G&QdV$KQh`Dfwa$PQ2TW3`&43N*Ex{U#X$x}E z9zq?i?bLM?FdN0F_hZyQ8?oT1Q(Ky8Ora4SSU#=A*)}{wGdx4vvq1XqXMm=^<kB%n~1FX^I8G661EA}D!* z{H_6kJc;@IDX>zQ=v-6y`MMFals>v7v6Rlt2 zkPqrtXbaJXa#0UrT5Gl-<{Z^oe+BGIV28qY4-RR;#wyM>kwJ#mzY8}R`uQXnUbXdV0R}3zWYdU#fhEgD>$4KyEBGfC~~J z*c4M+DES5!N6upMO*H4+#1hGagN5hLp`4hai01kYsSQ z^Hz`JMo6&;f(-7LlyDw;;RM4GEJ%3E$$pd+UBZ(<1F&1b*iGBOsPGwsiQt|FRFVYj z6L2b(m!p_HC@_?I;_&g(tDhdq9T{>ig!C8j%q!Q4K6|#*bH0L@_?Sx1`3}k`*Qq*+ zA5lLMx(5{$l)rA*)0a!$x0z!X;+?oU1fLeQ?V@W-dte#0ok{*iZxyWg5Z)kVLY|g> zEhzx52TaP1eTX@hqN-*lM~2~_%qL=onTsV7#w3(75VokPX?egPJ*as&`)N|zpb{tn zdepMg9M8pV4F=|WNrTP39|D|pfb#}oC!Z!^10(T7TnLR=J{aNRfQF9Mb=TsV=QVi%*J(Y1Gp`rvKZ|R0*h<1J zmQ#B2=@i{ZFy^Q|Hqx~-4YPbPy%EpOa;90%`*=z>#5(a%;Vq+_Q5Ye?*`|%~(JlB> zun*X6&(xVf`;IUOz^-fWU!5eyMjLG})RfK2%++g&M|C=qA`T*4fWUnIakm)=#O+K3*1ZrxC=6*c zsqXt=qvM#0V*}%a0`r9@9ZV~3QEK}2D#@k(G?a#;E|JeQgA)}}a&Of))QEMy8RO!3 z%TKpkQC^Mwzd_9MsZO^CP{y65>L`=SsjPU<+x1^XOqz4z@gk(poTErPpuA(zA~qPr z0$@_kb!MZS>klyzT1{2@#j^A(NRtDr@}HNL|4UiH`M2BZlkddc%C_v_{w!L!v^ z??qqEx!;epbF2>`&AHN2OG1FG1QD%BB9N7E>01n496Rpla?rf_#`E*wvHVjg zRo;Y~TBJ2&zeBJRGN(ZwQ^dFz<#W+)zimQx-tzng%E=BMIjdE^3s6=U!^q_cs~+XtGpZip@{dvj|G)~w zAC_D2Z^oQI|M+|e;SxKX`C2MFRM}lp+$f`Inqu5d7$^JUekHb@X};^A($p-8Q+vKR z5aSS51(+fY&TW%c0M&*(h_t+K=ju&+BgO$<4woB?=!HpJIMjhwqfg$%i$rMp!9`W( z;hHHn7c|G5F$Obu%!E$>>rt#KuY92GQ73YWb`4Xxg9SYpdSbW6b{4#FB{}ICe9?DAXTFUZbh4%=gm#@j#%l9`>b+kcElOS;&Zj3%bn!yGvu%HCT zfT1{N)MV_-(87=Fta;H`C`ov!qCiOnCkpps8m!48UPg>z43d+|X2%SAB?z2%I-!Q8 zVOES;wZ=iq7{-9mIWU83OO}8O-Y516?+{ZhF*ZWdqp7_CZYNsx0g8$hl_I#MgUk0Hxai~K|=Z8Ue&2$GxU zGf*Z-J46Xhwd$%asLGL$LZKDM=Js?-9&oDmAd5^IE>&C+moS_e4mjHYX935;eufJv zGtC>J;(D&=Cu#R{o^+V)%VY$N3;mr$GHi~(lmaRs^6|fktwV>GK>305nr=dS@@a*W z02mATkV>Czr){>r&CCsN$z)U51iyC|+Aq+@Y6r}9HcYAU^V~36AwXm2f?t5xtRn3g zxN+NY>cIo%`mP$S*8zKN+4w03IOlVzo&J;47hk5yj)A=P;$0r>$`QP^!OaDnr{RO1 z-7R_jBN#8`Wb#V#PP;ZdUm#BM7FJe`QN9W7XcbrOsL8XPI=2KRfZnb`y=vsE;}_OA z9YaOQV6r_7A7Xgo6(JjDpXyQ)*hv%z{SGtY%|fMo0bZs@ zp2wRKM-tMxO+P`zxC!|@tCWlc6lwP&k8+QsJJ?T(Z)i{^Fjz%<2z7XNKZBU(udK^s zo-7PYnh^qo@l%u&AF7_Pb>W_HIzB0rR7PZf8|@=Ns53NSbr;1$fRk4e*?B$c)3a8@ zv30aqdI8EPlc+MfONERSDc;*S2UeBddWZpr zT(=El7h%<$Wk6$b?VS0P3H$7ov#>b!+kIR>*wR5xIp*>WCfsjk?ygLJ3zr2)P~1ku z{`_FK{kY9KYCmlPLi@m5m1&jzBY5mEh*+Z6t}l^kqYho#$l4=tg>+f_A*7x7Vhtz! zVU+g`C;Nu8xQ~eI3b;AZ8;{$RBNYd+R|nR}TN(+(^v-1vlOHH718xR)C}@eos+7)Q zGwZV`9dEJY)|1ysKqwho0_}u+R3v1v*LahJn@#%_#z1{#0x{{$xu%ojN#orbapMRE z8zBNuCZ+U@7h5Q97hmjv%ESvr4%4V=i9W*TNE%&-SnP8d=N2t63bZGMk+R~C*vM-Q+3Hg*4Hkf&61p=z}@5rk_o()efzhq#d8s|?r zqi(I_C-nmttT*vLUaAwKR>~Y{DmJ9_2}3(nRhmr=nwXO0b44!#VDqI70aJi$ z5}OGL2SuZ+Kc6D-&({!s83R^26~&?&i>fbW*zH@rP~LW>aE z?k%==MjeZ#sGFkLUePI9!Z{)+U`nXsIvF?=)Rp8UO+xGdKPQ3NV9#8ZgA5S28ZXOn z8}N0?a8rAevOPBA%>zM0!T@=qw??DL@v8|u;S#6L&0@|q zK-eHHH`vF6ymhJ7Y?SB1pJSX@xn?;~u?@9)^hMq6VFZpRvUEV0p*Iz#%a>NV^pVyKswy6GqIj_8>-6ZL>NW@$Q{EF@;^(G&&mx z614Z&BWcq1q0K6^QD+~m%?8pZkWUGv9JZ1UPqq}xQq@gQo7dV@ohb#gfncbja$=%tT6N9z8E4I$ zHCwitGk4zn1q&A~USf!qoUoU2q7jH;4Y{Hd6Ij#8>NOJ+=d4{P8~*kED@HEK6H__I zo9NmY4Zn~#x5>3eyGefwOP52P=^5O2ELcQytM+vY1jdI#ZW$sYL? zf_B8z=G4pTctcu@SG0yAwh!f$vG>~YrEN@s^20ZT=s6SfF!)sg>A%D)J)D{CbfX*g zD!^!;qK{%d^z#tvP*$gQN4Zp`w_xFT<3^>oBE8tI#~VPz)insjo1%?t@jQ+|I~B{1 zAzX*xtaClm#}VF%z&Z@?LU=dA2?S^U4R#ulpdSOV!k564z!<+*gty!=7npubtS}5- zwmO9Rcb_kBIvq#Md3rGqFJjYnV+d!kxMcOVA0;@s>%ml>I`afzbFJclZ6JQ_(XXyJ zxiZFRli~^k-v}(=^-LIt)|^B2%&3R@+;8Ul@eWuLG%7wtB{HLXCB1AzJO{8>A?99c zK+O4k6J}4!{!YBT2WfE=MH(wh%5Fs27Tl?&HJnyTTC6o&9T-)EqJ5Y65q@fspvldy zMXxB{k%GSpMzldOSVLOgg^$EhD@l9&)U^_}x)e{~gIDFI9h=sr1&%5_uZ{>0w)AmJ z1JH^l>VUWONgg9Hh8r+sLIX4v!O_KSLhJ&$;_d*`vLbRc?W1UmNP7e^dB7jA*CRgw z{`pt2Pp*fG-!F0{y?y}Ca<9n?1a)-{#(KMcFJd>!6`X!}VAS&^C<7^Jgr)Y{2l4zN zgxe7e{#_Yr2sI!wt~Rc&57jq>E*ACGp87EAU80DvczG2B+l&PQ(T0zP!{L^2Yq%}k z9_|QthP%Su;hvUoOG`^@OIu5OOGis*OIJ&GOHXUKwWYPSwXL!tIy*bNI=ef2y24#8U9DYhUF}^RU7cNBUEN(h-Qn(*?$++M z?)L7E?#}M6?(XiM9t^Pu-S+@=51RELi{ItMU2*saC6kR9D|wmRSZlQOXxbNm%LTy2 ztJpN$_r$5f(MRxn2g02QH17(V68t0}T4@}Xw8DE;q$*j$ZIQ!CB2GJLSuxQ5)%}u& z-axz*>61_|+B6G@Pp!W2AJf4f~@4nfwPbR!EY2N2;? z)@}j}+A2Pdm^?zkIAp`n|C9f;-uK-PLt2~bw14ihKM()3-e=kLwOJ?QIj>BF7dJIE zT_S8G_BvwImoNw}YCmxC`a$W<`7L7N>yW)ipGBIqLr)IR#sT>F)8yD(rg}cCkfs$b z1|2BK!&jFxtq939?9 zy}W6-LQFx8|8DfP959|l%rp6E#FVSb`{p^#zE8rP?Q_9P^5D9>)J#eR54upk%R3*> zod}xl_IiCjm){rg2d9S?R?MrMUsW@$s@hZIo-yOB;B0-4XRbcaJ>S1TU+7vg+ixQ?5^YJ`?y4*KfVQbG_xB2!8J9*o`-TJbdti8*jRG;s2Ocy<_KZ z-)w4Lcj%JnE5~ns?``k<)E6H9$`en1>mUC4r>{_KYjJ}s_C1z$F1?>Uwq_ikAClk*MD{WJ8!)A6JLAuiElpr%#Z$Q+lRmUk54}R z%=TTo4_^X~={P1UQO=w1R z>2)u9uG7hNe95 z@sk*C{C<$vUE$NG&GPQ@FYq7qyL_{&_INhB8{N8Ry05x2;#qWd)JSo?{yEj z=libvo%=%n?BLws%*vUSm-#}z`MwMNtGru64W3Gm?ry1Q@XYsBxW_+>qUM(K+~fBK z*0`(PYy91TRo?3+rq2yDPj7VBR@YXK-{iUO_IVYvPJF=I>|O15O`97W|Ju@g<@opK zS9-@MyyGuc{-3+tUBP3AW{y7;82`36G2~_&>6^q>$c`gi&Uq5$YXm)U? zXZ$_B&)i!%$J26;=h%;y`zyWP@lVto`;A{WR{BtSvuFHk?gj4ZD$S?khwbp=2!6jS z5D2&> z`jP&U_hr}5JU@5+(sGjncd*MWoAe){wGf3@SK8SlQ~y&o%5A_;NV?zna6%MUJC=nsS{X3pvCiQM<8 zAN(-bb?a^S`9rJM4km7SUnctKFJHT8;MZ?X+;L}9b6x%ZyY9Z{Z}0u&eV=>yk#G1a zDrYTTBO~@2Bs7;IU^ve}6jj{!5o$>2-S=-GgquxoP~mMedgBg`Q=>#okrkO`d5h z$3N{`=2_;c542b8+IXxhI6D-WyLxkvI~E9rXXA&?7I^jb-JTuZW>3f;^shJSJe9#t zcf>p2@2T|f+1}Mw)#h&sgpMuWyQ@C1a`yb?3un#=?m`Efs^(lZVQICY+kS}&{wtn zn14%Xk$da*F88!R$k*c!9qXJo{-9pnT6O)MgN2ImZ@gz`tm=64Eze!I^`5`GuE)R9 zbI7+mv?WyUJ?pv$F1B`fdi>MZlLl`8_rUS*uMB?tXUEza-P1jRV>jL4Iqa=+2mLkg z>)#s8uNnWhP%bbsYs>f@Gb;}U=Z(Mn*jD#DH&o9$zGun!%d5t}*XW+_aUEN~WO~G_ zAAf25jTJjRA&=|&>6><*GyeB$e7a}9cR{=B*t7;uyz)S3{PW$5sv0~&(7kW`j_ZGb zNmse^l^6Q4i>fO<-Iz>$VCk-7`zmL-y>5SSk-Ng{3x#|EaMkf|pB*~xJ0*j*88yCI zmNzAj{@kTC;->u$u;+RNl|G1Po@pw*7td=Ec!3p;N6RS>eH8gZCnzch&}$QMe5N^? z&j?*23W29ohPn%FD9B##F|^yf{n{mG-L1`-V=SpO`j@=caQCW}VWT1QiI*B&_w_d} z{%wDg_LkB4v5Ef9-{~)R>Y>`MWmPYCeP){3(>(W{p76q#xBlzm+MTao_VVuCnc6*f zJ#x<;?HTiY>$!W**M3yHS9|H@zVOTD{?EU1&w*!u{_+7sOCNk)pE#(E;POW!gc%q9 z)3;TGXVvHy7@fnB84z!!4q;Uz7eFw$PVK3IvLH$VkFYe_^SQ}2N5h;w-ax?RU+npSTkG<)2J~tAY_DDoNYe!rFDO<& m$D{dEeyxA}b@^?LMc7J|-&7ceUb+L}Y=jBun?KxJ^M3*PLG2I# literal 261200 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�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%0DM9WT-*og%N}-5&o0ha_L7s55-*GH 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 Z8V~f;UKLU0VDLu#=HWLMzpJlv{Xfpbj8Fgo delta 27052 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 DVk*8^ diff --git a/artifacts/cwd_subdao_core.wasm b/artifacts/cwd_subdao_core.wasm index 8fcb9cb9ddcf820fac0d521d5de9003414e6de5b..d7c40002a3cabf92eabe07c292b5da0e0017cc49 100644 GIT binary patch delta 18926 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 J$(s{g{||D?;I9Ax delta 18627 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 F{{wE31_uBD diff --git a/artifacts/cwd_subdao_pre_propose_single.wasm b/artifacts/cwd_subdao_pre_propose_single.wasm index 7e28e98812f18fe552c3292d666ad16372a1cb5b..67140c686a889adf5befbf7318e704f748e1ec17 100644 GIT binary patch delta 38800 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 KlnIKgQ2ztd%&^G- delta 37578 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%0AQ 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 Ay8r+H delta 107099 zcmb@v2Yi%O_CGxL&P-;K$t06X8p+HMNJ1*Tmj?+&rCAUW6;wnLq}dgjP!v%FUl3lh3>WkJk%tY}N&n zXJ6u4DSYQnoidy9R|)Uz$up;2;!+|sd-ALcrp}&x-s#gPUvU2H8Pi=i3IC*N(`KAW z1>X>9XHAa3y_r-Roi$ILJ_V(-;w>O;_7tj?oH+ITvdQRl#%!eKOr3uIr z7fzmi-qab>Pw(lv$v(}~Ha1@hmn8z%ii#6oeU_>V08L|lHmSSwbGTgA7ZKYc9+wZG)<&^OJSm|CyD=aM8WPLN=K0WnBG2ebPwcD`Q=WTIW{;&+? zh2531At=IbtDy;hDx0jGl;;aeE4|6dmPy$kP<8;>1;|#rFA)*@__Q4PgLwFyv{`~i z_HJN;m}mD)Um)7po720??}hzM`n7VA+YSYC?R&hB>iG>%2{!>iuh|c#1mYpbiN*5&H$O4sGxfT8vNA`IONaDe4R6Ce)hBHjSKS)wT_sY^zbx5=vM?Q*5dKp4ZUl7o9lPZ%qsJCNuCI5CuM zE_-5Dz8u(WUz}AIb6Y$@>LKbSR7>59bb3Kc+%oVNMa$??#=F!Nnl0}L9+|XKLRn_` z@mf)@wG@-Cbh)~twio?aEAVdUVlXwA;> z0R4kpgT8)f$J4jo`qZ|Su|clTS7^%uolwR((AxENKVBoRu}TE9lENI@dE2GHnsX_x10%YI{Fd~pcN-DK@pXvo{={pLvvj( zu_1S8zWsJyU59_7B>1U6lo`gd9Ecfnw%6*}WIam^6Nn6D+O_!w9!$(_-<03Zo|gZ0 z_LHbr<#P4F;!Gh9^~@rBR+|ZiuX7WUsNWqbw0E`X3MOmk7c4y?zRJKpKbIP2Sb)Sp z@W*d}>(RhJ-@wE{;hXyndlux-ehhxZnr;uS0GVUbhu_s@}b`1^PM`=3bp zP#`Q5Tu$>0^uRA67E{RjbAb$MrrjbPrronC>In-l?k|n7@q`Wtd-~|Q^nH|23Azvc zN7(B}S4gD4Hu`3r4*Ux$c=4Dq9S)#itt(`SSv0j;SC$nW8pKKsaSPi875z@wUykWr z7^d|Hq$7>QTsWNG2+H<{R@j4%8{z+Y6`>>)u_vBbWp6nyPekp%o)Ya}0QSB@rWa66 zv}So`TMMs4Ng0ZyXC)=>q3Qu7hD;**{Z`oBkMAac*5i+|F2LfR)jg^~w8N_CJ zLY&GeNZ*8&-roNB_(2j4bUdL`o@qO&kO+0KXP$7PQ^1U-iId))j^258vT7nvHH!ebuA2P1DsI=#es}P^tca7_e zzdOfOj#xTL73o8cLxm`?LvzQw1 zPp|4z-)=|sPcL3bEyS(CEL zdPw9CA@1a|a&@l6qeJLU^%>4Xb0E+X6lpQYyIslZ3X^bTOsT!JVS+p;?7a=un!Noq zY$UYnR9~UVy8z_f7-W5E66lR$lzt8D^_yF6j~Tn*1N8u zLC7gx6C8xs)|Z_+68MWd52nr~tBtg_nmhLs?bK)M+?|oFO4qx`%CE2lyXC5@*SqT} z?aB4-LOoyzX=+RDTJNr=oZwyVX}UG6R4-anSKQ_9L*2~lTBb94QpR^eeQ}q&N~}T`qPyK)sG)oBc25S?KKxoYzffIocXyJ@Z~wpHc*?5lJ+fOYm6XOc z?&fF_w2mTc2eAhdBh^@|q&Vt-;i5{pLqvs@N2*s50kj&k2p8452%wbaz*8aza4RB? zTur>{(^Jc7qM4^nq=^<0JUb9PFFUP2r9XLE7ctrX^0WzZpRh-qehFS)IDI@XwTa89 zz#|j;mYp4zwXQYkLBEv|@ucSm!a?doT5F࢒tnUhMXM*XBIRO5z86+zC1ctbYE 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